【译】介绍 MSTest Runner – CLI、Visual Studio 等
原文 | Amaury Levé, Marco Rossignoli, Jakub Jareš
翻译 | 郑子铭
我们很高兴推出 MSTest runner,这是一个用于 MSTest 测试的新型轻量级运行程序。这个新的运行程序使测试更加便携和可靠,使测试运行得更快,并且可扩展,为您提供点菜测试体验,以添加成功所需的工具。
它是什么?
MSTest 运行程序是一种将 MSTest 测试构建为独立的可移植可执行文件并将其运行的方法。一个简单的控制台应用程序用于托管和运行测试,因此您不需要任何外部工具(例如 vstest.console、dotnet test 或 Visual Studio)来运行测试。使其成为为功率或存储有限的设备编写测试的完美工具。
安装 MSTest 运行程序
所有经验水平和任何规模项目的开发人员都可以利用新 MSTest 运行程序的速度和便携性。我们欢迎您尝试一下!
自版本 3.2.0 起,MSTest 运行程序就与 MSTest.TestAdapter NuGet 包捆绑在一起。
为您的项目启用它就像安装更新的包并设置两个 MSBuild 属性 和 一样简单:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<!-- Enable the MSTest runner, this is an opt-in feature -->
<EnableMSTestRunner>true</EnableMSTestRunner>
<!-- We need to produce an executable and not a DLL -->
<OutputType>Exe</OutputType>
<TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<IsPackable>false</IsPackable>
</PropertyGroup>
<ItemGroup>
<!--
MSTest meta package is the recommended way to reference MSTest.
It's equivalent to referencing:
Microsoft.NET.Test.Sdk
MSTest.TestAdapter
MSTest.TestFramework
MSTest.Analyzers
-->
<PackageReference Include="MSTest" Version="3.2.0" />
</ItemGroup>
</Project>
进行了这些更改后,重建测试项目,您的测试将创建一个直接运行测试的可执行文件:

在上面的屏幕截图中,您可以看到我们不需要运行 dotnet 测试、使用 vstest.console 或在 Visual Studio 中运行来运行我们的测试。我们的测试只是一个发现并运行测试的普通控制台应用程序。
也就是说,运行器确实与 dotnet test、vstest.console、Visual Studio Test Explorer 和 Visual Studio Code Test Explorer 集成,为您提供与您习惯的相同的体验。请参阅我们的文档以了解更多信息。
使用 runner 与 VSTest 的优点
可移植性
直接从可执行文件运行测试消除了运行测试通常所需的大量复杂性和基础设施。由于测试项目不再特殊,因此您可以使用现有的 dotnet 工具对测试项目执行有趣的操作,例如将它们构建为独立的:
dotnet publish --runtime win-x64 --self-contained
上面的示例将发布测试项目及其需要运行的运行时。这允许您将项目移动到没有此运行时的计算机,并在多台计算机上运行测试,而无需进行额外的设置。
或者,您可以使用此功能在每次失败的测试运行后创建一个 zip 文件,以与在 CI 服务器上失败的方式相同的方式在本地重现故障,并获得一种简单的方法来交互式调试失败的运行。
下面是针对托管在没有可用 dotnet SDK 的 docker 容器中的 dotnet 应用程序运行测试的另一个示例。对于我们的高级用户来说,这是一个经常遇到问题的场景:
RunInDocker> docker build . -t my-server-tests
RunInDocker> docker run my-server-tests
Microsoft(R) Testing Platform Execution Command Line Tool
Version: 1.0.0-preview.23622.9+fe96e7475 (UTC 2023/12/22)
RuntimeInformation: linux-x64 - .NET 8.0.0
Copyright(c) Microsoft Corporation. All rights reserved.
info: Microsoft.Hosting.Lifetime[14]
Now listening on: http://[::]:8080
info: Microsoft.Hosting.Lifetime[0]
Application started. Press Ctrl+C to shut down.
info: Microsoft.Hosting.Lifetime[0]
Hosting environment: Production
info: Microsoft.Hosting.Lifetime[0]
Content root path: /test/test
info: Microsoft.AspNetCore.Hosting.Diagnostics[1]
Request starting HTTP/1.1 GET http://localhost:8080/hello - - -
info: Microsoft.AspNetCore.Routing.EndpointMiddleware[0]
Executing endpoint 'HTTP: GET /hello'
info: Microsoft.AspNetCore.Routing.EndpointMiddleware[1]
Executed endpoint 'HTTP: GET /hello'
info: Microsoft.AspNetCore.Hosting.Diagnostics[2]
Request finished HTTP/1.1 GET http://localhost:8080/hello - 200 - text/plain;+charset=utf-8 73.5556ms
Passed! - Failed: 0, Passed: 1, Skipped: 0, Total: 1, Duration: 1.7s - MyServer.Tests.dll (linux-x64 - .NET 8.0.0)
MSTest 运行程序可移植性的另一个优点是,您现在可以像调试任何常规可执行文件一样轻松调试测试。例如,在 Visual Studio 中,您现在可以简单地:
- 在解决方案资源管理器中导航要运行的测试项目,右键选择它并选择设置为启动项目。
- 导航到要调试的测试并添加断点
- 选择“调试”>“开始调试”(或使用 F5)来运行所选的测试项目。
您还可以使用 --filter 筛选出您想要调试的一个或多个方法,以加快调试速度。例如,--filter MSTestNamespace.UnitTest1.TestMethod2 仅允许运行(调试)命名空间 MSTestNamespace 中的类 UnitTest1 中的测试方法 TestMethod2。您可以在文本中找到有关可用过滤器的更多信息。以下是 launchSettings.json 的示例:
{
"profiles": {
"MSTestProject": {
"commandName": "Project",
"commandLineArgs": "--filter MSTestNamespace.UnitTest1.TestMethod2"
}
}
}
最后,我们正在研究使 MSTest NativeAOT 兼容,以便您在 NativeAOT 模式下测试应用程序。为了能够做到这一点,我们需要显着改变 MSTest 的内部结构,如果您觉得这有用,请在我们的 GitHub 问题上添加评论或点赞。
表现
MSTest 运行程序使用较少的一个进程和一个进程跳跃来运行测试(与 dotnet 测试相比),以节省构建服务器上的资源。
它还避免了进程间串行通信的需要,并依赖现代 .NET API 来提高并行性并减少占用空间。
在改用新的 MSTest 运行程序的 Microsoft 内部项目中,我们看到 CPU 和内存都得到了巨大的节省。一些项目在使用 dotnet test 运行时能够以 3 倍的速度完成测试,同时使用的内存减少 4 倍。
尽管这些数字可能令人印象深刻,但当您在测试项目中启用并行测试运行时,可以获得更大的收益。为了解决这个问题,我们添加了一组新的 MSTest 代码分析分析器,以促进良好的实践和正确的测试设置。
可靠性
MSTest 运行程序正在设置新的默认值,这些默认值更安全,并且使您更难意外错过运行任何测试。在做决定时,我们总是倾向于更严格,而当你不需要这种严格时,让你选择。
例如,当项目运行零个测试时,MSTest 运行程序将默认失败,这可以通过 --minimum-expected-tests 控制,默认为 1。您可以将其设置为 0,这样在以下情况下不会失败没有测试,但您可以轻松地将其设置为更高的数字以防止回归:
C:\p\testfx\samples\mstest-runner\Simple1> C:\p\testfx\artifacts\bin\Simple1\Debug\net8.0\Simple1.exe --minimum-expected-tests 10
Microsoft(R) Testing Platform Execution Command Line Tool
Version: 1.0.0-preview.23622.9+fe96e7475 (UTC 2023/12/22)
RuntimeInformation: win-x64 - .NET 8.0.0
Copyright(c) Microsoft Corporation. All rights reserved.
Minimum expected tests policy violation, tests ran 1, minimum expected 10 - Failed: 0, Passed: 1, Skipped: 0, Total: 1, Duration: 153ms - Simple1.dll (win-x64 - .NET 8.0.0)
但这并不是唯一的可靠性改进。我们从头开始编写 MSTest 运行程序以使其更加可靠。
MSTest 运行程序由于其新架构,不依赖文件夹扫描、动态加载或反射来检测和加载扩展。这使得在本地和 CI 中更容易实现相同的行为,并且显着缩短了启动测试应用程序和运行第一个测试之间的时间。
运行器被设计为异步且可并行,从而防止使用 VSTest 时出现的一些挂起或死锁。
运行程序不会检测目标框架或平台,或任何其他 .NET 配置。它完全依赖 .NET 平台来做到这一点。这避免了逻辑重复,并避免了当规则突然改变时许多会破坏测试的边缘情况。
可扩展性
MSTest 运行程序基于新的准系统测试平台和可扩展性模型,可以轻松扩展或覆盖测试执行的许多方面。
现在可以轻松提供您自己的报告生成器、测试编排、记录器,甚至增加可用的命令行选项。
Microsoft 提供了一系列可选扩展,以便您配备运行测试和排除故障所需的一切。
我们将继续努力提供更多扩展和功能,以丰富您的测试体验。如果您有特定需求或想帮助开发库扩展,请与我们联系。
概括
MSTest 运行程序是一个高性能、可托管、可扩展、可靠且集成的解决方案,用于运行 MSTest 测试。无论您是技术爱好者、遇到 VSTest 的一些问题还是只是好奇,我们都欢迎您尝试并在本文下面分享您的反馈。
特别感谢
我们要感谢团队,他们的不懈努力和坚定不移的承诺使这一功能得以实现。
此外,我们还要对帮助dogfood并支持这一举措的内部团队表示衷心的感谢。
原文链接
Introducing the MSTest Runner – CLI, Visual Studio, & More

本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。
欢迎转载、使用、重新发布,但务必保留文章署名 郑子铭 (包含链接: http://www.cnblogs.com/MingsonZheng/ ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。
如有任何疑问,请与我联系 (MingsonZheng@outlook.com)
【译】介绍 MSTest Runner – CLI、Visual Studio 等的更多相关文章
- 【译】Database Profiling with Visual Studio
你是否在排查运行缓慢的 web 应用程序时怀疑是数据库层造成的?以前排查数据库层需要特定的工具,现在可以使用 Visual Studio 的 Performance Explorer 中的数据库分析工 ...
- Code Runner,率先支持刚发布的 Visual Studio 2022!
Visual Studio 被不少网友成为"宇宙第一IDE".但是,我写✍ PHP.Java 和 C#,也都是用的 VS Code. 我所在的组,是 Visual Studio C ...
- [.net 面向对象程序设计进阶] (27) 团队开发利器(六)分布式版本控制系统Git——在Visual Studio 2015中使用Git
[.net 面向对象程序设计进阶] (26) 团队开发利器(六)分布式版本控制系统Git——在Visual Studio 2015中使用Git 本篇导读: 接上两篇,继续Git之旅 分布式版本控制系统 ...
- 在Visual Studio上开发Node.js程序(2)——远程调试及发布到Azure
[题外话] 上次介绍了VS上开发Node.js的插件Node.js Tools for Visual Studio(NTVS),其提供了非常方便的开发和调试功能,当然很多情况下由于平台限制等原因需要在 ...
- 在Visual Studio上开发Node.js程序
[题外话] 最近准备用Node.js做些东西,于是找找看能否有Visual Studio上的插件以方便开发.结果还真找到了一个,来自微软的Node.js Tools for Visual Studio ...
- Visual Studio原生开发的10个调试技巧
这篇文章只介绍了一些有关Visual Studio的基本调试技巧,但是还有其他一些同样有用的技巧.我整理了一些Visual Studio(至少在VS 2008下)原生开发的调试技巧.(如果你是工作在托 ...
- 1.2 如何在visual studio 中建立C#程序
这一节简单介绍一下怎么在visual studio 2015中建立第一个C#程序,我使用的是2015版的visual studio,不同版本可能有一些差异,不过大体上是相同的,这些信息仅供新手参考,大 ...
- Visual Studio 中可执行文件中嵌入的清单文件
概要 本分步指南介绍如何在 Microsoft Visual Studio 2005年中的可执行文件 (.exe) 文件中嵌入的清单文件.如果您要开发"认证 Windows Vista&qu ...
- Visual Studio原生开发的10个调试技巧(一)
最近碰巧读了Ivan Shcherbakov写的一篇文章,<11个强大的Visual Studio调试小技巧>.这篇文章只介绍了一些有关Visual Studio的基本调试技巧,但是还有其 ...
- Cocos开发中Visual Studio下libcurl库开发环境设置
我们介绍一下win32中Visual Studio下libcurl库开发环境设置.Cocos2d-x引擎其实已经带有为Win32下访问libcurl库,Cocos2d-x 3.x中libcurl库文件 ...
随机推荐
- Springboot+ELK实现日志系统简单搭建
前面简单介绍了ELK三剑客中的其中两个Elasticsearch和Kibana的简单使用,如果对这两个不了解,可以看下下面的 Centos7安装Elasticsearch和Kibana 搜索引擎基础- ...
- SpringCloud集成Seata并使用Nacos做注册中心与配置中心
本文为博主原创,未经允许不得转载: 目录: 1. 下载并启动Seata Server,并指定nacos作为配置中心和注册中心 2. 同步seata server的配置到nacos 3. 启动Seata ...
- 在线视频点播网站(python实现)
本文将会对该项目进行一个简单的介绍,包括项目名称.项目背景.项目功能.技术栈等等. 项目名称 在线视频点播网站开发(python+django) 项目背景 学习完毕python和django之后,想找 ...
- PHPCMS V9安装出现DNS解析失败的解决方法-不支持采集和保存远程图片
目前因为phpcms官网停止解析后,很多人安装phpcms v9出现如下错误: 这是因为检测dns解析的域名是phpcms官网的域名,官网域名停止解析后肯定检测失败.解决方法如下: 打开/ ...
- 百度网盘(百度云)SVIP超级会员共享账号每日更新(2023.11.21)
百度网盘会员账号共享(11.21更新) 账号:tgc91660 密码:6858hykh 账号:ofj51327 密码:rvzp3251 账号:5799osrb 密码:862lwtr 账号:3730sw ...
- [转帖]一文说清 Linux System Load
https://zhuanlan.zhihu.com/p/447661302 双十一压测过程中,常见的问题之一就是load 飙高,通常这个时候业务上都有受影响,比如服务rt飙高,比如机器无法登录,比如 ...
- [转帖]《Linux性能优化实战》笔记(20)—— 使用 tcpdump 和 Wireshark 分析网络流量
tcpdump 和 Wireshark 是最常用的网络抓包和分析工具,更是分析网络性能必不可少的利器. tcpdump 仅支持命令行格式使用,常用在服务器中抓取和分析网络包.Wireshark 除了可 ...
- [转帖]Jmeter性能测试:高并发分布式性能测试
一.为什么要进行分布式性能测试 当进行高并发性能测试的时候,受限于Jmeter工具本身和电脑硬件的原因,无法满足我们对大并发性能测试的要求.基于这种场景下,我们就需要采用分布式的方式来实现我们高并发的 ...
- MySQL数据库页存储结构学习与了解
MySQL数据库页存储结构学习与了解 背景 MySQL总是出现奇奇怪怪的问题. 想着自己能够学习与提高一下. 最近看了很多文档.关于MySQL数据库相关的. 想着总结和提炼一下, 希望能够给未来的工作 ...
- [转帖]xsos:一个在 Linux 上阅读 SOSReport 的工具
https://www.sohu.com/a/315931829_100034897 xsos 是一个帮助用户轻松读取 Linux 系统上的 sosreport 的工具.另一方面,我们可以说它是 so ...