| Property | Value |
|---|---|
| 規則識別碼 | 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 檔案中全域設定合作式取消,以將此設定套用至測試專案中的所有逾時屬性。
隱藏警告的時機
如果您特別需要在達到逾時時突然終止測試,而不是使用合作式取消,請隱藏此警告。