MSTEST0045:对超时使用协同取消

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属性设置为trueTimeoutAttribute上。 还可以根据需要手动添加属性。

[TestClass]
public class TestClass1
{
    public TestContext TestContext { get; set; }

    [Timeout(TimeoutValue, CooperativeCancellation = true)]
    [TestMethod]
    public void TestMethod1()
    {
        // Respect TestContext.CancellationTokenSource.Token
    }
}

或者,可以在 runsettingstestconfig.json 文件中全局配置协作取消,以将此设置应用于测试项目中的所有超时属性。

何时禁止显示警告

如果特别需要测试在达到超时时突然终止,而不是使用合作取消,请取消此警告。