首页 > 其他分享 >dotnet 使用 MSTestRunner 将单元测试制作为独立可执行文件

dotnet 使用 MSTestRunner 将单元测试制作为独立可执行文件

时间:2024-04-26 09:36:47浏览次数:16  
标签:可执行文件 git MSTestRunner 单元测试 dotnet using 运行

以往的单元测试都是不能单独作为一个独立的可执行文件跑的,需要在 VisualStudio 或 VSTest 或 dotnet test 里面运行。这就限制了运行单元测试的环境了,有时候开发者可能期望在无 SDK 或开发环境下执行单元测试,这时就可以用到本文介绍的 MSTestRunner 功能,将单元测试制作为独立可执行文件

将单元测试制作为可执行文件,运行此可执行文件即可运行单元测试。可执行文件可以作为独立框架发布的方式,如此可以在一些纯净的环境里面运行,或者是将单元测试打包分发给测试同事,请测试同事在大批量的设备上进行执行。如此可见,将单元测试制作为可执行文件在许多地方都有用武之地,如:

  • 在纯净系统环境运行
  • 在大批量设备统一执行
  • 允许外置工具调试单元测试执行情况

以上的 “允许外置工具调试单元测试执行情况” 一般指的是现有的性能调试工具,现有的性能调试工具基本都对独立应用程序支持的非常好,通过将单元测试制作为独立可执行文件可以更加方便与现有的性能调试工具进行对接

以下将和大家介绍如何利用 MSTestRunner 的功能,将单元测试制作为独立可执行文件

在开始之前,先建立一个简单的控制台项目。按照 dotnet 的惯例,先安装上 MSTest 这个 NuGet 库,可以编辑 csproj 文件,添加以下代码用来快速安装

  <ItemGroup>
    <PackageReference Include="MSTest" Version="3.2.0" />
  </ItemGroup>

为了让项目最终构建出来的是一个可执行文件,这里需要确保项目的输出类型是 Exe 类型,如下面代码

    <OutputType>Exe</OutputType>

再添加最关键的一句配置属性,即开启 MSTestRunner 的功能。配置此属性之后,且删除项目原本的 Program 文件,即可构建出测试项目的可执行文件

  <!-- 用 MSTest 测试运行器 -->
  <EnableMSTestRunner>true</EnableMSTestRunner>

编辑完成的 csproj 项目文件代码大概如下

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>net8.0</TargetFramework>
    <ImplicitUsings>enable</ImplicitUsings>
    <Nullable>enable</Nullable>
    <PublishAot>true</PublishAot>
    <InvariantGlobalization>true</InvariantGlobalization>

    <!-- 用 MSTest 测试运行器 -->
    <EnableMSTestRunner>true</EnableMSTestRunner>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="MSTest" Version="3.2.0" />
  </ItemGroup>

</Project>

接着咱开始编写一个简单的单元测试用来测试一下此方式的行为

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using Microsoft.VisualStudio.TestTools.UnitTesting;

namespace BearcenikoriDajebeqehe;

[TestClass]
public class TestClass
{
    [TestMethod]
    public void Foo()
    {
        var a = 1;
        a++;
        Assert.AreEqual(2, a);
    }
}

尝试构建项目,然后直接运行 exe 文件,大概就可以看到以下输出内容

Passed! - Failed: 0, Passed: 1, Skipped: 0, Total: 1, Duration: 289ms - BearcenikoriDajebeqehe.exe

可以使用命令行将其进行独立发布,如下面的命令行代码,将发布在 Linux 上的独立框架的可执行文件

dotnet publish -c release -r linux-x64 --self-contained true

以上发布内容可以在 Linux 上运行,本文这里通过 SyncTool 将输出内容同步到我的 UOS(统信国产 Linux 系统)系统上运行,运行结果界面如下图

这时就体现出这个功能的方便性起来了,原本我的 UOS(统信国产 Linux 系统)系统是不带任何的开发环境的,且在上面的开发体验现在还是不如在 Windows 上熟悉和舒服的。通过将单元测试构建为独立可执行文件,我就可以在 UOS 上只做测试的活,不参与具体的开发。将单元测试构建出来的可执行文件归档起来,通过单元测试可以更好的批量的测试其系统版本之间的行为差异。更多关于国产 UOS 的开发,欢迎加入 810052083 群讨论

本文以上代码放在githubgitee 欢迎访问

可以通过如下方式获取本文的源代码,先创建一个空文件夹,接着使用命令行 cd 命令进入此空文件夹,在命令行里面输入以下代码,即可获取到本文的代码

git init
git remote add origin https://gitee.com/lindexi/lindexi_gd.git
git pull origin 14c457e0d9933ba10e5eaf3873384bb3b9a0c26d

以上使用的是 gitee 的源,如果 gitee 不能访问,请替换为 github 的源。请在命令行继续输入以下代码

git remote remove origin
git remote add origin https://github.com/lindexi/lindexi_gd.git
git pull origin 14c457e0d9933ba10e5eaf3873384bb3b9a0c26d

获取代码之后,进入 BearcenikoriDajebeqehe 文件夹

如果一个单元测试项目里面包含了多个单元测试方法,在做独立的可执行文件时,期望运行过程中只运行里面的部分方法,可以和原本的 vstest 或 dotnet test 一样添加过滤条件,也就是在执行时添加 --filter 参数和对应的条件内容,用法和 dotnet test 的用法相同,只是将命令行前面的 dotnet test 换成最终输出的可执行文件

详细请参阅 Run selected unit tests - .NET Microsoft Learn

标签:可执行文件,git,MSTestRunner,单元测试,dotnet,using,运行
From: https://www.cnblogs.com/lindexi/p/17991175

相关文章

  • 为 IIncrementalGenerator 增量 Source Generator 源代码生成项目添加单元测试
    本文属于IIncrementalGenerator增量SourceGenerator源代码生成入门系列博客,本文将和大家介绍如何为源代码生成项目添加单元测试添加单元测试的作用不仅可以用来实现通用的单元测试提高质量的功能,还能用来辅助调试IIncrementalGenerator增量SourceGenerator源代码生成项......
  • dotnet 简单方法在一个进程内同时跑起 WPF 和 ASP.NET Core 框架
    从设计架构上,无论是WPF还是ASP.NETCore框架,都是在dotnet运行时上层的应用,两个框架处于平级的结构。理论上讲,两个平级的框架只要不存在特殊的情况,都是能够相容存在的。本文将和大家介绍一个非常简单的方法,在一个进程内同时跑起WPF和ASP.NETCore框架在一个进程内同时跑......
  • 一步步教你在 Windows 上构建 dotnet 系应用的 UOS 软件安装包
    本文将详细指导大家如何逐步为dotnet系列应用创建满足UOS统信系统软件安装包的要求。在这里,我们所说的dotnet系列应用是指那些能够在Linux平台上构建UI框架的应用,包括但不限于CPF应用、UNO应用、Avalonia应用等基于dotnet系的自发布自包含的能力,可以将dotnet系......
  • dotnet C# 使用 Win32 函数获取用户下载文件夹的路径的方法
    大家都知道,在dotnet里面的可以使用Environment.GetFolderPath方法配合Environment.SpecialFolder枚举列出当前运行环境下的一些特殊文件夹。然而SpecialFolder枚举不包含对Download下载文件夹的枚举值,如咱需要获取用户当前的下载文件夹,需要使用Win32方法来辅助获取在......
  • dotnet 修复 GitHub Action 构建过程提示 NETSDK1127 错误
    本文告诉大家,如何修复GitHubAction构建过程提示errorNETSDK1127:ThetargetingpackMicrosoft.WindowsDesktop.App.WindowsFormsisnotinstalled.Pleaserestoreandtryagain.错误在进行GitHubAction构建时,如果自己的项目是一个旧项目,采用旧的.NETSDK版本,将可......
  • dotnet 如何将 Microsoft.Maui.Graphics 对接到 UNO 框架
    本文将和大家介绍如何将Microsoft.Maui.Graphics对接到UNO框架里面。一旦完成Microsoft.Maui.Graphics对接,即可让UNO框架复用现有的许多绘制的基础设施和现有基础库,且可以更进一步与MAUI打通众所周知,在UNO里面有大量的项目类型都是基于Skia作为底层渲染引擎构建出......
  • dotnet 已知问题 错误标记 MethodImplOptions.InternalCall 特性参数将会在类型访问之
    本文将记录一个dotnet的已知问题。当自己不小心在方法上不正确标记了MethodImplAttribute特性时,错误选择了MethodImplOptions.InternalCall参数,那将会在运行的过程在,在此类型被访问之前就抛出了System.TypeLoadException异常,错误信息是Internalcallmethodwithnon_NUL......
  • dotnet 警惕 C# 的 is var 写法
    本文将和大家介绍C#语言设计里面,我认为比较坑的一个语法。通过isvar的写法,会让开发者误以为null是不被包含的,然而事实是在这里的var是被赋予含义的,将被允许null通过判断逻辑,于是就会让开发者收到了奇怪的空异常比如看看以下的代码,大家猜猜控制台是否会输出IFoo?foo......
  • dotnet UNO 如何在调试下输出界面层级结构
    本文将告诉大家如何在UNO里面将界面的层级结构输出到调试窗口实现方法非常简单,和WPF或UWP等的方法是一样的,那就是通过可视化树遍历的方式,如以下代码staticclassUISpyHelper{publicstaticvoidSpy(thisDependencyObjectelement){......
  • dotnet 使用 windbg 运行脚本方式自动批量调试处理 dump 文件
    本文将和大家介绍一个简单且实际用途不大的使用windbg配合脚本的方式,进行自动化的大批量对dotnet系应用的dump进行自动化分析调试处理,可以自动根据调试需求输出dump文件的一些信息利用windbg执行调试脚本的能力,可以实现自动化调试dump文件,将调试dump文件获取的信息......