如何根据当前平台跳过xUnit中的特定测试

Rob*_*ton 33 xunit

  • 我有一个我在Windows上构建的程序集
  • 我想在Linux上运行单声道xUnit测试.

但是,我发现虽然可以运行400个这些测试(按顺序),但某些测试要么挂起xUnit运行器,要么完全降低它.

我不关心某些测试是否无法在Linux上运行,某些测试与DTC和一些我们不需要支持的非托管gumph有关.

然而,我真正想要的是对这些测试应用忽略,并且在构建输出中正确地标记了测试被忽略的事实.

这个问题可以归结为我想一些可能的解决方案

  • 如何通过控制台运行程序在xUnit中运行特定测试?(我没有找到这方面的文档,也许我只是看起来不够努力)
  • 是否有可能走另一条路说"这是一个集会,请忽略这些具体的测试"
  • 在这些测试中有一个属性已被建议更好的方法,正式记录这些测试是特定于平台的 - 这可能吗?

如果我可以避免修改原始代码太多太大,因为代码不是我的改变,并且应用大量的跨平台黑客可能不会太顺利.

ric*_*ver 36

XUnit v2.0现已推出.直接支持可跳过的测试.使用:

[Fact (Skip = "specific reason")]

  • 请注意,这也适用于参数化测试 `[Theory (Skip = "reason")]` (6认同)
  • 如果您出于同样的原因需要将skip应用于多个测试,那么没有什么可以阻止“Skip”字符串成为常量。DRY、更容易发现等。 (3认同)

Igo*_*aka 32

我会避免外化跳过测试(即如果可能的话,配置/命令文件).这有点违背使测试易于运行和值得信赖.当其他人开始参与时,在代码中忽略测试是最安全的方法.

我可以看到许多选项,这里有两个涉及修改现有代码.

选项1 - 最具侵入性的编译时平台检测

在VS解决方案中,定义另一个定义预编译器标志的配置MONOWIN(只是为了明确表示它是用于在Windows上编译以在Mono上使用的代码).

然后定义一个属性,该属性将在为Mono编译时忽略测试:

public class IgnoreOnMonoFactAttribute : FactAttribute {
#if MONOWIN
    public IgnoreOnMonoFactAttribute() {
        Skip = "Ignored on Mono";
    }
#endif
}
Run Code Online (Sandbox Code Playgroud)

实际上很难找到这种方法的任何优点,因为它涉及使用原始解决方案进行模拟,并增加了需要支持的另一种限制.

选项2 - 有点干扰 - 运行时平台检测

以下是与option1类似的解决方案,但不需要单独的配置:

public class IgnoreOnMonoFactAttribute : FactAttribute {

    public IgnoreOnMonoFactAttribute() {
        if(IsRunningOnMono()) {
            Skip = "Ignored on Mono";
        }
    }
    /// <summary>
    /// Determine if runtime is Mono.
    /// Taken from http://stackoverflow.com/questions/721161
    /// </summary>
    /// <returns>True if being executed in Mono, false otherwise.</returns>
    public static bool IsRunningOnMono() {
        return Type.GetType("Mono.Runtime") != null;
    }
}
Run Code Online (Sandbox Code Playgroud)

注1

如果使用[Fact]和标记,xUnit runner将运行两次方法[IgnoreOnMonoFact].(CodeRush不这样做,在这种情况下我假设xUnit是正确的).这意味着任何测试方法都必须[Fact]替换为[IgnoreOnMonoFact]

笔记2

CodeRush测试运行器仍然运行[IgnoreOnMonoFact]测试,但它确实忽略了[Fact(Skip="reason")]测试.我认为这是由于CodeRush反映了xUnit并且实际上没有借助xUnit库运行它.这适用于xUnit runner.

  • &lt;Fact(Skip:=“我的原因”)&gt; _效果很好! (2认同)

Dom*_*ger 22

现在有了新的选择.

添加NuGet包SkippableFact,它允许您使用[SkippableFact],而不是[Fact],你可以使用Skip.<xyz>一个测试中运行时动态地跳过测试.

例:

[SkippableFact]
public void SomeTestForWindowsOnly()
{
    Skip.IfNot(Environment.IsWindows);

    // Test Windows only functionality.
}
Run Code Online (Sandbox Code Playgroud)

  • 辉煌的包! (2认同)

wic*_*nja 9

[Fact(Skip="reason")]

有效,但我更喜欢使用特征

[Fact, Trait("type","unit")]
public void MyUnitTest(){
  // given 
  // when
  // then
}

[Fact, Trait("type","http")]
public void MyHttpIntegrationTest(){
  // given 
  // when do things over HTTP
  // then
}
Run Code Online (Sandbox Code Playgroud)

用法

dotnet test --filter type=unit
Run Code Online (Sandbox Code Playgroud)

这可以防止我们的构建意外运行开发人员忘记跳过的集成测试,例如[Fact(Skip="Integration")],但是它确实需要单元测试通过添加正确的特征来“选择加入”CI,这无疑不是很好。