2011-01-05 4 views
14

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

Спасибо, Р.

ответ

11

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

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

Абсолютно блестящий. После этого вы можете очистить поток. – ashes999

+0

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

+1

Ну, таким образом, вы не принимаете приемочные тесты, я бы посоветовал вам использовать что-то вроде 1) Белый http://white.codeplex.com/Thread/View.aspx?ThreadId=85842&ANCHOR 2) NUnit Forms http: //nunitforms.sourceforge.net/ Оба подходят для создания окон и нажатия кнопок. –

3

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

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

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

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

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

+0

Скорее всего, мне придется пройти второй путь. Так же, как пример - если порожденный процесс выдает сообщение на машине сборки - никто не должен щелкнуть по нему - тайм-аут NUnit никогда не начнется. Таким образом, это должен быть какой-то собственный механизм синхронизации. –

+0

исправить сборку кода: [Test, MaxTime (2000)] – razon

0

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

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

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

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

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

Смежные вопросы