如何使用 "dotnet test" 按类别过滤 NUnit 测试

How to filter NUnit tests by category using "dotnet test"

我有一个项目

[TestFixture, Category("Oracle")]

还有一个

[TestFixture, Category("OracleOdbc")]

我想 使用 dotnet test.

单独 执行一些测试

这是我在谷歌搜索后尝试的结果:

  1. dotnet test MyProject.csproj --where "cat==Oracle" 但此开关已不存在。
  2. dotnet test MyProject.csproj --filter Category="Oracle" 产生 0 个适用的测试:No test is available in ....

然后,我偶然发现了 this article,虽然它描述了 MSTest(并且 NUnit 有 CategoryAttribute 而不是 TestCategoryAttribute),但我试过

  1. dotnet test MyProject.csproj --filter TestCategory="Oracle"

宾果游戏。这次执行了所有 "Oracle" 测试。但现在是令人困惑的部分。如果我运行dotnet test MyProject.csproj --filter TestCategory="OracleOdbc"所有测试正在执行,包括"Oracle""OracleOdbc".这让我想知道 TestCategroy 是否是使用 NUnit 的正确方法,或者这是一个错误。

我正在使用 .NET 命令行工具 (2.1.2),项目参考是:

<PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.5.0" />
<PackageReference Include="NUnit" Version="3.8.1" />
<PackageReference Include="NUnit3TestAdapter" Version="3.9.0" />
<PackageReference Include="TeamCity.VSTest.TestAdapter" Version="1.0.7" />

顺便说一句,我不知道这是否重要,但我的测试项目是多目标 netcoreapp2.0net462.

这可能不是很有帮助,但它似乎对我有用。我使用 dotnet-cli.

创建了项目

首先我安装了 NUnit3 测试适配器 instructions from here。这只需要在每台机器上 运行 一次,所以如果你已经 运行 它就不需要再做一次。

dotnet new -i NUnit3.DotNetNew.Template

然后我创建了我的解决方案,创建了我的测试项目并将测试项目添加到解决方案中。

dotnet new sln -n Solution
dotnet new nunit -n TestProject -o tests\TestProject
dotnet sln add tests\TestProject\TestProject.csproj

然后我更新了 UnitTest1.cs 以包含两个测试装置,一个类别为 Oracle,另一个类别为 OracleOdbc

using NUnit.Framework;

namespace Tests
{
    [TestFixture]
    [Category("Oracle")]
    public class OracleTests
    {
        [Test]
        public void OracleTest()
        {
            Assert.Fail();
        }
    }

    [TestFixture]
    [Category("OracleOdbc")]
    public class OracleOdbcTests
    {
        [Test]
        public void OracleOdbcTest()
        {
            Assert.Fail();
        }
    }
}

然后我可以指定我选择的类别运行。

dotnet test tests/TestProject/TestProject.csproj --filter TestCategory="Oracle"

dotnet test tests/TestProject/TestProject.csproj --filter TestCategory="OracleOdbc"

两个 运行 只有一个测试,消息显示它是失败的正确测试。

使用 DotNet-Cli 版本 2.1.4 和 NUnit3TestAdapter 版本 3.9.0

如果你像我一样喜欢枚举,你也可以在测试中放置一个过滤器:

    [Test]
    public void Test_Foo()
    {            
        // filter test
        switch (GlobalDefinitions.Category)
        {
                // OK Test
                case Category.Oracle:
                case Category.SQL:
                    break;

                // Do NOT test
                case Category.MongoDb:
                    Assert.Inconclusive();

                // Error
                default:
                    Assert.Fail("Not implemented case");
        }

        // perform test...

    }

让变量 GlobalDefinitions.Category 从资源文件或任何最适合您的文件中获取值。


编辑 Flags

缩短相同的代码

创建您的类别

[Flags] // <-------------------- Important to shorten code 
public enum Category: int
{
    None = 0,
    Oracle = 1 << 0,
    SQL = 1 << 1,
    MongoDb = 1 << 2,

    // future categories        

    ALL = -1
}

// 创建你的过滤方法

public static void Filter(Category category)
{
    if(GlobalDefinitions.Category.HasFlag(category) == false)
       Assert.Inconclusive(); // do not perform test

    // else perform test                         
}

// 然后将测试创建为:

[Test]
public void Test_Foo()
{ 
    Filter(Category.SQL | Category.MongoDb); // place filter (in this test we are testing for SQL and MongoDb

    // perform your test ...

}

在 Nunit Framework 中,Category Attribute 可以位于 Method 的级别。

示例:

public class NUnitTest 
    {
        [Test]
        [Category("CategoryA")] 
        public void TestMethod1()
        {
        }

        [Test]
        [Category("CategoryB")] 
        public void TestMethod2()
        {
        }

    }

命令是:

dotnet test --filter TestCategory=CategoryA     #Runs tests which are annotated with [Category("CategoryA")].

另外,在方法等层面上也有很多选择 更多详情:read

现在有两个选项可以使用 dotnet test 按类别过滤测试。您可以使用 dotnet.exe 的内置测试过滤语法,或 NUnit 过滤语法。

首先使用 NuGet 将 NUnit3TestAdapter 添加到您的项目中:

install-package nunit3testadapter -proj YourProject

然后您可以像这样过滤测试:

dotnet.exe test .\ --test-adapter-path:. --filter TestCategory=Foo

或者像这样:

dotnet.exe test .\ --test-adapter-path:. -- NUnit.Where="cat=Foo"

This blog post 更详细。