使用规则支持正确使用 MSTest 属性、方法和模式。 这些规则捕获常见错误,并确保测试遵循框架的要求和约定。
此类别中的规则
| 规则编号 | Title | Severity | 修复可用 |
|---|---|---|---|
| MSTEST0002 | 测试类应当有效。 | 警告 | 是的 |
| MSTEST0003 | 测试方法应有效。 | 警告→错误* | 是的 |
| MSTEST0005 | TestContext 应有效。 | 警告 | 是的 |
| MSTEST0007 | 在测试方法上使用属性。 | 警告 | 否 |
| MSTEST0008 | TestInitialize 应有效。 | 警告 | 是的 |
| MSTEST0009 | TestCleanup 应是有效的。 | 警告 | 是的 |
| MSTEST0010 | ClassInitialize 应有效。 | 警告 | 是的 |
| MSTEST0011 | ClassCleanup 应该是有效的。 | 警告 | 是的 |
| MSTEST0012 | AssemblyInitialize 应有效。 | 警告 | 是的 |
| MSTEST0013 | AssemblyCleanup 应该是有效的。 | 警告 | 是的 |
| MSTEST0014 | DataRow 应有效。 | 警告 | 是的 |
| MSTEST0017 | 断言参数应按正确的顺序传递。 | 信息 | 是的 |
| MSTEST0018 | DynamicData 应有效。 | 警告 | 是的 |
| MSTEST0023 | 不要否定布尔断言。 | 信息 | 是的 |
| MSTEST0024 | 不要存储静态 TestContext。 | 警告 | 否 |
| MSTEST0026 | 断言参数应避免条件访问。 | 信息 | 否 |
| MSTEST0030 | 包含测试方法的类型应为测试类。 | 警告 | 是的 |
| MSTEST0031 | 请勿使用 System.ComponentModel.DescriptionAttribute。 | 信息 | 是的 |
| MSTEST0032 | 查看 always-true 断言条件。 | 信息 | 否 |
| MSTEST0034 | 请使用 ClassCleanupBehavior.EndOfClass。 | 信息 | 是的 |
| MSTEST0035 | 将 DeploymentItem 与测试方法或测试类配合使用。 | 信息 | 否 |
| MSTEST0037 | 使用正确的断言方法。 | 信息 | 是的 |
| MSTEST0038 | 避免对值类型使用 Assert.AreSame。 | 信息 | 是的 |
| MSTEST0039 | 使用较新的 Assert.Throws 方法。 | 信息 | 是的 |
| MSTEST0040 | 避免在异步 void 上下文中使用断言。 | 警告 | 否 |
| MSTEST0041 | 对测试类使用基于条件的属性。 | 警告 | 否 |
| MSTEST0042 | 重复 DataRow。 | 警告 | 否 |
| MSTEST0043 | 在测试方法上使用重试属性。 | 警告→错误* | 是的 |
| MSTEST0046 | 使用 Assert 而不是 StringAssert。 | 信息 | 是的 |
| MSTEST0048 | TestContext 属性用法。 | 警告 | 否 |
| MSTEST0049 | Flow TestContext CancellationToken。 | 信息 | 是的 |
| MSTEST0050 | 全局测试装置应有效。 | 警告 | 是的 |
| MSTEST0051 | Assert.Throws 应包含单个语句。 | 信息 | 是的 |
| MSTEST0052 | 避免显式 DynamicDataSourceType。 | 信息 | 是的 |
| MSTEST0053 | 避免使用 Assert 语句的格式参数。 | 信息 | 是的 |
| MSTEST0054 | 使用 CancellationToken 属性。 | 信息 | 是的 |
| MSTEST0055 | 不要忽略字符串方法返回值。 | 警告 | 否 |
| MSTEST0056 | TestMethodAttribute 应正确设置 DisplayName。 | 信息 | 是的 |
| MSTEST0057 | TestMethodAttribute 应传播源信息。 | 警告 | 否 |
| MSTEST0058 | 避免在 catch 块中使用断言。 | 信息 | 否 |
| MSTEST0059 | 正确使用 Parallelize 属性。 | 警告 | 否 |
| MSTEST0060 | 重复 TestMethodAttribute。 | 警告 | 是的 |
| MSTEST0061 | 使用 OSCondition 属性而不是运行时检查。 | 信息 | 是的 |
| MSTEST0062 | 避免使用 out/ref 类型的测试方法参数。 | 警告 | 是的 |
| MSTEST0063 | 测试类应具有有效的构造函数。 | 警告 | 否 |
* 在Recommended和All模式中升级为“错误”。
常见应用场景
测试结构验证
确保测试类、方法和装置符合 MSTest 要求:
- MSTEST0002:测试类布局要求(例如公共、非静态)。
- MSTEST0003:测试方法布局要求(️⚠ 升级到错误)。
- MSTEST0030:具有 [TestMethod] 的方法必须位于 [TestClass] 中。
- MSTEST0063:测试类构造函数验证。
生命周期方法
验证初始化和清理方法:
- MSTEST0008:TestInitialize 验证。
- MSTEST0009:TestCleanup 验证。
- MSTEST0010:ClassInitialize 验证。
- MSTEST0011:ClassCleanup 验证。
- MSTEST0012:AssemblyInitialize 验证。
- MSTEST0013:AssemblyCleanup 验证。
- MSTEST0034:设置 ClassCleanupBehavior.EndOfClass。
- MSTEST0050:全局测试装置验证。
数据驱动的测试
确保正确使用数据属性:
- MSTEST0007:数据属性必须位于测试方法上。
- MSTEST0014:DataRow 验证。
- MSTEST0018:DynamicData 验证。
- MSTEST0042:检测重复的 DataRows。
- MSTEST0052:对 DynamicDataSourceType 使用 AutoDetect。
- MSTEST0062:避免 out/ref 参数。
编写更好的断言
正确有效的断言用法规则:
- MSTEST0017:按正确的顺序传递预期/实际。
- MSTEST0023:不要否定条件(直接使用 Assert.IsFalse)。
- MSTEST0026:避免断言中的 null 条件运算符。
- MSTEST0032:查看始终为 true 的条件。
- MSTEST0037:使用最合适的断言方法。
- MSTEST0038:不要将 AreSame 与值类型一起使用。
- MSTEST0039:使用 Assert.ThrowsExactly (较新的 API)。
- MSTEST0046:首选 Assert 而不是 StringAssert。
- MSTEST0051:Assert.Throws 应测试单个语句。
- MSTEST0053:使用字符串内插而不是格式参数。
- MSTEST0058:不要将断言置于 catch 块中。
TestContext 用法
TestContext 对象的正确用法:
- MSTEST0005:TestContext 属性验证。
- MSTEST0024:不要将 TestContext 存储在静态字段中。
- MSTEST0048:固定装置中的受限属性访问。
- MSTEST0049:从 TestContext 中传递取消令牌。
- MSTEST0054:使用 TestContext.CancellationToken 属性。
异步模式
异步测试代码的规则:
- MSTEST0040:避免异步 void 方法中的断言。
测试配置
- MSTEST0031:使用适当的属性(而不是 System.ComponentModel.Description)。
- MSTEST0035:DeploymentItem 用法。
- MSTEST0041:条件属性必须位于测试类上。
- MSTEST0043:重试属性必须在测试方法上(️⚠ 升级到 Error)。
- MSTEST0055:不要忽略字符串方法返回值。
- MSTEST0056:在 TestMethodAttribute 上正确设置 DisplayName。
- MSTEST0057:在自定义 TestMethodAttribute 中传播源信息。
- MSTEST0059:不要同时使用 Parallelize 和 DoNotParallelize。
- MSTEST0060:避免重复 TestMethodAttribute。
- MSTEST0061:使用 OSCondition 属性进行平台检查。