以往的單元測試都是不能單獨作爲一個獨立的可執行文件跑的,需要在 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 羣討論
可以通過如下方式獲取本文的源代碼,先創建一個空文件夾,接着使用命令行 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
換成最終輸出的可執行文件