| Property | Value |
|---|---|
| 规则 ID | MSTEST0045 |
| Title | 对超时使用协作取消 |
| Category | Usage |
| 修复是中断修复还是非中断修复 | Non-breaking |
| 默认启用 | Yes |
| 默认严重性 | 从 4.0.0 版本开始的警告,信息提示在之前 |
| 是在版本 中引入的 | 3.10.0 |
| 有修复代码的办法吗 | Yes |
Cause
一种测试方法在不设置TimeoutAttribute属性为CooperativeCancellation的情况下使用true。
规则说明
无法正常中止正在运行的线程。 超时工作有两种方法:
- 停止观察运行测试的线程。 但在许多情况下,这可能会造成问题,并且可能会使其余测试由于潜在的竞争条件而不稳定。 这是 非合作取消。
- 超时后请求取消,测试必须根据请求自行终止。 这是 协作取消。
使用TimeoutAttribute时,应将CooperativeCancellation设置为true以启用协作取消。 如果没有协作取消机制,测试框架在达到超时时将停止监控测试执行,但测试会继续在后台运行。 这可能会导致其他测试或清理步骤出现问题,因为原始测试仍在执行,并可能会干扰后续作。
使用协作取消模式时,MSTest 只会触发令牌的取消事件,你负责在测试代码中传递和使用测试上下文令牌。 此模式与 .NET 中取消的默认行为保持一致。
如何修复违规行为
使用提供的代码修复程序自动将CooperativeCancellation属性设置为true在TimeoutAttribute上。 还可以根据需要手动添加属性。
[TestClass]
public class TestClass1
{
public TestContext TestContext { get; set; }
[Timeout(TimeoutValue, CooperativeCancellation = true)]
[TestMethod]
public void TestMethod1()
{
// Respect TestContext.CancellationTokenSource.Token
}
}
或者,可以在 runsettings 或 testconfig.json 文件中全局配置协作取消,以将此设置应用于测试项目中的所有超时属性。
何时禁止显示警告
如果特别需要测试在达到超时时突然终止,而不是使用合作取消,请取消此警告。