Что будет делать NUnit внутренне, если тайм-аут теста нарушен?

Что делает NUnit, когда обнаруживает таймаут? Раньше я думал, что он прервет тест, выдав исключение TimeoutException, но этот тест доказывает обратное:

[Test, Timeout(100), ExpectedException(typeof(TimeoutException))]
public static void RaisingExpectedTimeoutException()
{
    Thread.Sleep(500);
}

к сожалению, консоль nunit сообщает только о нарушении тайм-аута, но не о том, как тест был прерван им. Есть ли кто-нибудь, кто знает больше о том, как это будет работать? и почему вышеупомянутый тест не поднял ожидаемое исключение TimeoutException? (даже если это тип исключения.NET, я решил, что NUnit использовал это исключение для нарушений тайм-аута).

PS: этот метод испытаний также не работает:

[Test, Timeout(100), ExpectedException(typeof(ThreadAbortException))]
public static void RaisingExpectedThreadAbortException()
{
    Thread.Sleep(500);
}

и этот метод испытаний успешен ("никто не ожидает испанской инквизиции!"):

[Test, ExpectedException(typeof(ThreadAbortException))]
public static void ThrowingExpectedThreadAbortException()
{
    Thread.CurrentThread.Abort();
}

2 ответа

Решение

Если метод тестирования в NUnit указывает время ожидания, он будет запущен в отдельном потоке от остальных тестов. Если тест превышает время ожидания, созданный поток будет грубо прерван с помощью Thread.Abort,

Часть об отмене не явна в документации, но становится очевидной при копании в базе кода NUnit. Увидеть TestThread.RunTest для деталей.

РЕДАКТИРОВАТЬ*

Причина, по которой тест завершается неудачно по истечении времени ожидания, даже если вы перехватываете исключение, заключается в том, что тест помечается как неудачный до того, как прерывается поток. Следовательно, является ли это ожидаемым или нет, не имеет смысла, потому что он уже помечен как неудачный.

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

Когда поток, выполняющий ваш код, прерывается ThreadAbortException генерируется. Так как NUnit знает, что это вызвало само это исключение, добавив ExpectedException(typeof(ThreadAbortException)) не собирается заставить тест пройти.

Другие вопросы по тегам