что будет делать NUnit внутренне, если тайм-аут теста нарушен? - PullRequest
4 голосов
/ 26 февраля 2012

Что именно делает 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 ]

5 голосов
/ 26 февраля 2012

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

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

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

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

1 голос
/ 26 февраля 2012

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

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

...