Тайм-аут для отдельных тестов в 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] на уровне крепления и, таким образом, вызывается перед каждым тестом. Если таймер тикает до завершения теста, я просто делаю очистку в обратном вызове таймера.