通过


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 包资源管理器(Windows 应用)下载感兴趣的 nuget.org 版本的 NuGet 包,也可以在 NuGet 包资源管理器的 Web 应用版本中直接查看它。

此属性的可用值:

None

此值将所有分析器设置为 none 严重性,禁用所有这些分析器。 然后,可以使用 .editorconfig.globalconfig 文件启用单个分析器。

Default

此设置遵循每个规则的默认记录行为。

  • 默认情况下启用的规则将使用其默认严重性。
  • 默认禁用的规则将使用 none 严重级别。

注释

默认情况下启用为警告的规则是预期会在运行时引发问题的违规行为。

这是大多数开发人员预期使用的模式。 默认情况下启用的具有信 (suggestion) 严重性的规则将升级为警告。 以下规则在 RecommendedAll 两种模式中被升级为错误:

All

此模式比 Recommended更具攻击性。 所有规则作为警告启用。 此外,以下规则将视为错误:

按类别列出的规则

分析器规则分为以下类别:

设计规则

设计规则 可帮助你创建和维护符合适当设计和良好做法的测试套件。

性能规则

性能规则 支持高性能测试。

抑制规则

抑制规则 支持禁止来自其他规则的诊断。

用法规则

使用规则 支持正确使用 MSTest。

按概念列出的规则

查找由常见测试方案和概念组织的规则:

测试结构和属性

有助于确保测试类和方法正确结构化和装饰的规则:

相关文档: 使用 MSTest 编写测试

Async/await 模式

正确编写异步测试代码的规则:

  • MSTEST0013 - AssemblyCleanup 应有效(包括异步规则)
  • MSTEST0027 - 取消测试方法的异步后缀
  • MSTEST0028 - 取消测试装置方法的异步后缀
  • MSTEST0039 - 使用较新的 Assert.Throws 方法(异步变体)
  • MSTEST0040 - 避免在 async void 上下文中使用断言
  • MSTEST0045 - 对超时使用协作取消
  • MSTEST0049 - Flow TestContext CancellationToken
  • MSTEST0054 - 使用 CancellationToken 属性

相关文档: TestContext

数据驱动的测试

使用数据驱动测试方案的规则:

相关文档: 数据驱动测试

生命周期和初始化

测试初始化、清理和生命周期管理的规则:

相关文档: 生命周期

Assertions

正确有效地使用断言方法的规则:

相关文档: 断言

TestContext

正确使用 TestContext 对象的规则:

相关文档: TestContext

测试配置

配置测试执行、并行化和其他测试设置的规则:

  • MSTEST0001 - 使用 Parallelize 属性
  • MSTEST0015 - 不应忽略测试方法
  • MSTEST0031 - 请勿使用 System.ComponentModel.DescriptionAttribute
  • MSTEST0035 - 将 DeploymentItem 与测试方法或测试类配合使用
  • MSTEST0043 - 在测试方法上使用重试属性
  • MSTEST0045 - 对超时使用协作取消
  • MSTEST0055 - 不要忽略字符串方法返回值
  • MSTEST0059 - 正确使用 Parallelize 属性
  • MSTEST0061 - 使用 OSCondition 属性而不是运行时检查

相关文档: 配置 MSTest运行测试

所有规则(快速参考)

规则编号 类别 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 测试类应具有有效的构造函数 警告

* 在RecommendedAll模式中升级为“错误”。

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