當前位置: 妍妍網 > 碼農

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

2024-01-31碼農

以往的單元測試都是不能單獨作為一個獨立的可執行檔跑的,需要在 VisualStudio 或 VSTest 或 dotnet test 裏面執行。這就限制了執行單元測試的環境了,有時候開發者可能期望在無 SDK 或開發環境下執行單元測試,這時就可以用到本文介紹的 MSTestRunner 功能,將單元測試制作為獨立可執行檔

將單元測試制作為可執行檔,執行此可執行檔即可執行單元測試。可執行檔可以作為獨立框架釋出的方式,如此可以在一些純凈的環境裏面執行,或者是將單元測試打包分發給測試同事,請測試同事在大批次的裝置上進行執行。如此可見,將單元測試制作為可執行檔在許多地方都有用武之地,如:

  • 在純凈系統環境執行

  • 在大批次裝置統一執行

  • 允許外接工具偵錯單元測試執行情況

  • 以上的 「允許外接工具偵錯單元測試執行情況」 一般指的是現有的效能偵錯工具,現有的效能偵錯工具基本都對獨立應用程式支持的非常好,透過將單元測試制作為獨立可執行檔可以更加方便與現有的效能偵錯工具進行對接

    以下將和大家介紹如何利用 MSTestRunner 的功能,將單元測試制作為獨立可執行檔

    在開始之前,先建立一個簡單的控制台計畫。按照 dotnet 的慣例,先安裝上 MSTest 這個 NuGet 庫,可以編輯 csproj 檔,添加以下程式碼用來快速安裝

    <ItemGroup>
    <PackageReferenceInclude="MSTest"Version="3.2.0"/>
    </ItemGroup>

    為了讓計畫最終構建出來的是一個可執行檔,這裏需要確保計畫的輸出型別是 Exe 型別,如下面程式碼

    <OutputType>Exe</OutputType>

    再添加最關鍵的一句配置內容,即開啟 MSTestRunner 的功能。配置此內容之後,且刪除計畫原本的 Program 檔,即可構建出測試計畫的可執行檔

    <!-- 用 MSTest 測試執行器 -->
    <EnableMSTestRunner>true</EnableMSTestRunner>

    編輯完成的 csproj 計畫檔程式碼大概如下

    <ProjectSdk="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>
    <PackageReferenceInclude="MSTest"Version="3.2.0"/>
    </ItemGroup>
    </Project>


    接著咱開始編寫一個簡單的單元測試用來測試一下此方式的行為

    usingSystem;
    usingSystem.Collections.Generic;
    usingSystem.Linq;
    usingSystem.Text;
    usingSystem.Threading.Tasks;
    usingMicrosoft.VisualStudio.TestTools.UnitTesting;
    namespaceBearcenikoriDajebeqehe;
    [Test class]
    public classTest class
    {
    [TestMethod]
    publicvoidFoo()
    {
    vara=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 群討論

    本文以上程式碼放在github 和 gitee 歡迎存取

    可以透過如下方式獲取本文的原始碼,先建立一個空資料夾,接著使用命令列 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:https://learn.microsoft.com/en-us/dotnet/core/testing/selective-unit-tests?pivots=mstest