Microsoft。測試平台(MTP)故障排除

本文包含關於 MTP 的故障排除指引。

出口代碼

MTP 使用已知的退出碼來通報測試失敗或應用程式錯誤。 出口代碼從 和 0 開始,且為非負數。

退出代碼 詳細資訊
0 退出碼 0 表示成功。 所有被選中執行的測試都順利完成,且沒有錯誤。
1 1出口代碼表示未知錯誤,並充當萬用代碼。 如需更多錯誤資訊與細節,請參考輸出。
2 使用退出代碼 2 表示至少有一次測試失敗。
3 退出代碼 3 表示測試會話已被中止。 例如,可以使用 Ctrl+C 中止一個會話。
4 退出碼 4 表示已使用擴充功能的設定無效,測試會話無法執行。
5 退出碼 5 表示傳送給測試應用程式的命令列參數無效。
6 (已不再使用) 退出碼 6 不再由平台產生;先前表示測試會話使用未實作的功能。
7 退出代碼 7 表示測試會話無法成功完成,且很可能當機。 這可能是因為測試會話透過測試控制器的延伸點執行所致。
8 退出碼 8 表示測試會話沒有執行任何測試。
9 退出碼 9 表示已執行測試的最低執行政策被違反。
10 退出碼 10 表示測試介面卡(Testing.Platform Test Framework、MSTest、NUnit 或 xUnit)因與測試本身無關的基礎設施原因未能執行測試。 例如未能建立測試所需的夾具。
11 退出碼 11 表示測試程序將退出,當相依程序退出時。
12 退出碼 12 顯示測試會話無法執行,因為用戶端不支援任何支援的協定版本。
13 退出碼 13 表示測試會話因命令 --maximum-failed-tests 列選項達到最大失敗次數而停止。 欲了解更多資訊,請參閱 MTP CLI 選項參考中的選項部分

要啟用詳細日誌並排除問題,請參見 診斷紀錄

忽略特定的出口代碼

MTP 預設設計為嚴格,但允許可配置性。 因此,使用者可以決定哪些出口代碼要忽略(會回傳一個退出代碼 0 ,而非原本的退出代碼)。

要忽略特定的退出碼,可以使用 --ignore-exit-code 命令列選項或環境 TESTINGPLATFORM_EXITCODE_IGNORE 變數。 被接受的有效格式是以分號分隔的退出代碼列表,以忽略(例如, --ignore-exit-code 2;3;8)。 一個常見情境是,測試失敗不應該導致非零的退出代碼(即忽略退出代碼 2)。

診斷記錄

該平台內建診斷日誌,協助你排除測試執行時的疑慮。 你可以透過命令列選項或環境變數啟用診斷日誌。

命令列選項

下列 平台選項 提供針對測試應用程式進行疑難解答的實用資訊:

  • --info
  • --diagnostic
  • --diagnostic-synchronous-write
  • --diagnostic-verbosity
  • --diagnostic-file-prefix
  • --diagnostic-output-directory

環境變數

你也可以使用環境變數啟用診斷日誌:

環境變數名稱 Description
TESTINGPLATFORM_DIAGNOSTIC 若設為 1,則啟用診斷記錄功能。
TESTINGPLATFORM_DIAGNOSTIC_VERBOSITY 定義冗長層級。 可用的值為 TraceDebugInformationWarningErrorCritical
TESTINGPLATFORM_DIAGNOSTIC_OUTPUT_DIRECTORY 診斷記錄的輸出目錄,如果未指定的話,檔案會產生在預設的 TestResults 目錄中。
TESTINGPLATFORM_DIAGNOSTIC_OUTPUT_FILEPREFIX 記錄檔名稱的前置詞。 預設為 "log_"
TESTINGPLATFORM_DIAGNOSTIC_FILELOGGER_SYNCHRONOUSWRITE 強制內建檔案記錄器同步寫入記錄。 適用於如果程序崩潰時,您不想遺失任何日誌條目的情況。 這會讓測試執行變慢。

備註

環境變數的優先順序高於命令行自變數。

解決設定錯誤

Microsoft.Testing.Platform.MSBuild

以下是與 Microsoft.Testing.Platform.MSBuild 相關的常見設定錯誤。

錯誤 CS8892:方法 'TestingPlatformEntryPoint.Main(string[])' 不會被用作進入點,因為已經找到同步進入點 'Program.Main(string[])'。

在測試專案中手動定義入口點(Main)或從已有入口點的應用程式中引用測試專案,會導致與 MTP 產生的入口點衝突。 若要避免此問題,請採取下列其中一個步驟:

  • 請移除您手動定義的程式進入點,通常是位於 Main中的 方法,並讓測試平臺自動為您產生一個。

  • 藉由設定 <GenerateTestingPlatformEntryPoint>false</GenerateTestingPlatformEntryPoint> MSBuild 屬性來停用進入點的產生。

  • 在參考測試專案的項目中設定 Microsoft.Testing.Platform.MSBuild MSBuild 屬性,以完全停用 <IsTestingPlatformApplication>false</IsTestingPlatformApplication> 的可轉移相依性。 當您從非測試專案參考測試專案時,這是必要的,例如一個參考測試應用程式的主控台應用程式。

產生的程式碼命名空間與參考的型別衝突

Microsoft.Testing.Platform.MSBuild 在專案的 SelfRegisteredExtensions 中產生 TestingPlatformEntryPoint$(RootNamespace) 類型。 預設情況下,RootNamespace 會與專案名稱相同,而這可能會與參考組件所公開的、具有相同完整限定名稱的型別發生衝突。

例如,名為 System.Security.Cryptography.ProtectedData.Tests 的專案最終會在 System.Security.Cryptography.ProtectedData 命名空間中產生程式碼。 如果專案也參考了 System.Security.Cryptography.ProtectedData NuGet 套件,而該套件在 System.Security.Cryptography 命名空間下包含一個公開的 ProtectedData 型別,編譯器便無法再區分產生的命名空間與所參考的型別,並會產生如 CS0118(「'ProtectedData' 是命名空間,但卻被當作型別使用」)之類的錯誤。

為了解決衝突,請在測試專案中覆寫 RootNamespace 到一個不會與任何參考型別衝突的值:

<PropertyGroup>
  <RootNamespace>System.Security.Cryptography.ProtectedDataTests</RootNamespace>
</PropertyGroup>

你也可以完全清除 RootNamespace<RootNamespace />),此時產生的類型會被釋放到全域命名空間。

Microsoft.Testing.Extensions.Fakes

Fakes 錯誤 無法解決來自 COR_PROFILER_PATH 和 COR_PROFILER 環境變數的分析器路徑。

如果 bin 資料夾中沒有所有 Fakes 元件,就可能發生此錯誤。

  • 請確定專案使用 MSTest.SDK,或參考 Microsoft.Testing.Extensions.Fakes
  • 對於.NET Framework專案,請避免設定<PlatformTarget>AnyCPU</PlatformTarget>,因為這會導致NuGet無法將所有檔案複製到bin資料夾。

在混合測試框架或擴充套件的解決方案中,命令列選項未被識別

若您的解決方案包含使用不同測試框架(例如 MSTest 與 xUnit.net)或不同擴充套件(例如只有部分專案參考 Microsoft.Testing.Extensions.HangDump),執行 dotnet test 並搭配框架專屬或擴充專屬命令列選項,可能會因退出代碼 5 而失敗。 這個選項對某個專案有效,但另一個專案無法承認。

為了解決這個問題,可以使用 TestingPlatformCommandLineArguments 帶有條件的 MSBuild 屬性,將參數路由到正確的專案。 詳細說明請參閱 「混合測試框架或擴充解決方案」。