dotnet 使用 MSTestRunner 將單元測試製作為獨立可執行檔案

lindexi發表於2024-04-26

以往的單元測試都是不能單獨作為一個獨立的可執行檔案跑的,需要在 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

相關文章