如何使用 "dotnet test" 按类别过滤 NUnit 测试
How to filter NUnit tests by category using "dotnet test"
我有一个项目
[TestFixture, Category("Oracle")]
还有一个
[TestFixture, Category("OracleOdbc")]
我想 使用 dotnet test
.
单独 执行一些测试
这是我在谷歌搜索后尝试的结果:
dotnet test MyProject.csproj --where "cat==Oracle"
但此开关已不存在。
dotnet test MyProject.csproj --filter Category="Oracle"
产生 0 个适用的测试:No test is available in ...
.
然后,我偶然发现了 this article,虽然它描述了 MSTest(并且 NUnit 有 CategoryAttribute
而不是 TestCategoryAttribute
),但我试过
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.0
和 net462
.
这可能不是很有帮助,但它似乎对我有用。我使用 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 更详细。
我有一个项目
[TestFixture, Category("Oracle")]
还有一个
[TestFixture, Category("OracleOdbc")]
我想 使用 dotnet test
.
这是我在谷歌搜索后尝试的结果:
dotnet test MyProject.csproj --where "cat==Oracle"
但此开关已不存在。dotnet test MyProject.csproj --filter Category="Oracle"
产生 0 个适用的测试:No test is available in ...
.
然后,我偶然发现了 this article,虽然它描述了 MSTest(并且 NUnit 有 CategoryAttribute
而不是 TestCategoryAttribute
),但我试过
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.0
和 net462
.
这可能不是很有帮助,但它似乎对我有用。我使用 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 更详细。