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嚴重性。
備註
預設以警告形式啟用的規則,是預期會在執行時引發問題的違規行為。
Recommended
這是大部分開發人員預期使用的模式。 預設以 Info【suggestion】嚴重性啟用的規則會被提升為警告。 下列規則會在Recommended和All模式中被升級為錯誤:
All
此模式比 Recommended更咄咄逼人。 所有規則都會啟用為警告。 此外,下列規則會提升為錯誤:
備註
下列規則會自行選擇加入,並且不會在 Default、Recommended或 All 模式中啟用:
各類別規則
分析儀規則分為以下類別:
設計規則
設計規則 可協助您建立和維護符合適當設計和良好作法的測試套件。
效能規則
效能規則 支援高效能測試。
抑制規則
隱藏規則 支持隱藏來自其他規則的診斷。
使用規則
使用規則 支援 MSTest 的適當使用方式。
按概念分類的規則
尋找依常見測試情境與概念組織的規則:
測試結構與屬性
有助於確保你的測試類別與方法被正確結構化和標註的規則:
- MSTEST0002 - 測試類別應該是有效的
- MSTEST0003 - 測試方法應該是有效的
- MSTEST0004 - 公共類型應該是測試類別
- MSTEST0007 - 在測試方法上使用 屬性
- MSTEST0016 - 測試類別應該有測試方法
- MSTEST0029 - 公開方法應該是測試方法
- MSTEST0030 - 含有測試方法的型別應該是測試類別
- MSTEST0036 - 不要使用遮蔽
- MSTEST0041 - 在測試類別中使用基於條件的屬性
- MSTEST0044 - 偏好 TestMethod 勝過 DataTestMethod
- MSTEST0056 - TestMethodAttribute 應當正確設定 DisplayName
- MSTEST0057 - TestMethodAttribute 應該傳播來源資訊
- MSTEST0060 - 重複 TestMethodAttribute
- MSTEST0063 - 測試類別應該有有效的建構子
相關文件:使用 MSTest 撰寫測試,屬性
非同步/await 模式
正確撰寫非同步測試程式碼的規則:
- MSTEST0013 - AssemblyCleanup 應該是有效的(包含非同步規則)
- MSTEST0027 - 省略測試方法中的非同步後綴
- MSTEST0028 - 測試夾具方法中抑制非同步後綴
- MSTEST0039 - 使用較新的 Assert.Throws 方法(非同步變體)
- MSTEST0040 - 避免在非同步 void 上下文中使用斷言
- MSTEST0045 - 使用合作取消來處理超時
- MSTEST0049 - 流程測試上下文消除令牌
- MSTEST0054 - 使用 CancellationToken 屬性
相關文件: TestContext
數據驅動測試
資料驅動測試情境的規則:
- MSTEST0007 - 在測試方法上使用 屬性
- MSTEST0014 - DataRow 應該是有效的
- MSTEST0018 - DynamicData 應該是有效的
- MSTEST0042 - 重複資料列
- MSTEST0052 - 避免明確使用 DynamicDataSourceType
- MSTEST0062 - 避免使用 out/ref 測試方法的參數
相關文件: 用於資料驅動測試的屬性
生命週期與初始化
測試初始化、清理與生命週期管理的規則:
- MSTEST0008 - TestInitialize 應該是有效的
- MSTEST0009 - TestCleanup 應該是有效的
- MSTEST0010 - ClassInitialize 應該是有效的
- MSTEST0011 - ClassCleanup 應該是有效的
- MSTEST0012 - AssemblyInitialize 應該是有效的
- MSTEST0013 - AssemblyCleanup 應該是有效的
- MSTEST0019 - 偏好 TestInitialize 而非建構子
- MSTEST0020 - 偏好建構子而非 TestInitialize
- MSTEST0021 - 偏好處置勝過測試清理
- MSTEST0022 - 優先使用 TestCleanup 而非 Dispose
- MSTEST0034 - 使用 ClassCleanupBehavior.EndOfClass
- MSTEST0050 - 全域性測試裝置應該有效
相關文件: 生命週期
Assertions
正確且有效地使用斷言方法的規則:
- MSTEST0006 - 避免預期例外屬性
- MSTEST0014 - DataRow 應該是有效的
- MSTEST0017 - 斷言 args 應以正確順序傳遞
- MSTEST0023 - 不要否定布林值斷言式
- MSTEST0025 - 偏好使用 Assert.Fail 而非總是假條件
- MSTEST0026 - 斷言 arg 應避免條件存取
- MSTEST0032 - 檢視永遠為真的斷言條件
- MSTEST0037 - 使用正確的斷言方法
- MSTEST0038 - 避免 Assert.AreSame 與價值類型
- MSTEST0039 - 使用較新的 Assert.Throws 方法
- MSTEST0046 - 使用 Assert 代替 StringAssert
- MSTEST0051 - Assert.Throws 應該包含單一陳述
- MSTEST0053 - 避免使用 Assert 格式參數
- MSTEST0058 - 避免在 catch 區塊中使用斷言
相關文件: 斷言
TestContext
正確使用 TestContext 物件的規則:
- MSTEST0005 - TestContext 應該是有效的
- MSTEST0024 - 不要儲存靜態的 TestContext
- MSTEST0033 - 抑制未初始化不可空參考的警告
- MSTEST0048 - TestContext 屬性的使用
- MSTEST0049 - 流程測試上下文消除令牌
- MSTEST0054 - 使用 CancellationToken 屬性
相關文件: TestContext
測試組態
配置測試執行、平行化及其他測試設定的規則:
- MSTEST0001 - 使用 Parallelize 屬性
- MSTEST0015 - 測試方法不應被忽視
- MSTEST0031 - 不要使用 System.ComponentModel.DescriptionAttribute
- MSTEST0035 - 使用 DeploymentItem 搭配測試方法或測試類別
- MSTEST0043 - 在測試方法中使用 retry 屬性
- MSTEST0045 - 使用合作取消來處理超時
- MSTEST0055 - 不要忽略字串方法的回傳值
- MSTEST0059 - 正確使用 Parallelize 屬性
- MSTEST0061 - 使用 OSCondition 屬性代替執行時檢查
所有規則(快速參考)
| 規則識別碼 | 類別 | 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 |
| 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 | 測試類別應該有有效的建構子 | 警告 |
* 運行於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