如何使用“dotnet test”

时间:2018-01-10 20:51:19

标签: c# .net-core nunit dotnet-cli

我的项目有

[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 ...
  3. 然后,我偶然发现了this article虽然它描述了MSTest(NUnit有CategoryAttribute而不是TestCategoryAttribute),但我已经尝试了

    1. dotnet test MyProject.csproj --filter TestCategory="Oracle"
    2. 宾果。这次所有“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

4 个答案:

答案 0 :(得分:5)

这可能不是很有帮助,但它似乎对我有用。我使用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

答案 1 :(得分: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 ...

}

答案 2 :(得分:0)

在Nunit Framework中,类别属性可以在方法级别上。

示例:

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

答案 3 :(得分:0)

现在有两个选项可以使用 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 进一步详细说明。