Тайм-аут для отдельных тестов в NUnit

У меня есть следующая проблема: я знаю, что в NUnit есть атрибут Timeout. Моя проблема в том, что модульные тесты фактически порождают новый процесс, который, если заморожен, никогда не убивается NUnit. Как я могу реализовать тайм-аут, который фактически избавится от процесса rogue?

спасибо, Р.

4 ответов


вы можете использовать timeout для утверждения вместо timeout для всего метода теста:

Assert.That(actual, Is.EqualTo(expected).After(5000, 50));

Edit: принятый ответ лучше.

Если ваш тест в конечном итоге истекает (хотя и позже, чем вы надеетесь), вы всегда можете использовать : http://www.nunit.org/index.php?p=maxtime&r=2.5.1 и очистить нить сами:

[Test, Maxtime(2000)]
public void TimedTest()
{
    ...
}

в противном случае лучшим вариантом может быть реализация собственного механизма синхронизации. Используйте таймер (или занятый цикл while), и если тайм-аут превышен, то убейте процесс (возможно, в Метод выключения, если он является общим для всех тестов) и сбой сигнала.

тайм-ауты NUnit не имеют событий, которые позволяют запускать код после тайм-аута теста. Похоже, тебе придется сворачивать свою.


[Test, Timeout(2000)]
public void PotentiallyLongRunningTest()
{
    ...
}

http://www.nunit.org/index.php?p=timeout&r=2.5.1 :

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

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


OK. После того, как я попробовал все функции, встроенные в NUnit, и не смог достичь того, что мне нужно, я сделал следующее: Я добавил таймер, который устанавливается в функции, приписываемой [SetUp] на уровне крепления и, таким образом, вызывается перед каждым тестом. Если таймер тикает до завершения теста, я просто делаю очистку в обратном вызове таймера.