本文包含關於 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 |
定義冗長層級。 可用的值為 Trace、Debug、Information、Warning、Error或 Critical。 |
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.MSBuildMSBuild 屬性,以完全停用<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 屬性,將參數路由到正確的專案。 詳細說明請參閱 「混合測試框架或擴充解決方案」。