Программно тайм-аут теста в MSTest

У меня есть ситуация, когда я использую модульный тест для выполнения внешнего инструмента, который выполняет тест. Я могу определить по коду выхода инструмента, прошел ли тест, не прошел или истекло время ожидания.

Есть ли способ, которым я могу провалить модульный тест, который установит результат теста на тайм-аут, а не на провал?

Я пытался создать исключение TimeoutException, но это дает тот же результат, что и использование Assert.

Изменить. Мы связываем модульные тесты с тестовыми примерами в TFS. В Microsoft Test Center тест в тестовом прогоне может иметь много состояний. Одним из которых является состояние тайм-аута. Я пытаюсь провалить свой тест, чтобы он правильно отображался в этом состоянии и не смешивался с неудачными тестами.


person Christo    schedule 20.09.2012    source источник
comment
Если ваш тест использует внешний инструмент для выполнения какой-либо работы, то это не модульный тест. В идеале вы должны смоделировать внешний инструмент, чтобы вы могли протестировать свой код, независимо от того, работает ли их код должным образом.   -  person Jamie Dixon    schedule 20.09.2012
comment
@Jamie: Это придирки. Вероятно, он выполняет интеграционный тест, но (как и многие другие люди) называет его модульным тестом только потому, что он выполняется в средстве запуска тестов.   -  person erikkallen    schedule 20.09.2012
comment
Он может быть @erikkallen, однако он также может намереваться написать это как модульный тест, но не полностью понимает издевательство или знает, что это вообще нужно сделать. В случае последнего мой комментарий может подтолкнуть ОП в полезном направлении, если нет, то никакого вреда не будет.   -  person Jamie Dixon    schedule 20.09.2012
comment
@erikkallen прав, мы проводим эти тесты как тесты интеграции/загрузки/....   -  person Christo    schedule 20.09.2012
comment
Я называю это модульным тестом, потому что это механизм, с помощью которого я выполняю тест.   -  person Christo    schedule 20.09.2012


Ответы (4)


Вы можете установить ограничение времени ожидания для каждого теста, добавив время ожидания (миллисекунды) в атрибуте теста...

[TestMethod, Timeout(2000)]

Тест завершится ошибкой, если выполнение займет более 2 секунд.

Спасибо, Марко.

person Marko    schedule 06.11.2013

Это не совсем «программно», но вы могли бы:

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

Таким образом, среда тестирования установит для вас результат теста на «Тайм-аут».

Я полагаю, особенно если ваши тесты автоматизированы, это было бы подходящим решением.

person Elena    schedule 01.10.2012

В модульном тестировании вы используете 2 цвета: зеленый и красный. Цвета timeout нет.

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

Assert.Fail("External tool used to do this test timed out");

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

person Darin Dimitrov    schedule 20.09.2012
comment
Загляните в Microsoft Test Center, и вы найдете больше, чем просто зеленый и красный. Если тест занимает слишком много времени (тайм-аут), вы также получаете желтый цвет. - person Christo; 20.09.2012
comment
У меня возникает соблазн проголосовать за этот ответ, так как я думаю, что из вопроса (даже в его исходной форме) было ясно, что это совсем не то, о чем я спрашиваю, и что я уже рассматривал возможность использования Assert. - person Christo; 20.09.2012

Ваш подход с TimeoutException кажется хорошим выбором. Однако TimeoutException не происходит от Исключение UnitTestAssertException.

Вы можете сделать одну из следующих вещей:

  1. Добавьте AssertFailedException с указанием причины в виде строки.

  2. Подкласс UnitTestAssertException с пользовательским UnitTestTimeOutException и выбросьте его.

  3. Используйте Assert.Fail, как @Darin-Dimitrov предложил.

person tobsen    schedule 20.09.2012