介绍 MSTest Runner – CLI、Visual Studio 等

作者: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.SdkMSTest.TestAdapterMSTest.TestFrameworkMSTest.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-testsRunInDocker> 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.rhkb.cn/news/256315.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

leetcode 461. 汉明距离

比较简单的一题&#xff0c;先对两个整数进行异或操作&#xff0c;会将两个整数二进制形式中各个数字进行异或操作&#xff0c;不同的数字则为1&#xff0c;再通过移位操作统计得到的二进制数中为1的个数&#xff0c;即为所求。 Java代码如下&#xff1a; class Solution {pub…

Android SystemConfig相关

SystemConfig在哪里初始化 它声明在PackageManagerService类的静态方法main()中。在该方法中间定义Injector类对象时&#xff0c;作为它的构造参数。它是调用的SystemConfig.getInstance()实现初始化&#xff0c;之后能通过Injector类对象的getSystemConfig()得到SystemConfig类…

计算机网络——网络安全

计算机网络——网络安全 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家&#xff0c; [跳转到网站](https://www.captainbed.cn/qianqiu) 小程一言专栏链接: [link](http://t.csdnimg.cn/ZUTXU) 网络安全何…

PyTorch深度学习实战(26)——多对象实例分割

PyTorch深度学习实战&#xff08;26&#xff09;——多对象实例分割 0. 前言1. 获取并准备数据2. 使用 Detectron2 训练实例分割模型3. 对新图像进行推断小结系列链接 0. 前言 我们已经学习了多种图像分割算法&#xff0c;在本节中&#xff0c;我们将学习如何使用 Detectron2 …

单页404源码

<!doctype html> <html> <head> <meta charset"utf-8"> <title>简约 404错误页</title><link rel"shortcut icon" href"./favicon.png"><style> import url("https://fonts.googleapis.co…

C# 字体大小的相关问题

设置字体大小无法这么写&#xff0c; button1.Font.Size 20&#xff1b; 这个是只读属性&#xff1b; 把字体大小改为16&#xff0c; button2.Font new Font(button2.Font.Name, 16); 程序运行的时候先看一下窗体和控件的默认字体尺寸&#xff0c;都是9&#xff1b;然后点b…

jsp教务管理系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 JSP 教务管理系统是一套完善的java web信息管理系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为 TOMCAT7.0,Myeclipse8.5开发&#xff0c;数据库为Mysql5.0&…

人脸追踪案例及机器学习认识

1.人脸追踪机器人初制 用程序控制舵机运动的方法与机械臂项目完全相同。 由于摄像头的安装方式为上下倒转安装&#xff0c;我们在编写程序读取图像时需使用 flip 函数将 图像上下翻转。 现在&#xff0c;只需要使用哈尔特征检测得到人脸在图像中的位置&#xff0c;再指示舵机运…

Docker容器输入汉字触发自动补全

一、描述 输入汉字自动触发补全&#xff1a; Display all 952 possibilities? (y or n)是因为容器中没有中文字符集和中文字体导致的&#xff0c;安装中文字体&#xff0c;并设置字符集即可。 二、解决 1、安装字符集 &#xff08;1&#xff09;查看系统支持的字符集 lo…

使用Cargo创建、编译与运行Rust项目

在 Rust 开发中&#xff0c;Cargo 是一个非常重要的工具&#xff0c;它负责项目的构建、管理和依赖管理。以下是如何使用 Cargo 创建、编译和运行 Rust 项目的详细步骤。 1. 创建新项目 首先确保你已经在计算机上安装了 Rust 和 Cargo。然后&#xff0c;在命令行中输入以下命…

HarmonyOS 横屏调试与真机横屏运行

我们有些程序 需要横屏才能执行出效果 我们在预览器上 点击如下图指向出 就进入一个横屏调试了 但 我们真机运行 依旧是竖着的 我们如下图 找到 module.json5 在 abilities 下面 第一个对象 最下面 加上 "orientation": "landscape"然后 我们再真机运…

【深度学习】基于多层感知机的手写数字识别

案例2&#xff1a;构建自己的多层感知机: MNIST手写数字识别 相关知识点: numpy科学计算包&#xff0c;如向量化操作&#xff0c;广播机制等 1 任务目标 1.1 数据集简介 ​ MNIST手写数字识别数据集是图像分类领域最常用的数据集之一&#xff0c;它包含60,000张训练图片&am…

算法沉淀——位运算(leetcode真题剖析)

算法沉淀——位运算 常用位运算总结1.基础位运算2.确定一个数中第x位是0还是13.将一个数的第x位改成14.将一个数的第x位改成05.位图6.提取一个数最右边的17.删掉一个数最右边的18.异或运算9.基础例题 力扣题目讲解01.面试题 01.01. 判定字符是否唯一02.丢失的数字03.两整数之和…

opencv mat用法赋值克隆的操作和一些基本属性

//Mat基本结构 (头部 数据部分) //赋值的话 就是修改了指针位置 但还是指向了原来数据 并没创建数据 本质上并没有变 //只有克隆或者拷贝时 它才会真正复制一份数据 //代码实现 //创建方法 - 克隆 //Mat m1 src.clone(); //复制 //Mat m2; //src.copyTo(m2); //赋值法 …

Git的基础操作指令

目录 1 前言 2 指令 2.1 git init 2.2 touch xxx 2.3 git status 2.4 git add xxx 2.5 git commit -m xxxx 2.5 git log及git log --prettyoneline --all --graph --abbrev-commit 2.6 rm xxx 2.7 git reset --hard xxx(含小技巧) 2.8 git reflog 2.9 mv xxx yyy 1…

Verilog刷题笔记30

题目&#xff1a; You are provided with a BCD one-digit adder named bcd_fadd that adds two BCD digits and carry-in, and produces a sum and carry-out. 解题&#xff1a; module top_module( input [399:0] a, b,input cin,output cout,output [399:0] sum );reg [99…

Stream流学习笔记

Stream流 创建流中间操作1、filter2、map3、distinct4、sorted5、limit6、skip7、flatMap 终结操作1、forEach2、count3、max&min4、collect5、查找与匹配 创建流 单例集合&#xff1a;集合对象.stream() List<Integer> list new ArrayList<>(); Stream<…

海外云手机——平台引流的重要媒介

随着互联网的飞速发展&#xff0c;跨境电商、短视频引流以及游戏行业等领域正经历着迅猛的更新换代。在这个信息爆炸的时代&#xff0c;流量成为至关重要的资源&#xff0c;而其中引流环节更是关乎业务成功的关键。海外云手机崭露头角&#xff0c;成为这一传播过程中的重要媒介…

jsp课程教学管理系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 JSP 课程教学管理系统是一套完善的java web信息管理系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为 TOMCAT7.0,Myeclipse8.5开发&#xff0c;数据库为Mysql5.0…

Codeforces Round 923 (Div. 3) E. Klever Permutation (Java)

比赛链接&#xff1a;Round 923 (Div. 3) EE题传送门&#xff1a;E. Klever Permutation 题目&#xff1a;E. Klever Permutation 样例 #1 样例输入 #1 5 2 2 3 2 10 4 13 4 7 4样例输出 #1 2 1 1 3 2 1 8 4 10 2 7 5 9 3 6 4 10 1 13 5 9 2 12 6 8 3 11 7 1 6 3 7 2 5 4分…