共用方式為


Microsoft.Testing.Platform 概觀

Microsoft.Testing.Platform 是作為 VSTest 的輕量型且可攜式的替代方案,可在所有情境中執行測試,包括持續整合 (CI) 管線、CLI、Visual Studio Test Explorer 和 VS Code Text Explorer。 Microsoft.Testing.Platform 直接內嵌在測試專案中,而且沒有其他應用程式相依性,例如執行測試所需的 vstest.consoledotnet test

Microsoft.Testing.Platform 為開放原始碼。 您可以在 microsoft/testfx GitHub 存放庫中找到 Microsoft.Testing.Platform 程式代碼。

Microsoft.Testing.Platform 支柱

這個新的測試平臺是以 .NET 開發人員體驗測試小組的經驗為基礎,旨在解決自 2016 年 .NET Core 發行以來遇到的挑戰。 雖然 .NET Framework 與 .NET Core/.NET 之間具有高度的相容性,但外掛程式系統等一些主要功能,以及 .NET 編譯的新可能形式因素,使得隨著目前 VSTest 平臺 架構而發展或完全支援新的運行時間功能相當複雜。

新測試平臺演進的主要驅動因素如下所述:

  • 確定性的特性:確保在不同的環境中執行相同的測試(本機、持續整合)會產生相同的結果。 新的運行時間不依賴反映或任何其他動態 .NET 運行時間功能來協調測試回合。

  • 執行時透明度:測試執行時不會干擾測試框架的程式碼,也不會建立隔離的上下文,例如 AppDomainAssemblyLoadContext,並且不會使用反射或自定義組件解析器。

  • 編譯時間註冊延伸模組:擴充功能,例如測試架構和進程外延伸模組,會在編譯期間註冊,以確保確定性,並協助偵測不一致。

  • 零相依性:平臺的核心是單一 .NET 元件,Microsoft.Testing.Platform.dll,其沒有支援的運行時間以外的相依性。

  • 可託管:測試執行環境可以在任何 .NET 應用程式中託管。 雖然主控台應用程式通常用來執行測試,但您可以在任何類型的 .NET 應用程式中建立測試應用程式。 這可讓您在特殊內容中執行測試,例如裝置或瀏覽器,可能會有限制。

  • 支援所有 .NET 尺寸:支援目前和未來的 .NET 尺寸,包括原生 AOT。

  • 高效能:尋找功能和擴充點之間的正確平衡,以避免使用非基本程式代碼使運行時間膨脹。 新的測試平臺是設計來「協調」測試回合,而不是提供如何執行測試的實作詳細數據。

  • 具備足夠的延展性:新平臺建置於擴展性點之上,以允許運行時執行的最大化自訂。 它可讓您設定測試進程主機、觀察測試程式,以及從測試主機進程內的測試架構取用資訊。

  • 單一模組部署:可裝載性功能可啟用單一模組部署模型,其中單一編譯結果可用來支援跨進程和跨進程的所有擴充點,而不需要運送不同的可執行模組。

支援的測試架構

  • MSTest。 在 MSTest 中,Microsoft.Testing.Platform 的支持是透過 msTest 執行器 來完成。
  • NUnit。 在 NUnit 中,Microsoft.Testing.Platform 的支持是透過 NUnit 執行器來完成。
  • xUnit.net:在 xUnit.net 中,Microsoft.Testing.Platform 的支持是透過 xUnit.net 執行器來完成。
  • TUnit:完全建構在 Microsoft.Testing.Platform之上,如需詳細資訊,請參閱 TUnit 檔

執行和偵錯測試

Microsoft.Testing.Platform 測試專案會建置為可以直接執行的可執行檔(或偵錯)。 沒有多餘的運行控制台或命令。 如果發生錯誤,應用程式會以非零結束代碼結束,這在大部分可執行檔中都是典型的。 如需已知結束代碼的詳細資訊,請參閱 Microsoft.Testing.Platform 結束代碼

提示

您可以使用 --ignore-exit-code 命令列選項來忽略特定 結束代碼

您也可以使用 TestingPlatformCommandLineArguments MSBuild 屬性,設定套用至項目檔中特定測試專案的命令行選項。 其中一個常見的使用案例是,測試專案會忽略所有測試,通常會以結束代碼 8 結束(測試會話執行零測試)。 在此案例中,您可以在項目檔中的 PropertyGroup 底下新增下列內容:

<TestingPlatformCommandLineArguments>$(TestingPlatformCommandLineArguments) --ignore-exit-code 8</TestingPlatformCommandLineArguments>

重要

根據預設,Microsoft.Testing.Platform 會收集遙測。 如需有關退出的更多詳細資訊和選項,請參閱 Microsoft.Testing.Platform 遙測

使用 dotnet publish 發佈測試專案,並直接執行應用程式,是執行測試的另一種方式。 例如,執行 ./Contoso.MyTests.exe。 在某些情況下,您也可以使用 dotnet build 來產生可執行檔,但可能會有邊緣案例需要考慮,例如 Native AOT

使用 dotnet run

dotnet run 命令可用來建置及執行您的測試專案。 這是執行測試的最簡單方式,雖然有時最慢。 當您在本機編輯和執行測試時,使用 dotnet run 很實用,因為它可確保在需要時重建測試專案。 dotnet run 也會自動在目前資料夾中尋找專案。

dotnet run --project Contoso.MyTests

如需 dotnet run的詳細資訊,請參閱 dotnet run

使用 dotnet exec

dotnet execdotnet 命令是用來執行已建置的測試專案(或執行),這是直接執行應用程式的替代方案。 dotnet exec 需要建置測試專案 dll 的路徑。

dotnet exec Contoso.MyTests.dll

dotnet Contoso.MyTests.dll

注意

提供測試項目可執行檔案的路徑(*.exe)會導致錯誤:

Error:
  An assembly specified in the application dependencies manifest
  (Contoso.MyTests.deps.json) has already been found but with a different
  file extension:
    package: 'Contoso.MyTests', version: '1.0.0'
    path: 'Contoso.MyTests.dll'
    previously found assembly: 'S:\t\Contoso.MyTests\bin\Debug\net8.0\Contoso.MyTests.exe'

如需 dotnet exec的詳細資訊,請參閱 dotnet exec

使用 dotnet test

Microsoft.Testing.Platform 提供與 vstest.console.exedotnet test 的相容性層,以確保您可以在啟用新的執行案例時如前一樣執行測試。

dotnet test Contoso.MyTests.dll

選項

下列清單僅說明平台選項。 若要查看每個擴充功能帶來的特定選項,請參閱延伸模組檔頁面或使用 --help 選項。

  • @

    指定回應檔的名稱。 回應檔名稱必須緊接在 @ 字元後面,中間不能有空格。

    回應檔中的選項將被解讀為彷彿它們在命令列的那個位置。 響應檔中的每個自變數都必須在同一行開始和結束。 您無法使用反斜杠字元 () 串連行。 使用回應檔案可以幫助處理可能超出終端機限制的長命令行。 您可以將回應檔與內嵌命令行自變數結合。 例如:

    ./TestExecutable.exe @"filter.rsp" --timeout 10s
    

    其中 filter.rsp 可以有下列內容:

    --filter "A very long filter"
    

    或者,單一 rsp 檔案可用來指定逾時和篩選,如下所示:

    ./TestExecutable.exe @"arguments.rsp"
    
    --filter "A very long filter"
    --timeout 10s
    
  • --config-file

    指定 testconfig.json 檔案。

  • --diagnostic

    啟用診斷記錄。 預設的日誌層級是 Trace。 檔案會以以下命名格式寫入輸出目錄:log_[MMddHHssfff].diag

  • --diagnostic-filelogger-synchronouswrite

    強制內建檔案記錄器同步寫入記錄。 適用於如果程序崩潰時,您不想遺失任何日誌條目的情況。 這會讓測試執行變慢。

  • --diagnostic-output-directory

    如果未指定,診斷記錄的輸出目錄會在預設的 TestResults 目錄中產生。

  • --diagnostic-output-fileprefix

    記錄檔名稱的前置詞。 預設為 "log_"

  • --diagnostic-verbosity

    當使用 --diagnostic 開關時,定義訊息顯示的詳盡程度。 可用的值為 TraceDebugInformationWarningErrorCritical

  • --exit-on-process-exit

    如果依賴進程結束,則離開測試進程。 必須提供 PID。

  • --help

    輸出有關如何使用命令的說明。

  • -ignore-exit-code

    允許忽略某些非零結束代碼,並改為以 0傳回 。 如需更多資訊,請參閱 忽略特定退出代碼

  • --info

    顯示 .NET 測試應用程式的進階資訊,例如:

    • 平臺。
    • 環境。
    • 每個已註冊的命令行提供者,例如其 nameversiondescriptionoptions
    • 每個已註冊的工具,例如其 commandnameversiondescription和所有命令行提供者。

    這項功能可用來瞭解那些將註冊相同命令列選項的擴充功能,或多個擴充功能版本(或平台)之間的可用選項變化。

  • --list-tests

    列出可用的測試。 不會執行測試。

  • --maximum-failed-tests

    指定達到的測試失敗數目上限,當達到時,將會停止測試回合。 若要支援此切換,架構作者需要實作 IGracefulStopTestExecutionCapability 功能。 到達該測試失敗數量時的退出代碼為13。 如需詳細資訊,請參閱 Microsoft.Testing.Platform 結束代碼

    注意

    此功能可從 1.5 版開始的 Microsoft.Testing.Platform 中使用。

  • --minimum-expected-tests

    指定預期要執行的測試數目下限。 根據預設,至少應該執行一個測試。

  • --results-directory

    要放置測試結果的目錄。 如果指定的目錄不存在,則會建立它。 預設是在包含測試應用程式的目錄中的 TestResults

  • --timeout

    全域測試執行逾時。 採用一個自變數做為字串,格式 <value>[h|m|s] 其中 <value> 為 float。

MSBuild 整合

NuGet 套件 Microsoft.Testing.Platform.MSBuild 提供各種與 MSBuild Microsoft.Testing.Platform 整合:

  • 支援 dotnet test。 如需詳細資訊,請參閱 dotnet test integration
  • 需要支援 ProjectCapability,以供 Visual StudioVisual Studio Code 測試總管使用。
  • 自動產生進入點 (Main 方法)。
  • 自動產生組態檔。

注意

此整合功能以遞歸方式運作(如果一個專案引用了另一個參考此封裝的專案,該專案將如同直接引用了此封裝),而且可以透過 IsTestingPlatformApplication MSBuild 屬性來停用。

另請參閱