介绍 MSTest Runner – CLI、Visual Studio 等

news2024/11/15 23:36:32

作者:Amaury Levé Marco Rossignoli Jakub Jareš
排版:Alan Wang

我们很高兴推出 MSTest 运行器,这是一款全新的轻量级 MSTest 测试运行器。这个新的运行器使测试更加便携和可靠,运行速度更快,并且具有可扩展性,可以为您提供自选式的测试体验,以及为您添加成功所需的工具。

它是什么?

MSTest Runner 是一种将 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>

进行这些更改后,重新构建您的测试项目,您的测试将创建一个直接运行测试的可执行文件:
在这里插入图片描述
完整示例 – Simple1
在上面的屏幕截图中,您可以看到我们不需要运行 dotnet test、使用 vstest.console 或在 Visual Studio 中运行来运行我们的测试。我们的测试只是一个用于发现并运行测试的普通控制台应用程序。

也就是说,运行器确实与 dotnet test、vstest.console、Visual Studio Test Explorer 和 Visual Studio Code Test Explorer 集成,为您提供与您习惯相同的体验。请参阅我们的文档以了解更多信息。

使用运行器 对比 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)

完整示例 – RunInDocker

MSTest 运行器可移植性的另一个优点是,您现在可以像调试任何常规可执行文件一样轻松调试测试。例如,在 Visual Studio 中,您现在可以简单地进行如下操作:

  1. 在“解决方案资源管理器”中导航要运行的测试项目,右键选择它并选择“Set as Startup Project”。
  2. 导航到要调试的测试并添加断点
  3. 选择 Debug > Start Debugging(或使用 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 测试时,完成测试的速度提高了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 时遇到一些问题还是只是好奇,我们都欢迎您尝试一下并在本文下面分享您的反馈。

特别感谢

我们要感谢团队的不懈努力和坚定不移的承诺使这一功能得以实现。

此外,我们还要对帮助试用并支持这一举措的内部团队表示衷心的感谢。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1437783.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何安装x11vnc并结合cpolar实现win远程桌面Deepin

文章目录 1. 安装x11vnc2. 本地远程连接测试3. Deepin安装Cpolar4. 配置公网远程地址5. 公网远程连接Deepin桌面6. 固定连接公网地址7. 固定公网地址连接测试 正文开始前给大家推荐个网站&#xff0c;前些天发现了一个巨牛的 人工智能学习网站&#xff0c; 通俗易懂&#xff…

【C++】基础知识讲解(命名空间、缺省参数、重载、输入输出)

&#x1f308;个人主页&#xff1a;秦jh__https://blog.csdn.net/qinjh_?spm1010.2135.3001.5343&#x1f525; 系列专栏&#xff1a;http://t.csdnimg.cn/eCa5z 目录 命名空间 命名空间的定义 命名空间的使用 命名空间的嵌套使用 C输入&输出 std命名空间的使用惯例&…

穿越周期,海信稳居全球第二的底气和底盘

【潮汐商业评论/原创】 颠覆创新&#xff0c;凡墙皆是门&#xff0c;而因循守旧&#xff0c;凡门皆是墙。 面对充满不确定性的时代&#xff0c;用什么驱散迷雾走向增长&#xff1f;这是当下中国大部分企业所面临的困惑。 选择用什么答案来应对这个问题&#xff0c;也决定了企…

stable-diffusion | v1-5-pruned.ckpt和v1-5-pruned-emaonly.ckpt的区别

https://github.com/runwayml/stable-diffusion?tabreadme-ov-file#reference-sampling-script 对于 1.5 模型&#xff0c;其中可能包括四部分&#xff1a;标准模型、文本编码器、VAE模型、EMA模型。 标准模型&#xff1a;生成图片的核心模块&#xff0c;潜空间中的前向扩散和…

【Django】Django中的缓存

缓存 1 缓存的定义 定义&#xff1a;缓存是一类可以更快的读取数据的介质统称&#xff0c;也指其他可以加快数据读取的存储方式&#xff0c;一般用来存储临时数据&#xff0c;常用介质的是读取速度很快的内存。 意义&#xff1a;视图渲染有一定成本&#xff0c;数据库的频繁查…

电力负荷预测 | Matlab实现基于LSTM长短期记忆神经网络的电力负荷预测模型(结合时间序列)

文章目录 效果一览文章概述源码设计参考资料效果一览 文章概述 电力负荷预测 | Matlab实现基于LSTM长短期记忆神经网络的电力负荷预测模型(结合时间序列) 所谓预测,就是指通过对事物进行分析及研究,并运用合理的方法探索事物的发展变化规律,对其未来发展做出预先估计和判断…

UE4 C++创建摄像机摇臂和相机并且设置Transform

新建MyPawn C类 .h #include "GameFramework/SpringArmComponent.h" //SpringArm组件 #include "Camera/CameraComponent.h" //Camera组件class 工程名称_API AMyPawn : public APawn { //定义组件变量 public:UPROPERTY(VisibleAnywhere, BlueprintRead…

【数据库原理及应用】简答题归纳总结

第一章 数据库概论 1.人工管理阶段数据管理的特点&#xff1a; &#xff08;1&#xff09;数据不保存在机器中 &#xff08;2&#xff09;无专用的软件对数据进行管理 &#xff08;3&#xff09;只有程序的概念&#xff0c;没有文件的概念 &#xff08;4&#xff09;数据面向程…

2024-02-06 TCP/UDP work

1. 画出TCP三次握手和四次挥手的示意图&#xff0c;并且总结TCP和UDP的区别 三次握手&#xff1a; 4次挥手&#xff1a; tcp/udp区别 TCP 1. 稳定&#xff0c;提供面向连接的&#xff0c;可靠的数据传输服务 2. 传输过程中&#xff0c;数据无误、数据无丢失、数据无失序、…

在 Docker 中启动 ROS2 里的 rivz2 和 rqt 出现错误的解决方法

1. 出现错误&#xff1a; 运行 ros2 run rivz2 rivz2 &#xff0c;报错如下 &#xff1a; No protocol specified qt.qpa.xcb: could not connect to display :1 qt.qpa.plugin: Could not load the Qt platform plugin "xcb" in "" even though it was f…

[自然语言处理|NLP] 文本分类与情感分析,数据预处理流程,包括了同义词替换和拼写纠正,以及使用NLTK库和TextBlob库进行标记化和情感分析(附代码)

[自然语言处理|NLP] 文本分类与情感分析,数据预处理流程,包括了同义词替换和拼写纠正,以及使用NLTK库和TextBlob库进行标记化和情感分析(附代码)。 自然语言处理(Natural Language Processing,简称NLP)是人工智能领域的一个重要分支,涉及了处理和理解人类语言的技术…

2024年R2移动式压力容器充装证模拟考试题库及R2移动式压力容器充装理论考试试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2024年R2移动式压力容器充装证模拟考试题库及R2移动式压力容器充装理论考试试题是由安全生产模拟考试一点通提供&#xff0c;R2移动式压力容器充装证模拟考试题库是根据R2移动式压力容器充装最新版教材&#xff0c;R2…

centos 7.6 安装cas 对接ldap 单点登录实战

centos 7.6 安装cas 对ldap 单点登录实战 1、安装前准备工作1.1、centos 7.6 安装JDK 1.81.2、centos 7 安装tomcat 9.0.841.3、windows10 安装JDK 1.81.4、windows10 安装打包工具 maven 3.9.6 2、下载cas 5.3 并打包成war包3、部署cas到tomcat4、cas对接ldap 1、安装前准备工…

百度拟将量子实验室捐赠予北京量子院 /一汽解放与华为合作,预计2025年底量产自动驾驶产品 |魔法半周报

我有魔法✨为你劈开信息大海❗ 高效获取AIGC的热门事件&#x1f525;&#xff0c;更新AIGC的最新动态&#xff0c;生成相应的魔法简报&#xff0c;节省阅读时间&#x1f47b; &#x1f525;资讯预览 百度捐赠量子实验室推进量子计算研究&#xff0c;助力人工智能发展 一汽解放…

qt学习:mplayer播放器(视频)+arm如何播放视频实战+c启动播放器

目录 作用 linux下载 arm下载 使用方法 键盘 命令 命令词有很多&#xff0c;举例几个 在arm上qt实战 配置ui界面 添加头文件&#xff0c;成员&#xff0c;函数 添加视频按钮点击事件 列表选项双击事件 播放按钮点击事件 暂停继续按钮点击事件 停止按钮点击事件 …

远程主机可能不符合glibc和libstdc++ VS Code服务器的先决条件

报错信息 VSCode无法连接远程服务器&#xff0c;终端一直提醒&#xff1a; [22:46:01.906] > Waiting for server log... [22:46:01.936] > Waiting for server log... [22:46:01.951] > [22:46:01.967] > Waiting for server log... [22:46:01.982] > [22:…

我在项目中使用Redis的几个场景

目录 缓存 会话存储 分布式锁 消息队列 位统计 计数器 排行榜 缓存 缓存的目的是为了提高系统响应速度、减少数据库等资源的压力&#xff0c;redis作为键值对形式的内存数 据库&#xff0c;可以提供非常快速的读取速度&#xff0c;使得它成为存储热点数据或频繁访问数…

iPhone 14支持NFC吗?如果支持,那么怎么启用

你准备好通过启用NFC来释放iPhone 14的全部潜力了吗&#xff1f;如果你曾经想知道如何在你的设备上利用NFC&#xff0c;那么你就来对地方了。 在本综合指南中&#xff0c;我们将引导你完成在iPhone 14上激活NFC的步骤&#xff0c;使你能够无缝连接其他设备&#xff0c;进行非接…

Linux------命令行参数

目录 前言 一、main函数的参数 二、命令行控制实现计算器 三、实现touch指令 前言 当我们在命令行输入 ls -al &#xff0c;可以查看当前文件夹下所有文件的信息&#xff0c;还有其他的如rm&#xff0c;touch等指令&#xff0c;都可以帮我们完成相应的操作。 其实运行这些…

c#cad 创建-直线(五)

运行环境 vs2022 c# cad2016 调试成功 一、代码说明 这段代码是用于在AutoCAD中创建一条直线。首先获取当前活动文档和数据库的引用&#xff0c;然后创建一个编辑器对象用于提示用户输入。接下来&#xff0c;在一个事务中获取模型空间的块表记录&#xff0c;并定义直线的长度…