Ескертпе
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Жүйеге кіруді немесе каталогтарды өзгертуді байқап көруге болады.
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Каталогтарды өзгертуді байқап көруге болады.
| 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, чтобы применить этот параметр ко всем атрибутам времени ожидания в тестовом проекте.
Когда следует подавлять предупреждения
Отключайте это предупреждение, если вам нужно, чтобы тест был немедленно завершен при достижении времени ожидания, а не с помощью совместной отмены.