介绍 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 testvstest.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)

点击此链接查看完整的 RunInDocker 示例

MSTest runner 可移植的另一个好处是,你现在可以像任何常规的可执行程序一样调试你的测试用例。例如,在 Visual Studio 中,你可以这样简单完成:

  1. 在你的解决方案管理器中导航到你准备执行的测试项目,右键并选择 设置为启动项目
  2. 跳转到你希望调试的测试用例,然后加上断点
  3. 在菜单中选择 调试 -> 开始调试 来执行测试项目

还可以使用 --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 的一些问题,或者只是好奇,我们都欢迎您尝试并在本文下方分享您的反馈。

介绍 MSTest Runner - CLI, Visual Studio 等更多的更多相关文章

  1. Code Runner,率先支持刚发布的 Visual Studio 2022!

    Visual Studio 被不少网友成为"宇宙第一IDE".但是,我写✍ PHP.Java 和 C#,也都是用的 VS Code. 我所在的组,是 Visual Studio C ...

  2. Visual Studio原生开发的10个调试技巧

    这篇文章只介绍了一些有关Visual Studio的基本调试技巧,但是还有其他一些同样有用的技巧.我整理了一些Visual Studio(至少在VS 2008下)原生开发的调试技巧.(如果你是工作在托 ...

  3. Visual Studio 中可执行文件中嵌入的清单文件

    概要 本分步指南介绍如何在 Microsoft Visual Studio 2005年中的可执行文件 (.exe) 文件中嵌入的清单文件.如果您要开发"认证 Windows Vista&qu ...

  4. Visual Studio原生开发的10个调试技巧(一)

    最近碰巧读了Ivan Shcherbakov写的一篇文章,<11个强大的Visual Studio调试小技巧>.这篇文章只介绍了一些有关Visual Studio的基本调试技巧,但是还有其 ...

  5. Cocos开发中Visual Studio下libcurl库开发环境设置

    我们介绍一下win32中Visual Studio下libcurl库开发环境设置.Cocos2d-x引擎其实已经带有为Win32下访问libcurl库,Cocos2d-x 3.x中libcurl库文件 ...

  6. Visual Studio原生开发的10个调试技巧(转)

    本文由 伯乐在线 - JingerJoe 翻译自 Marius Bancila.转载请参见文章末尾处的要求.   [感谢@_La_Isla_Bonita 的热心翻译.如果其他朋友也有不错的原创或译文, ...

  7. 在 Visual Studio 2010 中创建 SharePoint 2010 事件接收器

    Microsoft Visual Studio 2010 提供了一个可用于生成事件接收器的项目类型,事件接收器会在 Microsoft SharePoint 2010 网站上选择事件之前或之后执行操作 ...

  8. 在Visual Studio Code中开发Office Add-in

    作者:陈希章 发表于 2017年7月13日 上一篇 我介绍了如何在Visual Studio中开发Office Add-in,因为有标准的项目模板,一系列配套的工具,尤其是自带的一键调试功能,可以让开 ...

  9. 【转】让开发变得简单一点- Visual Studio 2010几个让人印象深刻的新功能

    原文网址:http://xhinker.blog.51cto.com/640011/313055/ 引言 "我们的目标,不仅仅是做出几个新功能,而是要回答一个问题:'如何让现在的开发人员生活 ...

  10. 利用Visual Studio Natvis 框架简化C++的变量调试工作

    相信用C++开发过UI界面的程序员都对其变量调试工作头痛不已,由于复杂的继承关系,要查看到某个变量往往需要一系列的层层深入的点击,如下图就是查看TextBox的Text的例子: 为了查看Text属性, ...

随机推荐

  1. volatile关键字最全原理剖析

    介绍 volatile是轻量级的同步机制,volatile可以用来解决可见性和有序性问题,但不保证原子性. volatile的作用: 保证了不同线程对共享变量进行操作时的可见性,即一个线程修改了某个变 ...

  2. SQL数据库书的配套资源

    <SQL基础教程(视频教学版)>代码.课件.教学视频 https://pan.baidu.com/s/1QA5m5HN159wi3FX_KNDQzA 提取码: 4m9e <SQL S ...

  3. CSP 联训 3

    好吧,又倒数了,就签了个 T2,100 pts. T1 我把相同颜色的存起来,每种颜色找出枚举选哪两个座位不合法的矩阵的左上和右下,如果找到的矩阵左下和右上也相同,则这个矩阵确实不合法,减去,但判断左 ...

  4. PRT预计算辐射传输方法

    PRT(Precomputed Radiance Transfer)技术是一种用于实时渲染全局光照的方法.它通过预计算光照传输来节省时间,并能够实时重现面积光源下3D模型的全局光照效果. 由于PRT方 ...

  5. nextjs 的函数,参数,属性装饰器的使用

    // 属性装饰器 const doc1:PropertyDecorator = (target:any,val: string | symbol) => { console.log(target ...

  6. DOM 操作的常用 API 有哪些 ?

    DOM 操作的常用 API 就是DOM 通过API (接口)获取页面(html)元素: 1. 节点查询 API 1.1 document.querySelector()  选择第一个匹配的元素 1.2 ...

  7. DNShell

    DNShell 一款基于DNS C2隧道的反弹shell工具. 支持 功能: 支持DNS-recordA-直连型 的C2隧道. 目标: Windows下基于Powershell的反弹. Linux下基 ...

  8. linux 基础(3)基本文件操作

    目录的基本操作 在 linux 文件系统里,以斜杠 / 开头的路径是绝对路径,从根目录开始寻找:其他的路径则都是相对路径,从当前目录(working directory)开始寻找. 相对目录中常用的符 ...

  9. Java面试题中高级进阶(JVM篇01)

    前言 本来想着给自己放松一下,刷刷博客,突然被几道面试题难倒!说说堆和栈的区别?什么时候会触发FullGC?什么是Java虚拟机?似乎有点模糊了,那就大概看一下面试题吧.好记性不如烂键盘 *** 12 ...

  10. python bytecode解析

    python bytecode解析 前言 我们的电脑是怎么运行的呢?计算机内部的 CPU 处理器是个硅片,上面雕刻着精心布置的电路,输入特定的电流,就能得到另一种模式的电流,而且模式可以预测,给这些模 ...