共用方式為


MSTEST0045:使用合作性取消機制來處理逾時

Property Value
規則識別碼 MSTEST0045
Title 使用合作式取消逾時
Category Usage
修正是破壞性或非破壞性 Non-breaking
預設啟用 Yes
默認嚴重性 從版本 4.0.0 開始的警告,之前的資訊
在版本 中引進 3.10.0
是否有程序代碼修正 Yes

Cause

測試方法會使用 TimeoutAttribute ,而不將 CooperativeCancellation 屬性設定為 true

規則描述

無法正常中止執行中的線程。 超時有兩種操作方式:

  • 停止觀察執行測試的線程。 但在許多情況下,這可能會造成問題,而且可能會因為潛在的競爭狀況而使剩餘的測試不穩定。 這是 非合作式取消
  • 逾時後請求取消,測試負責在請求時終止。 這是 協作式取消

使用 TimeoutAttribute時,您應該將 設定 CooperativeCancellationtrue ,以啟用合作式取消。 如果沒有協作取消,當達到逾時條件時,測試框架將停止監控測試的執行,但測試仍會在背景繼續進行。 這可能會導致其他測試或清除步驟發生問題,因為原始測試仍在執行中,而且可能會干擾後續的作業。

使用合作取消模式時,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
    }
}

或者,您可以在 runsettingstestconfig.json 檔案中全域設定合作式取消,以將此設定套用至測試專案中的所有逾時屬性。

隱藏警告的時機

如果您特別需要在達到逾時時突然終止測試,而不是使用合作式取消,請隱藏此警告。