介绍 MSTest Runner - CLI, Visual Studio 等更多
介绍 MSTest Runner - CLI, Visual Studio 等更多
https://devblogs.microsoft.com/dotnet/introducing-ms-test-runner/
很荣幸介绍 MSTest runner,它是同于 MSTest 测试的新的轻量级执行器。这个新的执行器使得测试更加可移植,也更加可靠。使得测试执行更快,它可以使用点菜式的扩展,为你的成功提供新的工具。
它是什么?
MSTest runner 是通过独立的可执行的方式来构建和执行 MSTest。一个简单的控制台应用用于托管和运行你的测试。这样你就不需要任何额外的工具,比如 vstest.console、dotnet test 或者 Visual Studio 等等来执行你的测试。使其成为为功率或存储有限的设备编写测试的完美工具。
安装 MSTest runner
任何级别的开发者,任何尺寸的项目都可以从新的 MSTest runner 中获得速度和可移植性的好处。我们欢迎你尝试它。
MSTest runner 从 NuGet 包 MSTest。TestAdapter 的 3.2.0 开始提供。
为你的项目启用它只需要简单的安装并更新包,然后设置两个元素:
- EnableMSTestRunner
- OutputType
<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 test
命令,也不需要 vstest.console
或者在 Visual Studio 中执行我们的测试。测试变成一个普通的控制台应用,其中发现和执行了所有的测试。
也就是说,运行器与 dotnet test
、vstest.console
、Visual Studio 测试资源管理器和 Visual Studio Code 测试资源管理器集成,以提供与你习惯的相同体验。请参阅我们的文档以了解更多信息。
使用 runner 与 VSTest 的优点
可移植性
直接从可执行文件运行测试可以消除运行测试通常需要的许多复杂性和基础结构。由于测试项目不再特殊,因此可以使用现有的 dotnet 工具对测试项目执行有趣的操作,例如将它们构建为自包含的项目:
dotnet publish --runtime win-x64 --self-contained
上面的示例将测试项目发布为与其需要的运行时合并在一起。这就支持你可以将测试项目转移到没有提供运行时的机器上来执行,可以在多台计算机上执行而不需要额外的配置。
或者,在每个失败的测试之后,你可以使用这个功能创建一个 zip 文件,这样可以与你的 CI 机器上相同的方式,在本地再现失败的测试,以便交互式的调试失败的测试用例。
另外一个示例是可以同鞥托管在 docker 容器中的 .NET 应用来执行测试,而不再需要 .NET SDK存在。 对于我们的高级用户来说,这是一个经常出现的绊脚石:
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 runner 可移植的另一个好处是,你现在可以像任何常规的可执行程序一样调试你的测试用例。例如,在 Visual Studio 中,你可以这样简单完成:
- 在你的解决方案管理器中导航到你准备执行的测试项目,右键并选择
设置为启动项目
- 跳转到你希望调试的测试用例,然后加上断点
- 在菜单中选择
调试
->开始调试
来执行测试项目
还可以使用 --filter
来过滤你希望调试的方式或者一组方法来加速你的调试体验。例如 --filter MSTestNamespace.UnitTest1.TestMethod2
来仅仅执行 (调试) 选中的测试方法 TestMethod2
。在这里 可以发现更多支持的过滤器。下面是一个 launchSettings.json
的示例。
{
"profiles": {
"MSTestProject": {
"commandName": "Project",
"commandLineArgs": "--filter MSTestNamespace.UnitTest1.TestMethod2"
}
}
}
最后,我们正在支持 MSTest 的原生 AOT 兼容,以便支持在原生 AOT 模式下测试你的应用。为了达到这个目标,我们需要显著的修改 MSTest 的内部处理。如果你感觉这个功能很有价值,请参阅 add a comment or thumbs up on our GitHub issue。
性能
MSTest runner 使用一个进程来运行测试(与 dotnet test 相比),以节省生成服务器上的资源。
它还避免了对进程间序列化通信的需求,并依靠现代 .NET API 来提高并行性并减少占用空间。
在切换到使用新的 MSTest runner 的内部 Microsoft 项目中,我们看到了 CPU 和内存的大量节省。看到的一些项目能够以 3 倍的速度完成测试,同时在使用 dotnet test 运行时使用的内存减少 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 runner,以使其更可靠。
MSTest runner 由于其新体系结构,不依赖于文件夹扫描、动态加载或反射来检测和加载扩展。这样可以更轻松地在本地和 CI 中执行相同的行为,并显著缩短启动测试应用程序和运行第一个测试之间的时间。
运行器被设计为全程异步和可并行化,从而防止在使用 VSTest 时可能注意到的一些挂起或死锁。
运行器不检测目标框架或平台,或任何其他 .NET 配置。它完全依赖于 .NET 平台来做到这一点。这避免了逻辑的重复,并避免了许多边缘情况,这些情况在规则突然改变时会破坏您的测试。
扩展性
MSTest 运行器基于新的准系统测试平台和扩展性模型,可以轻松扩展或覆盖测试执行的许多方面。
现在,您可以轻松提供自己的报告生成器、测试编排、记录器,甚至增加可用的命令行选项。
Microsoft 提供了可选扩展列表,以便你具备运行测试和排除测试故障所需的所有内容。
我们将继续努力提供更多扩展和功能,以丰富您的测试体验。如果您有特定需求或想帮助扩展库,请联系我们。
总结
MSTest 运行器是一种高性能、可托管、可扩展、可靠且集成的解决方案,用于运行 MSTest 测试。无论您是技术爱好者,还是面临 VSTest 的一些问题,或者只是好奇,我们都欢迎您尝试并在本文下方分享您的反馈。