MSTest 程式碼分析

MSTest 分析 (“MSTESTxxxx”) 規則會檢查您的 C# 或 Visual Basic 程式代碼是否有安全性、效能、設計和其他問題。

提示

如果您使用 Visual Studio,許多分析工具規則都有相關聯的 代碼修正,您可以套用以更正問題。 程式碼修正會顯示在燈泡圖示功能表中。

規則會組織成類別,例如效能使用方式...

從 MSTest.TestFramework 3.7 開始,MSTest.Analyzers NuGet 套件是架構的相依性。 針對舊版,您必須使用 MSTest 中繼套件,或明確新增 MSTest.Analyzers 的套件參考。

MSTestAnalysisMode

從 MSTest 3.8 開始,可以使用名為 MSTestAnalysisMode 的 MSBuild 屬性來確定哪些分析器在不同的嚴重性級別下被啟用。

提示

若要查看哪個模式下啟用了哪些規則及其嚴重性,您可以瀏覽至 NuGet 快取中您感興趣的版本套件,找出 globalconfigs 目錄,然後開啟對應於分析模式的 .globalconfig 檔案。 如需尋找 NuGet 快取目錄的詳細資訊,請參閱 管理全域套件、快取和暫存資料夾。 從該目錄中,找出 mstest.analyzers 目錄,然後找到 版本 (3.8 和更新版本),然後 globalconfigs。 或者,您可以從 nuget.org 下載您所感興趣的 NuGet 套件,並在 NuGet 套件總管(Windows 應用程式)中檢視,或者直接在 NuGet 套件總管的 Web 應用程式版本中檢視。

此屬性的可用值:

None

此值會將所有分析器設定為 none 嚴重性,並停用所有分析器。 然後,您可以使用 .editorconfig 或 .globalconfig 檔案來啟用個別分析器。

Default

此設定會遵循每個規則的預設記載行為。

  • 默認啟用的規則會使用其預設嚴重性。
  • 默認停用的規則會使用 none 嚴重性。

備註

預設以警告形式啟用的規則,是預期會在執行時引發問題的違規行為。

這是大部分開發人員預期使用的模式。 預設以 Info【suggestion】嚴重性啟用的規則會被提升為警告。 下列規則會在Recommended和All模式中被升級為錯誤:

All

此模式比 Recommended更咄咄逼人。 所有規則都會啟用為警告。 此外,下列規則會提升為錯誤:

各類別規則

分析儀規則分為以下類別:

設計規則

設計規則 可協助您建立和維護符合適當設計和良好作法的測試套件。

效能規則

效能規則 支援高效能測試。

抑制規則

隱藏規則 支持隱藏來自其他規則的診斷。

使用規則

使用規則 支援 MSTest 的適當使用方式。

按概念分類的規則

尋找依常見測試情境與概念組織的規則:

測試結構與屬性

有助於確保你的測試類別與方法被正確結構化和標註的規則:

  • MSTEST0002 - 測試類別應該是有效的
  • MSTEST0003 - 測試方法應該是有效的
  • MSTEST0004 - 公共類型應該是測試類別
  • MSTEST0007 - 在測試方法上使用 屬性
  • MSTEST0016 - 測試類別應該有測試方法
  • MSTEST0029 - 公開方法應該是測試方法
  • MSTEST0030 - 含有測試方法的型別應該是測試類別
  • MSTEST0036 - 不要使用遮蔽
  • MSTEST0041 - 在測試類別中使用基於條件的屬性
  • MSTEST0044 - 偏好 TestMethod 勝過 DataTestMethod
  • MSTEST0056 - TestMethodAttribute 應當正確設定 DisplayName
  • MSTEST0057 - TestMethodAttribute 應該傳播來源資訊
  • MSTEST0060 - 重複 TestMethodAttribute
  • MSTEST0063 - 測試類別應該有有效的建構子
  • MSTEST0069 - 繼承 [TestClass] 被 MSTest 來源產生器忽略
  • MSTEST0071 - 測試方法不應指定與其名稱相等的顯示名稱
  • MSTEST0072 - [AssemblyFixtureProvider] 不支援預先編譯
  • MSTEST0078 - [DependsOn] 論證應該是有效的
  • MSTEST0081 - [TestFilterProvider] 應參考有效的測試過濾器類型
  • MSTEST0082 - 測試類別繼承了來自不同 MSTest 版本的生命週期或測試方法
  • MSTEST0085 - [TestClass] 不應應用於抽象類別
  • MSTEST0086 - 移除冗餘的測試方法屬性

相關文件: 使用 MSTest 撰寫測試

非同步/await 模式

正確撰寫非同步測試程式碼的規則:

  • MSTEST0013 - AssemblyCleanup 應該是有效的(包含非同步規則)
  • MSTEST0027 - 省略測試方法中的非同步後綴
  • MSTEST0028 - 測試夾具方法中抑制非同步後綴
  • MSTEST0039 - 使用較新的 Assert.Throws 方法(非同步變體)
  • MSTEST0040 - 避免在非同步 void 上下文中使用斷言
  • MSTEST0045 - 使用合作取消來處理超時
  • MSTEST0049 - 流程測試上下文消除令牌
  • MSTEST0054 - 使用 CancellationToken 屬性
  • MSTEST0064 - 偏好非同步斷言方法
  • MSTEST0067 - 避免在測試程式碼中同步阻擋呼叫

相關文件: TestContext

數據驅動測試

資料驅動測試情境的規則:

相關文件: 數據驅動測試

生命週期與初始化

測試初始化、清理與生命週期管理的規則:

  • MSTEST0008 - TestInitialize 應該是有效的
  • MSTEST0009 - TestCleanup 應該是有效的
  • MSTEST0010 - ClassInitialize 應該是有效的
  • MSTEST0011 - ClassCleanup 應該是有效的
  • MSTEST0012 - AssemblyInitialize 應該是有效的
  • MSTEST0013 - AssemblyCleanup 應該是有效的
  • MSTEST0019 - 偏好 TestInitialize 而非建構子
  • MSTEST0020 - 偏好建構子而非 TestInitialize
  • MSTEST0021 - 偏好處置勝過測試清理
  • MSTEST0022 - 優先使用 TestCleanup 而非 Dispose
  • MSTEST0034 - 使用 ClassCleanupBehavior.EndOfClass
  • MSTEST0047 - 在初始化與清理方法中,針對未使用的 TestContext 參數抑制 IDE0060
  • MSTEST0050 - 全域性測試裝置應該有效
  • MSTEST0066 - [Ignore] 應指定理由

相關文件: 生命週期

Assertions

正確且有效地使用斷言方法的規則:

相關文件: 斷言

TestContext

正確使用 TestContext 物件的規則:

相關文件: TestContext

平行測試安全

有助於平行測試協調對共享資源的使用並避免程序層級狀態的規則:

  • MSTEST0073 - 資源鍵偏好常數[ResourceLock]
  • MSTEST0074 - 測試變異程序全域狀態應宣告資源鎖
  • MSTEST0075 - 避免在平行測試中更改目前的目錄
  • MSTEST0076 - 避免在平行化測試中變更整個處理序的文化特性
  • MSTEST0077 - 避免在平行測試中使用硬編碼或共用的檔案系統路徑

相關文件: 測試執行與控制、 TestContext

測試組態

配置測試執行、平行化及其他測試設定的規則:

  • MSTEST0001 - 使用 Parallelize 屬性
  • MSTEST0015 - 測試方法不應被忽視
  • MSTEST0031 - 不要使用 System.ComponentModel.DescriptionAttribute
  • MSTEST0035 - 使用 DeploymentItem 搭配測試方法或測試類別
  • MSTEST0043 - 在測試方法中使用 retry 屬性
  • MSTEST0045 - 使用合作取消來處理超時
  • MSTEST0055 - 不要忽略字串方法的回傳值
  • MSTEST0059 - 正確使用 Parallelize 屬性
  • MSTEST0061 - 使用 OSCondition 屬性代替執行時檢查
  • MSTEST0070 - [MemberCondition] 論證應該是有效的
  • MSTEST0072 - [AssemblyFixtureProvider] 不支援預先編譯
  • MSTEST0078 - [DependsOn] 論證應該是有效的
  • MSTEST0079 - 使用 ArchitectureCondition 屬性代替執行時檢查
  • MSTEST0080 - 使用 CICondition 屬性代替環境檢查
  • MSTEST0081 - [TestFilterProvider] 應參考有效的測試過濾器類型
  • MSTEST0082 - 測試類別繼承了來自不同 MSTest 版本的生命週期或測試方法
  • MSTEST0083 - 在 Process.Start 之前,使用 [ExecutableCondition] 取代 File.Exists 檢查
  • MSTEST0084 - 平台相容性屬性應一致於 [OSCondition]

相關文件: 設定 MSTest, 執行測試

所有規則(快速參考)

規則識別碼 類別 Title 預設嚴重度
MSTEST0001 Performance 使用 Parallelize 屬性 Info
MSTEST0002 Usage 測試類別應當有效 警告
MSTEST0003 Usage 測試方法應該是有效的 警告→錯誤*
MSTEST0004 Design 公開類型應該是測試類別 Info
MSTEST0005 Usage TestContext 應該是有效的 警告
MSTEST0006 Design 避免 ExpectedException 屬性 Info
MSTEST0007 Usage 在測試方法上使用屬性 警告
MSTEST0008 Usage TestInitialize 應該是有效的 警告
MSTEST0009 Usage TestCleanup 應當是有效的 警告
MSTEST0010 Usage ClassInitialize 應該是有效的 警告
MSTEST0011 Usage ClassCleanup 必須有效 警告
MSTEST0012 Usage AssemblyInitialize 應該是有效的 警告
MSTEST0013 Usage AssemblyCleanup 應該是有效的 警告
MSTEST0014 Usage DataRow 必須是有效的 警告
MSTEST0015 Design 測試方法不應被忽視 無(選擇加入)
MSTEST0016 Design 測試類別應該有測試方法 Info
MSTEST0017 Usage 斷言 arg 應該以正確的順序傳遞 Info
MSTEST0018 Usage DynamicData 應為有效 警告
MSTEST0019 Design 偏好 TestInitialize 而非建構子 無(選擇加入)
MSTEST0020 Design 偏好建構子而非 TestInitialize 無(選擇加入)
MSTEST0021 Design 偏好使用Dispose方法而非TestCleanup方法 無(選擇加入)
MSTEST0022 Design 偏好 TestCleanup 而非 Dispose 無(選擇加入)
MSTEST0023 Usage 不要否定布林斷言 Info
MSTEST0024 Usage 請勿儲存靜態的 TestContext 警告
MSTEST0025 Design 偏好使用 Assert.Fail 方法而非使用永遠為假的條件。 Info
MSTEST0026 Usage 斷言式 arg 應避免條件存取 Info
MSTEST0027 Suppression 抑制測試方法中的 async 後綴 N/A
MSTEST0028 Suppression 在測試夾具方法中抑制非同步後綴 N/A
MSTEST0029 Design 公共方法應為測試方法 Info
MSTEST0030 Usage 包含測試方法的型別應該是測試類別 警告
MSTEST0031 Usage 請勿使用 System.ComponentModel.DescriptionAttribute Info
MSTEST0032 Usage 檢查永真斷言條件 Info
MSTEST0033 Suppression 抑制未初始化的不可空參考 N/A
MSTEST0034 Usage 使用 ClassCleanupBehavior.EndOfClass Info
MSTEST0035 Usage 使用 DeploymentItem 搭配測試方法或測試類別 Info
MSTEST0036 Design 不要使用陰影設置 警告
MSTEST0037 Usage 使用正確的斷言方法 Info
MSTEST0038 Usage 避免使用 Assert.AreSame 與值型別比較 Info
MSTEST0039 Usage 使用較新的 Assert.Throws 方法 Info
MSTEST0040 Usage 避免在 async void 上下文中使用斷言 警告
MSTEST0041 Usage 在測試類別中使用基於條件的屬性 警告
MSTEST0042 Usage 重複資料列 警告
MSTEST0043 Usage 在測試方法上使用 retry 屬性 警告→錯誤*
MSTEST0044 Design 偏好 TestMethod 而非 DataTestMethod Info
MSTEST0045 Design 使用合作式取消逾時 Info
MSTEST0046 Usage 使用 Assert 代替 StringAssert Info
MSTEST0047 Suppression 對 TestContext 參數的 IDE0060 抑制 N/A
MSTEST0048 Usage TestContext 屬性的使用 警告
MSTEST0049 Usage 流程測試上下文消除令牌 Info
MSTEST0050 Usage 全域測試裝置應有效 警告
MSTEST0051 Usage Assert.Throws 應該包含單一陳述句 Info
MSTEST0052 Usage 避免明確使用 DynamicDataSourceType Info
MSTEST0053 Usage 避免在斷言中使用格式參數 Info
MSTEST0054 Usage 使用 CancellationToken 屬性 Info
MSTEST0055 Usage 不要忽略字串方法的回傳值 警告
MSTEST0056 Usage TestMethodAttribute 應該能正確設定 DisplayName。 Info
MSTEST0057 Usage TestMethodAttribute 應該會傳播來源資訊 警告
MSTEST0058 Usage 避免在 catch 區塊中使用斷言 Info
MSTEST0059 Usage 正確使用 Parallelize 屬性 警告
MSTEST0060 Usage 重複的TestMethodAttribute 警告
MSTEST0061 Usage 使用 OSCondition 屬性代替執行時檢查 Info
MSTEST0062 Usage 避免使用 out/ref 測試方法參數 警告
MSTEST0063 Usage 測試類別應該有有效的建構子 警告
MSTEST0064 Usage 偏好非同步斷言方法 Info
MSTEST0065 Usage 避免在集合類型上使用 Assert.AreEqual 警告
MSTEST0066 Design [Ignore] 應該指定理由 Info
MSTEST0067 Usage 避免在測試程式碼中同步阻擋呼叫 資訊(預設為停用)
MSTEST0068 Usage 使用 Assert,而不是使用 CollectionAssert Info
MSTEST0069 Usage 繼承的 [TestClass] 會被 MSTest 原始碼產生器忽略 警告
MSTEST0070 Usage [MemberCondition] 論證應該是有效的 警告
MSTEST0071 Usage 測試方法不應指定與其名稱相等的顯示名稱 Info
MSTEST0072 Usage [AssemblyFixtureProvider] 不支援預先編譯 警告
MSTEST0073 Usage 資源索引鍵 [ResourceLock] 應優先使用常數 Info
MSTEST0074 Usage 會變更程序全域狀態的測試應宣告資源鎖 Info
MSTEST0075 Usage 避免在平行化測試中更改目前的目錄 Info
MSTEST0076 Usage 避免在平行化測試中變更整個處理程序的文化特性 Info
MSTEST0077 Usage 避免在平行測試中使用硬編碼或共用的檔案系統路徑 Info
MSTEST0078 Usage [DependsOn] 論證應該是有效的 警告
MSTEST0079 Usage 使用 ArchitectureCondition 屬性代替執行時檢查 Info
MSTEST0080 Usage 使用 CICondition 屬性代替環境檢查 Info
MSTEST0081 Usage [TestFilterProvider] 應參考有效的測試過濾器類型 警告
MSTEST0082 Usage 測試類別繼承了不同 MSTest 版本的生命週期或測試方法 警告
MSTEST0083 Usage 在 Process.Start 之前,使用 [ExecutableCondition] 而非 File.Exists 檢查 Info
MSTEST0084 Usage 平台相容性屬性應與 [OSCondition] 一致 Info
MSTEST0085 Usage [TestClass] 不應應用於抽象類別 Info
MSTEST0086 Usage 移除冗餘的測試方法屬性 Info
MSTEST0087 Usage 避免重複的 DataRow 顯示名稱 警告

* 運行於Recommended和All模式時已升級為錯誤狀態。

MSTESTEXP

MSTest 的數個 API 會以 ExperimentalAttribute裝飾。 這個屬性表示 API 是實驗性的,而且在未來的 MSTest 版本中可能會移除或變更。 屬性是用來識別尚未穩定且可能不適合生產用途的 API。

MSTESTEXP 診斷會警示您在程式代碼中使用實驗 API。 若要使用 SuppressMessageAttribute隱藏此診斷,請將下列程式代碼新增至您的專案:

using System.Diagnostics.CodeAnalysis;

[assembly: SuppressMessage("MSTESTEXP", "Justification")]

或者,您可以將下列程式代碼新增至專案,以使用預處理器指示詞隱藏此診斷:

#pragma warning disable MSTESTEXP
        // API that is causing the warning.
#pragma warning restore MSTESTEXP