介绍 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. SXYZ-6.27专题比赛

    好的,现在正式定义今天的比赛为一场伤心的比赛. ↑这张图片首先能说明一些问题,但这并不是关键. ↓这才是伤心的关键 ↑第一题文件输入输入爆 ↑第二题文件名直接爆 评语,一个比一个离谱! 然后只是很简单 ...

  2. 【赵渝强老师】Oracle数据库的存储结构

    Oracle的存储结构分为:物理存储结构和逻辑存储结构. 一.物理存储结构:指硬盘上存在的文件 数据文件(data file) 一个数据库可以由多个数据文件组成的,数据文件是真正存放数据库数据的.一个 ...

  3. eBPF 概述:第 4 部分:在嵌入式系统运行

    1. 前言 在本系列的第 1 部分和第 2 部分,我们介绍了 eBPF 虚拟机内部工作原理,在第 3 部分我们研究了基于底层虚拟机机制之上开发和使用 eBPF 程序的主流方式. 在这一部分中,我们将从 ...

  4. 关于softmax在CV多通道中的理解

    1.采用分类任务时,我们通常会采用逻辑回归算法,最关键的步骤就是将线性模型输出的实数域映射到[0, 1]表示概率分布的有效实数空间,其中Sigmoid函数刚好具有这样的功能.但是这通常只适用于二分类问 ...

  5. OOOPS:零样本实现360度开放全景分割,已开源 | ECCV'24

    全景图像捕捉360°的视场(FoV),包含了对场景理解至关重要的全向空间信息.然而,获取足够的训练用密集标注全景图不仅成本高昂,而且在封闭词汇设置下训练模型时也受到应用限制.为了解决这个问题,论文定义 ...

  6. 云原生周刊:K8s 的 YAML 技巧 | 2023.12.4

    开源项目推荐 Helmfile Helmfile 是用于部署 Helm Chart 的声明性规范.其功能有: 保留图表值文件的目录并维护版本控制中的更改. 将 CI/CD 应用于配置更改. 定期同步以 ...

  7. KubeSphere 后端源码深度解析

    这篇文章我们将学习在 vscode 上的 ssh remote 插件基础上,尝试 debug 和学习 KubeSphere 后端模块架构. 前提 安装好 vscode 以及 ssh remote co ...

  8. C++ 命令行传参 参数使用 坐标参数的转换

    目录 1. 什么是命令行传参 2. 如何传参 3. 应用实例 4. 问题 1. 什么是命令行传参 命令行传参就是在 cmd 命令提示符, 或者 Linux shell 中使用可执行程序时, 可以添加 ...

  9. Java编程案例(专题)

    文章目录 案例一:买飞机票 案例二:开发验证码 案例三:评委打分 案例四:数字加密 案例五:数组拷贝 案例六:抢红包 案例七:找素数 案例八:模拟双色球 8.1 手动投注 8.2 随机开奖号码 8.3 ...

  10. 我开源了一个短视频应用(Go+React)|DouTok2.0 项目介绍

    前言 大家好,这里是白泽,拖更了一段时间,抱歉.在 DouTok2.0 可以初步允许大家接入开发之后,这篇文章才得以出炉. DouTok:一个开源的 web 端的短视频应用,采用微服务架构,包含前后端 ...