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

时间:2013-02-12 19:24:07

标签: xunit.net

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

[TestFixture]
[Ignore("Reason")]
public class TestClass {
}

10 个答案:

答案 0 :(得分:28)

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

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

如果你觉得需要将它作为CodePlex上的一个问题就足够常见了(我个人无法想象它是否已经过时,因为我根本不会遇到需要跳过整个Test Class值的情况)测试)。

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

更新2:你可以做到

const string skip = "Class X disabled";

[Fact(Skip=skip)]
void Test() {}

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

答案 1 :(得分:1)

您可以通过自定义ITestClassCommand实现此目的。

请参阅http://mariangemarcano.blogspot.be/2010/12/xunitnet-running-tests-testcategory.html

答案 2 :(得分:1)

这是我的黑客,以避免错误xUnit1000:测试类必须是公开的(检查单一事实,我认为理论也可以这样被黑客攻击)。

// Uncomment to enable tests
//public class FactSwitch : FactAttribute { }

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

public class MyTests
{
    [FactSwitch]
    public void MyTest1()
    {
        "it".ShouldBe("it");
    }
}

答案 3 :(得分:1)

据我所知,在运行时动态跳过整个 xUnit 测试类的最简单方法是在程序集级别使用 TestFrameworkAttribute,指向实现 ITestFramework 接口的类(或继承自 XunitTestFramework,后者更简单)并覆盖 CreateDiscoverer() 方法以返回另一个实现 ITestFrameworkDiscoverer 接口的类(或继承自 XunitTestFrameworkDiscoverer,即更简单),您最终可以在其中覆盖 IsValidTestClass() 方法,以决定是否应跳过某个类。

这是一些示例代码:

[assembly: TestFramework("MyNamespace.Xunit.MyTestFramework", "MyAssembly")]

namespace MyNamespace.Xunit
{
    public class MyTestFramework : XunitTestFramework
    {
        public MyTestFramework(IMessageSink messageSink)
            : base(messageSink)
        {
        }

        protected override ITestFrameworkDiscoverer CreateDiscoverer(
            IAssemblyInfo assemblyInfo)
            => new MyTestFrameworkDiscoverer(
                assemblyInfo,
                SourceInformationProvider,
                DiagnosticMessageSink);
    }

    public class MyTestFrameworkDiscoverer : XunitTestFrameworkDiscoverer
    {
        public MyTestFrameworkDiscoverer(
            IAssemblyInfo assemblyInfo,
            ISourceInformationProvider sourceProvider,
            IMessageSink diagnosticMessageSink,
            IXunitTestCollectionFactory collectionFactory = null)
            : base(
                assemblyInfo,
                sourceProvider,
                diagnosticMessageSink,
                collectionFactory)
        {
        }

        protected override bool IsValidTestClass(ITypeInfo type)
            => base.IsValidTestClass(type) &&
               FilterType(type);

        protected virtual bool FilterType(ITypeInfo type)
        {
            // Insert your custom filter conditions here.
            return true;
        }
    }
}

使用 xUnit 2.4.1 测试。

我们在 Pomelo.EntityFrameworkCore.MySql 中使用它(参见 AssemblyInfo.csMySqlXunitTestFrameworkDiscoverer.cs)(比这里的示例代码复杂一点)。

答案 4 :(得分:0)

在最初的问题之后差不多一年之后添加一个原因。我有一组调用真正的服务器apis的测试,我想按需运行。使用nUnit时,它具有Ignore属性:使用该设置,测试运行器将跳过这些测试,但我仍然可以手动运行它。

xUnit没有这样的功能。最近的一个是设置这样的类级别属性,并在我想运行它时将其注释掉。

答案 5 :(得分:0)

这是另一个需要对代码进行最少更改的黑客

using FactAttribute = System.Runtime.CompilerServices.CompilerGeneratedAttribute;
using TheoryAttribute = System.Runtime.CompilerServices.CompilerGeneratedAttribute;

任何兼容的属性都可以用于替换。

如果您还使用InlineDataAttribute,则需要定义一个替换项,因为我认为不存在现有的兼容属性。

using InlineDataAttribute = DummyDataAttribute;

[AttributeUsage(AttributeTargets.Method, AllowMultiple = true)]
internal class DummyDataAttribute : Attribute
{
    public DummyDataAttribute(params object[] data)
    {
    }
}

答案 6 :(得分:0)

我已经找到了另一种在没有编译器警告的情况下临时禁用整个类的方法。

已禁用:

[System.Diagnostics.CodeAnalysis.SuppressMessage("Usage", "xUnit1000:Test classes must be public", Justification = "Disabled")]//*/
/*
public /**/class DatabaseTests
{
}

启用/*向上移动一行(即使用alt + up):

/*
[System.Diagnostics.CodeAnalysis.SuppressMessage("Usage", "xUnit1000:Test classes must be public", Justification = "Disabled")]//*/
public /**/class DatabaseTests
{
}

请注意,为SupressMessage使用完整的名称空间路径不会干扰您的使用。

答案 7 :(得分:0)

您可以创建 LocalOnlyFactAttribute

    public class LocalOnlyFactAttribute : FactAttribute
    {
        //uncomment to run on local
        //const string skip = null; 

        //keep this to avoid slow running tests on other env
        const string skip = "Disabled slow running tests."; 

        public override string Skip { get => skip; set => this.Skip = value; }
    }   

答案 8 :(得分:0)

考虑创建 LocalOnlyFactAttribute ,可以在多个测试文件中重复使用。


    public class LocalOnlyFactAttribute : FactAttribute
    {
        //uncomment to run on local
        //const string skip = null; 

        //keep this to avoid slow running tests on other env
        const string skip = "Disabled slow running tests."; 

        public override string Skip { get => skip; set => this.Skip = value; }
    }   

答案 9 :(得分:0)

您需要将您的班级访问权限设置为内部,并像@Miq那样设置超限消息:

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