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

时间:2010-12-12 11:04:41

标签: xunit

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

但是,我发现虽然其中400个测试可以按顺序运行,但某些测试要么挂起xUnit运行器,要么完全将其关闭。

如果某些测试无法在Linux上运行,我不会关心,某些测试与DTC以及我们不需要支持的一些非托管gumph有关。

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

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

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

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

5 个答案:

答案 0 :(得分:27)

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

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

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

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

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

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

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

选项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;
    }
}

注1

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

注2

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

答案 1 :(得分:19)

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

[Fact (Skip = "specific reason")]

答案 2 :(得分:18)

现在有了新的选择。

添加Nuget Package SkippableFact,您可以使用[SkippableFact]代替[Fact],并且可以在测试中使用Skip.<xyz>在运行时动态地跳过测试。< / p>

示例:

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

    // Test Windows only functionality.
}

答案 3 :(得分:2)

这将是特征的理想用法,但不幸的是,命令行和xml项目文件都不支持基于特征的过滤。值得为codeplex网站添加一个问题。

答案 4 :(得分:2)

现在在1.8中解决了 - 你可以过滤Traits。请参阅此issue log

更新:Traits适用于控制台运行程序但不适用于MSBuild,我已为此支持添加了功能请求。