运行选定的单元测试
借助 .NET Core 中的 dotnet test
命令,可以使用筛选表达式来运行选定的测试。 本文演示如何筛选测试。 本示例使用 dotnet test
。 如果使用的是 vstest.console.exe
,请将 --filter
替换成 --testcasefilter:
。
语法
dotnet test --filter <Expression>
表达式的格式为
<Property><Operator><Value>[|&<Expression>]
。表达式可与布尔运算符结合使用:
|
表示 or 布尔运算符,&
表示 and 布尔运算符 。表达式可以用括号括起来。 例如:
(Name~MyClass) | (Name~MyClass2)
。没有任何运算符的表达式被解释为
FullyQualifiedName
属性上的 contains 。 例如,dotnet test --filter xyz
和dotnet test --filter FullyQualifiedName~xyz
相同。属性是
Test Case
的一个特性。 例如,常用单元测试框架支持以下属性。测试框架 支持的属性 MSTest FullyQualifiedName
Name
ClassName
Priority
TestCategory
xUnit FullyQualifiedName
DisplayName
Traits
Nunit FullyQualifiedName
Name
Priority
TestCategory
运算符
=
完全匹配!=
非完全匹配~
包含!~
不包含
值是一个字符串。 所有查找都不区分大小写。
字符转义
若要在筛选表达式中使用感叹号 (!
),必须在 Linux 或 macOS shell 中对其进行转义,具体做法是在前面加一个反斜杠 (\!
)。 例如,以下筛选器跳过包含 IntegrationTests
的命名空间中的所有测试:
dotnet test --filter FullyQualifiedName\!~IntegrationTests
对于包含泛型类型参数的逗号的 FullyQualifiedName
值,请使用 %2C
来转义逗号。 例如:
dotnet test --filter "FullyQualifiedName=MyNamespace.MyTestsClass<ParameterType1%2CParameterType2>.MyTestMethod"
MSTest 示例
using Microsoft.VisualStudio.TestTools.UnitTesting;
namespace MSTestNamespace
{
[TestClass]
public class UnitTest1
{
[TestMethod, Priority(1), TestCategory("CategoryA")]
public void TestMethod1()
{
}
[TestMethod, Priority(2)]
public void TestMethod2()
{
}
}
}
表达式 | 结果 |
---|---|
dotnet test --filter Method |
运行 FullyQualifiedName 包含 Method 的测试。 |
dotnet test --filter Name~TestMethod1 |
运行名称包含 TestMethod1 的测试。 |
dotnet test --filter ClassName=MSTestNamespace.UnitTest1 |
运行属于类 MSTestNamespace.UnitTest1 的测试。注意: 由于 ClassName 值应有命名空间,因此 ClassName=UnitTest1 无效。 |
dotnet test --filter FullyQualifiedName!=MSTestNamespace.UnitTest1.TestMethod1 |
运行除 MSTestNamespace.UnitTest1.TestMethod1 之外的其他所有测试。 |
dotnet test --filter TestCategory=CategoryA |
运行含 [TestCategory("CategoryA")] 批注的测试。 |
dotnet test --filter Priority=2 |
运行含 [Priority(2)] 批注的测试。 |
使用条件运算符 |
和 &
的示例:
运行 FullyQualifiedName 中包含
UnitTest1
或 TestCategoryAttribute 为"CategoryA"
的测试。dotnet test --filter "FullyQualifiedName~UnitTest1|TestCategory=CategoryA"
运行 FullyQualifiedName 中包含
UnitTest1
且 TestCategoryAttribute 为"CategoryA"
的测试。dotnet test --filter "FullyQualifiedName~UnitTest1&TestCategory=CategoryA"
运行 FullyQualifiedName 中包含
UnitTest1
且 TestCategoryAttribute 为"CategoryA"
或 PriorityAttribute 的优先级为1
的测试。dotnet test --filter "(FullyQualifiedName~UnitTest1&TestCategory=CategoryA)|Priority=1"
xUnit 示例
using Xunit;
namespace XUnitNamespace
{
public class TestClass1
{
[Fact, Trait("Priority", "1"), Trait("Category", "CategoryA")]
public void Test1()
{
}
[Fact, Trait("Priority", "2")]
public void Test2()
{
}
}
}
表达式 | 结果 |
---|---|
dotnet test --filter DisplayName=XUnitNamespace.TestClass1.Test1 |
仅运行一个测试,即 XUnitNamespace.TestClass1.Test1 。 |
dotnet test --filter FullyQualifiedName!=XUnitNamespace.TestClass1.Test1 |
运行除 XUnitNamespace.TestClass1.Test1 之外的其他所有测试。 |
dotnet test --filter DisplayName~TestClass1 |
运行显示名称包含 TestClass1 的测试。 |
在代码示例中,包含键 "Category"
和 "Priority"
的已定义特征可用于筛选。
表达式 | 结果 |
---|---|
dotnet test --filter XUnit |
运行 FullyQualifiedName 包含 XUnit 的测试。 |
dotnet test --filter Category=CategoryA |
运行包含 [Trait("Category", "CategoryA")] 的测试。 |
使用条件运算符 |
和 &
的示例:
运行 FullyQualifiedName 中包含
TestClass1
或Trait
的键为"Category"
且值为"CategoryA"
的测试。dotnet test --filter "FullyQualifiedName~TestClass1|Category=CategoryA"
运行 FullyQualifiedName 中包含
TestClass1
且Trait
的键为"Category"
且值为"CategoryA"
的测试。dotnet test --filter "FullyQualifiedName~TestClass1&Category=CategoryA"
运行 FullyQualifiedName 中包含
TestClass1
且Trait
的键为"Category"
且值为"CategoryA"
或Trait
的键为"Priority"
且值为1
的测试。dotnet test --filter "(FullyQualifiedName~TestClass1&Category=CategoryA)|Priority=1"
NUnit 示例
using NUnit.Framework;
namespace NUnitNamespace
{
public class UnitTest1
{
[Test, Property("Priority", 1), Category("CategoryA")]
public void TestMethod1()
{
}
[Test, Property("Priority", 2)]
public void TestMethod2()
{
}
}
}
表达式 | 结果 |
---|---|
dotnet test --filter Method |
运行 FullyQualifiedName 包含 Method 的测试。 |
dotnet test --filter Name~TestMethod1 |
运行名称包含 TestMethod1 的测试。 |
dotnet test --filter FullyQualifiedName~NUnitNamespace.UnitTest1 |
运行属于类 NUnitNamespace.UnitTest1 的测试。 |
dotnet test --filter FullyQualifiedName!=NUnitNamespace.UnitTest1.TestMethod1 |
运行除 NUnitNamespace.UnitTest1.TestMethod1 之外的其他所有测试。 |
dotnet test --filter TestCategory=CategoryA |
运行含 [Category("CategoryA")] 批注的测试。 |
dotnet test --filter Priority=2 |
运行含 [Priority(2)] 批注的测试。 |
使用条件运算符 |
和 &
的示例:
运行 FullyQualifiedName 中包含 UnitTest1
或 Category
为 "CategoryA"
的测试。
dotnet test --filter "FullyQualifiedName~UnitTest1|TestCategory=CategoryA"
运行 FullyQualifiedName 中包含 UnitTest1
且 Category
为 "CategoryA"
的测试。
dotnet test --filter "FullyQualifiedName~UnitTest1&TestCategory=CategoryA"
运行 FullyQualifiedName 中包含 UnitTest1
且 Category
为 "CategoryA"
或 Property
的 "Priority"
为 1
的测试。
dotnet test --filter "(FullyQualifiedName~UnitTest1&TestCategory=CategoryA)|Priority=1"
有关详细信息,请参阅 TestCase 筛选器