Бөлісу құралы:


MSTEST0045. Используйте совместную отмену для тайм-аута

Property Value
Идентификатор правила MSTEST0045
Title Использование кооперативной отмены для таймаута
Category Usage
Исправление является разрушающим или неразрушающим Non-breaking
Включен по умолчанию Yes
Серьезность по умолчанию Сведения (предупреждение в версии 4.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, чтобы применить этот параметр ко всем атрибутам времени ожидания в тестовом проекте.

Когда следует подавлять предупреждения

Отключайте это предупреждение, если вам нужно, чтобы тест был немедленно завершен при достижении времени ожидания, а не с помощью совместной отмены.