我的项目有
[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
。
答案 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 进一步详细说明。