原文 | Amaury Levé, Marco Rossignoli, Jakub Jareš
翻譯 | 鄭子銘
我們很高興推出 MSTest runner,這是一個用於 MSTest 測試的新型輕量級運行程序。這個新的運行程序使測試更加便攜和可靠,使測試運行得更快,並且可擴展,爲您提供點菜測試體驗,以添加成功所需的工具。
它是什麼?
MSTest 運行程序是一種將 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.Sdk
MSTest.TestAdapter
MSTest.TestFramework
MSTest.Analyzers
-->
<PackageReference Include="MSTest" Version="3.2.0" />
</ItemGroup>
</Project>
進行了這些更改後,重建測試項目,您的測試將創建一個直接運行測試的可執行文件:
在上面的屏幕截圖中,您可以看到我們不需要運行 dotnet 測試、使用 vstest.console 或在 Visual Studio 中運行來運行我們的測試。我們的測試只是一個發現並運行測試的普通控制檯應用程序。
也就是說,運行器確實與 dotnet test、vstest.console、Visual Studio Test Explorer 和 Visual Studio Code Test Explorer 集成,爲您提供與您習慣的相同的體驗。請參閱我們的文檔以瞭解更多信息。
使用 runner 與 VSTest 的優點
可移植性
直接從可執行文件運行測試消除了運行測試通常所需的大量複雜性和基礎設施。由於測試項目不再特殊,因此您可以使用現有的 dotnet 工具對測試項目執行有趣的操作,例如將它們構建爲獨立的:
dotnet publish --runtime win-x64 --self-contained
上面的示例將發佈測試項目及其需要運行的運行時。這允許您將項目移動到沒有此運行時的計算機,並在多臺計算機上運行測試,而無需進行額外的設置。
或者,您可以使用此功能在每次失敗的測試運行後創建一個 zip 文件,以與在 CI 服務器上失敗的方式相同的方式在本地重現故障,並獲得一種簡單的方法來交互式調試失敗的運行。
下面是針對託管在沒有可用 dotnet SDK 的 docker 容器中的 dotnet 應用程序運行測試的另一個示例。對於我們的高級用戶來說,這是一個經常遇到問題的場景:
RunInDocker> docker build . -t my-server-tests
RunInDocker> 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)
MSTest 運行程序可移植性的另一個優點是,您現在可以像調試任何常規可執行文件一樣輕鬆調試測試。例如,在 Visual Studio 中,您現在可以簡單地:
- 在解決方案資源管理器中導航要運行的測試項目,右鍵選擇它並選擇設置爲啓動項目。
- 導航到要調試的測試並添加斷點
- 選擇“調試”>“開始調試”(或使用 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 test 運行時能夠以 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 的一些問題還是隻是好奇,我們都歡迎您嘗試並在本文下面分享您的反饋。
特別感謝
我們要感謝團隊,他們的不懈努力和堅定不移的承諾使這一功能得以實現。
此外,我們還要對幫助dogfood並支持這一舉措的內部團隊表示衷心的感謝。
原文鏈接
Introducing the MSTest Runner – CLI, Visual Studio, & More
本作品採用知識共享署名-非商業性使用-相同方式共享 4.0 國際許可協議進行許可。
歡迎轉載、使用、重新發布,但務必保留文章署名 鄭子銘 (包含鏈接: http://www.cnblogs.com/MingsonZheng/ ),不得用於商業目的,基於本文修改後的作品務必以相同的許可發佈。
如有任何疑問,請與我聯繫 ([email protected])