取消

用命令行执行 .NET 单元测试时,如何仅执行符合某些条件的单元测试

本文介绍使用 dotnet test 命令进行单元测试的时候,过滤出被测项目中的一部分测试出来,仅测试这一部分。


背景

建一个 .NET Core 的单元测试项目,例如项目名字是 Walterlv.Demo.Tests。举例其中的一个测试类如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
using Microsoft.VisualStudio.TestTools.UnitTesting;

namespace Walterlv.Demo.Tests
{
    [TestClass]
    public class FooTest
    {
        [TestCategory("CategoryA")]
        [Priority(1)]
        [TestMethod]
        public void TestMethod1()
        {
        }

        [Priority(2)]
        [TestMethod]
        public void TestMethod2()
        {
        }
    }
}

使用 Visual Studio 的话,直接在测试资源管理器中点击运行全部测试,或者选择想要测试的项点运行所选测试即可。

Visual Studio 测试资源管理器

而使用 GUI 工具的话不利于 CI 集成和自动化测试,所以必然需要用到命令:

1
> dotnet test .\Walterlv.Demo.Tests.dll

有时为了调试方便或输出分类数据等,要求执行一部分单元测试,这就需要过滤了。dotnet test 的过滤使用 --filter 选项。

过滤

方法名

查找方法名包含某字符串的单元测试并执行:

1
dotnet test --filter TestMethod1

或者:

1
dotnet test --filter Name~TestMethod1

如果是排除某方法,则是:

1
dotnet test --filter FullyQualifiedName!=Walterlv.Demo.Tests.FooTest.TestMethod1

类名

查找类名等于某字符串的单元测试并执行:

1
dotnet test --filter ClassName=Walterlv.Demo.Tests.FooTest

类名必须包含命名空间,否则找不到。

分类与优先级

查找标记了 [TestCategory("CategoryA")] 的方法并执行单元测试:

1
dotnet test --filter TestCategory=CategoryA

查找标记了 [Priority(2)] 的方法并执行单元测试:

1
dotnet test --filter Priority=2

条件与或

条件或(|):

1
dotnet test --filter Name~TestMethod1|TestCategory=CategoryA

条件与(’&’):

1
dotnet test --filter Name~TestMethod1&TestCategory=CategoryA

参考资料

本文会经常更新,请阅读原文: https://blog.walterlv.com/post/dotnet-test-with-filter.html ,以避免陈旧错误知识的误导,同时有更好的阅读体验。

知识共享许可协议

本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。欢迎转载、使用、重新发布,但务必保留文章署名 吕毅 (包含链接: https://blog.walterlv.com ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请 与我联系 ([email protected])

登录 GitHub 账号进行评论