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 包资源管理器(Windows 应用)下载感兴趣的 nuget.org 版本的 NuGet 包,也可以在 NuGet 包资源管理器的 Web 应用版本中直接查看它。
此属性的可用值:
None
此值将所有分析器设置为 none 严重性,禁用所有这些分析器。 然后,可以使用 .editorconfig 或 .globalconfig 文件启用单个分析器。
Default
此设置遵循每个规则的默认记录行为。
- 默认情况下启用的规则将使用其默认严重性。
- 默认禁用的规则将使用
none严重级别。
注释
默认情况下启用为警告的规则是预期会在运行时引发问题的违规行为。
Recommended
这是大多数开发人员预期使用的模式。 默认情况下启用的具有信 (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 编写测试
Async/await 模式
正确编写异步测试代码的规则:
- MSTEST0013 - AssemblyCleanup 应有效(包括异步规则)
- MSTEST0027 - 取消测试方法的异步后缀
- MSTEST0028 - 取消测试装置方法的异步后缀
- MSTEST0039 - 使用较新的 Assert.Throws 方法(异步变体)
- MSTEST0040 - 避免在 async void 上下文中使用断言
- MSTEST0045 - 对超时使用协作取消
- MSTEST0049 - Flow TestContext CancellationToken
- MSTEST0054 - 使用 CancellationToken 属性
相关文档: TestContext
数据驱动的测试
使用数据驱动测试方案的规则:
- MSTEST0007 - 在测试方法上使用属性
- MSTEST0014 - DataRow 应有效
- MSTEST0018 - DynamicData 应有效
- MSTEST0042 - 重复 DataRow
- MSTEST0052 - 避免显式 DynamicDataSourceType
- MSTEST0062 - 避免 out/ref 测试方法参数
相关文档: 数据驱动测试
生命周期和初始化
测试初始化、清理和生命周期管理的规则:
- MSTEST0008 - TestInitialize 应有效
- MSTEST0009 - TestCleanup 应有效
- MSTEST0010 - ClassInitialize 应有效
- MSTEST0011 - ClassCleanup 应有效
- MSTEST0012 - AssemblyInitialize 应有效
- MSTEST0013 - AssemblyCleanup 应有效
- MSTEST0019 - 首选 TestInitialize 而不是构造函数
- MSTEST0020 - 首选构造函数而不是 TestInitialize
- MSTEST0021 - 首选 Dispose 而不是 TestCleanup
- MSTEST0022 - 首选 TestCleanup 而不是 Dispose
- MSTEST0034 - 使用 ClassCleanupBehavior.EndOfClass
- MSTEST0050 - 全局测试装置应有效
相关文档: 生命周期
Assertions
正确有效地使用断言方法的规则:
- MSTEST0006 - 避免 ExpectedException 属性
- MSTEST0014 - DataRow 应有效
- MSTEST0017 - 断言参数应按正确的顺序传递
- MSTEST0023 - 不要否定布尔断言
- MSTEST0025 - 应优先使用 Assert.Fail 而不是始终为假的条件
- MSTEST0026 - 断言参数应避免条件访问
- MSTEST0032 - 查看永远为真的断言条件
- MSTEST0037 - 使用正确的断言方法
- MSTEST0038 - 避免对值类型使用 Assert.AreSame 方法
- MSTEST0039 - 使用较新的 Assert.Throws 方法
- MSTEST0046 - 使用 Assert 而不是 StringAssert
- MSTEST0051 - Assert.Throws 应包含单个语句
- MSTEST0053 - 避免在断言中使用格式参数
- MSTEST0058 - 避免 catch 代码块中的断言
相关文档: 断言
TestContext
正确使用 TestContext 对象的规则:
- MSTEST0005 - TestContext 应有效
- MSTEST0024 - 不存储静态 TestContext
- MSTEST0033 - 取消不可为 null 的引用未初始化警告
- MSTEST0048 - TestContext 属性用法
- MSTEST0049 - Flow TestContext CancellationToken
- MSTEST0054 - 使用 CancellationToken 属性
相关文档: TestContext
测试配置
配置测试执行、并行化和其他测试设置的规则:
- MSTEST0001 - 使用 Parallelize 属性
- MSTEST0015 - 不应忽略测试方法
- MSTEST0031 - 请勿使用 System.ComponentModel.DescriptionAttribute
- MSTEST0035 - 将 DeploymentItem 与测试方法或测试类配合使用
- MSTEST0043 - 在测试方法上使用重试属性
- MSTEST0045 - 对超时使用协作取消
- MSTEST0055 - 不要忽略字符串方法返回值
- MSTEST0059 - 正确使用 Parallelize 属性
- MSTEST0061 - 使用 OSCondition 属性而不是运行时检查
所有规则(快速参考)
| 规则编号 | 类别 | Title | 默认严重性 |
|---|---|---|---|
| MSTEST0001 | Performance | 使用 Parallelize 属性 | 信息 |
| MSTEST0002 | Usage | 测试类应有效 | 警告 |
| MSTEST0003 | Usage | 测试方法应有效 | 警告→错误* |
| MSTEST0004 | Design | 公共类型应定义为测试类 | 信息 |
| MSTEST0005 | Usage | TestContext 应有效 | 警告 |
| MSTEST0006 | Design | 避免 ExpectedException 属性 | 信息 |
| 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 | 测试类应具有测试方法 | 信息 |
| MSTEST0017 | Usage | 断言参数应按正确的顺序传递 | 信息 |
| MSTEST0018 | Usage | DynamicData 应该有效 | 警告 |
| MSTEST0019 | Design | 首选 TestInitialize 而不是构造函数 | 无(选择加入) |
| MSTEST0020 | Design | 首选构造函数而不是 TestInitialize | 无(选择加入) |
| MSTEST0021 | Design | 首选使用 Dispose,而不是 TestCleanup | 无(选择加入) |
| MSTEST0022 | Design | 建议使用 TestCleanup 而不是 Dispose | 无(选择加入) |
| MSTEST0023 | Usage | 不要否定布尔断言 | 信息 |
| MSTEST0024 | Usage | 不要存储静态 TestContext | 警告 |
| MSTEST0025 | Design | 更建议使用 Assert.Fail 来替代永远为假的条件 | 信息 |
| MSTEST0026 | Usage | 断言参数应避免条件式访问 | 信息 |
| MSTEST0027 | Suppression | 取消测试方法的异步后缀 | N/A |
| MSTEST0028 | Suppression | 取消测试装置方法的异步后缀 | N/A |
| MSTEST0029 | Design | 公共方法应为测试方法 | 信息 |
| MSTEST0030 | Usage | 包含测试方法的类型应为测试类 | 警告 |
| MSTEST0031 | Usage | 请勿使用 System.ComponentModel.DescriptionAttribute | 信息 |
| MSTEST0032 | Usage | 查看 always-true 断言条件 | 信息 |
| MSTEST0033 | Suppression | 禁止未初始化不可为 null 的引用 | N/A |
| MSTEST0034 | Usage | 使用 ClassCleanupBehavior.EndOfClass | 信息 |
| MSTEST0035 | Usage | 将 DeploymentItem 与测试方法或测试类配合使用 | 信息 |
| MSTEST0036 | Design | 请勿使用阴影 | 警告 |
| MSTEST0037 | Usage | 使用正确的断言方法 | 信息 |
| MSTEST0038 | Usage | 避免在值类型中使用 Assert.AreSame | 信息 |
| MSTEST0039 | Usage | 使用较新的 Assert.Throws 方法 | 信息 |
| MSTEST0040 | Usage | 避免在 async void 环境中使用断言 | 警告 |
| MSTEST0041 | Usage | 将基于条件的属性与测试类配合使用 | 警告 |
| MSTEST0042 | Usage | 重复 DataRow | 警告 |
| MSTEST0043 | Usage | 在测试方法上使用重试属性 | 警告→错误* |
| MSTEST0044 | Design | 首选 TestMethod 而不是 DataTestMethod | 信息 |
| MSTEST0045 | Design | 对超时使用协作取消 | 信息 |
| MSTEST0046 | Usage | 使用 Assert 而不是 StringAssert | 信息 |
| MSTEST0048 | Usage | TestContext 属性用法 | 警告 |
| MSTEST0049 | Usage | 流测试上下文取消标记 | 信息 |
| MSTEST0050 | Usage | 全局测试装置应有效 | 警告 |
| MSTEST0051 | Usage | Assert.Throws 应包含单个语句 | 信息 |
| MSTEST0052 | Usage | 避免直接使用 DynamicDataSourceType | 信息 |
| MSTEST0053 | Usage | 避免使用断言语句中的格式参数 | 信息 |
| MSTEST0054 | Usage | 使用 CancellationToken 属性 | 信息 |
| MSTEST0055 | Usage | 不要忽略字符串方法返回值 | 警告 |
| MSTEST0056 | Usage | TestMethodAttribute 应正确设置显示名称(DisplayName) | 信息 |
| MSTEST0057 | Usage | TestMethodAttribute 应传播源信息 | 警告 |
| MSTEST0058 | Usage | 避免在 catch 块中使用断言 | 信息 |
| MSTEST0059 | Usage | 正确使用 Parallelize 属性 | 警告 |
| MSTEST0060 | Usage | 重复 TestMethodAttribute | 警告 |
| MSTEST0061 | Usage | 使用 OSCondition 属性而不是运行时检查 | 信息 |
| 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