在xUnit.net中跳过整个测试类

dwo*_*sch 28 xunit.net

是否可以跳过NUnit中特定类的所有测试

[TestFixture]
[Ignore("Reason")]
public class TestClass {
}
Run Code Online (Sandbox Code Playgroud)

Rub*_*ink 33

不 - 目前没有这样的设施,

在xUnit中实现效果的一种快捷方法是注释掉public- 私有类没有反映出来(显然它不会出现在跳过列表中).

如果您认为需要将它作为CodePlex上的问题足够常见,请考虑将其记录为CodePlex上的问题(我个人无法想象它的支持,因为我根本不会遇到需要跳过整个测试类测试的情况).

更新:另一种方法是TraitAttribute在类上放一个然后(假设你正在使用xunit.console跑步者)通过运行来过滤掉它/-trait traitName.(例如,您可以通过这种方式实现ExplicitAttribute待定测试和类似语义的BDD框架技术的某些方面 - 当然,最大的问题是它们在使用任何这些过滤技术时都不会出现在任何报告中)

更新2:你可以做到

const string skip = "Class X disabled";

[Fact(Skip=skip)]
void Test() {}
Run Code Online (Sandbox Code Playgroud)

然后您可以更改为const string skip = null以撤消跳过.这种(dis)的优点是测试仍然在测试列表中显示为Skipped测试,通常在测试运行报告中包含一个原因(与之private相比,它可能会被遗忘)

  • 使用xUnit> = 2.3,您会收到错误消息`error xUnit1000:测试类必须是公共的 (5认同)

Rem*_*ius 11

这是我避免错误 xUnit1000 的技巧:测试类必须是公共的(检查单个事实,我认为理论也可以通过这种方式进行破解)。

// Uncomment to enable tests
//public class FactSwitch : FactAttribute { } // public! ahh, a bug!

// Uncomment to disable tests
internal class FactSwitch : Attribute { }

public class MyTests
{
    [FactSwitch]
    public void MyTest1()
    {
        "it".ShouldBe("it");
    }
}
Run Code Online (Sandbox Code Playgroud)

(3年后)

在寻找相同的解决方案时,我发现有更好的方法可以做到这一点。让我们按照 Ruben Bartelink 建议的方式重写上面的示例(延续他的想法)。

public class MyTests
{
    //const string SkipOrNot = null; // Run all tests
    const string SkipOrNot = "reason"; // Skip all tests

    [Fact(Skip = SkipOrNot)]
    public void MyTest1()
    {
        "it".ShouldBe("it");
    }
}
Run Code Online (Sandbox Code Playgroud)

内森·库珀(Nathan Cooper)对我的想法提出了一个很好的改进:

public class MyTests
{
    // Uncomment to disable tests
    //private class FactAttribute : Attribute { }

    [Fact]
    public void MyTest1()
    {
        "it".ShouldBe("it");
    }
}
Run Code Online (Sandbox Code Playgroud)

所以我喜欢鲁本和内森的两个想法。使用 Skip="something" (Ruben) 和根本不使用 Skip 之间存在细微的差别。使用“跳过”会将所有测试置于“跳过测试”警告区域中,而“FactAttribute : Attribute”将隐藏它们。

  • 您还可以执行 `const SkipIt = "reason" // Change to null to run`,然后执行 `Fact(Skip=SkipIt)` 使其成为有条件的 (3认同)
  • 旧线程,但您可以将 `private class FactAttribute : Attribute { }` 放在类中以压倒 `[Fact]` 因为名称空间。 (3认同)
  • 使用“#define Fact Attribute”更加紧凑,并且允许您继续使用“[Fact]”。 (2认同)
  • 很好,但它不是 C++,#define 的使用有限制 (2认同)

Mur*_*rti 10

您需要将类访问级别设置为内部并抑制消息,就像 @Miq 所做的那样:

[System.Diagnostics.CodeAnalysis.SuppressMessage("Usage", "xUnit1000:Test classes must be public", Justification = "Disabled")]
internal class MyClassThatIsNotATestClass
{ ... }
Run Code Online (Sandbox Code Playgroud)