但是,我发现虽然其中400个测试可以按顺序运行,但某些测试要么挂起xUnit运行器,要么完全将其关闭。
如果某些测试无法在Linux上运行,我不会关心,某些测试与DTC以及我们不需要支持的一些非托管gumph有关。
然而,我真正想要的是对这些测试应用忽略,并且在构建输出中正确地标记了测试被忽略的事实。
这个问题可以归结为我想一些可能的解决方案
如果我可以避免修改原始代码太多太大,因为代码不是我的改变,并且应用大量的跨平台黑客攻击可能不会太顺利。
答案 0 :(得分:27)
我会避免外部跳过测试(例如,如果可能的话,配置/命令文件)。这有点违背使测试易于运行和值得信赖。当其他人开始参与时,在代码中忽略测试是最安全的方法。
我可以看到许多选项,这里有两个涉及修改现有代码的选项。
在VS解决方案中,定义另一个定义预编译器标志MONOWIN
的配置(只是为了明确表示它是用于在Windows上编译以便在Mono上使用的代码)。
然后定义一个属性,在编译Mono时忽略测试:
public class IgnoreOnMonoFactAttribute : FactAttribute {
#if MONOWIN
public IgnoreOnMonoFactAttribute() {
Skip = "Ignored on Mono";
}
#endif
}
实际上很难找到这种方法的任何优点,因为它涉及使用原始解决方案进行模拟,并增加了需要支持的另一种限制。
以下是与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;
}
}
xUnit runner如果标有[Fact]
和[IgnoreOnMonoFact]
,则会运行两次方法。 (CodeRush不这样做,在这种情况下我假设xUnit是正确的)。这意味着任何测试方法都必须将[Fact]
替换为[IgnoreOnMonoFact]
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,我已为此支持添加了功能请求。