2010-05-17 4 views
0

Скажем, у меня есть функция, которая принимает имя пользователя и пароль, он извлекает запись из базы данных и выполняет следующие проверки по этим даннымЗаписывайте единичные тесты, которые проверяют на отказ?

  • Сегодняшняя дата находится за пределами диапазона дат
  • Участник инвалидов сравнение
  • параметр сделан

Если какой-либо из этих условий истинно, исключение.

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

ответ

2

Да, ваш тест будет правильно генерировать исключение, но в большинстве (всех?) Тестовых фреймворков вы можете указать ожидаемое исключение и тест пройдет.

В MSTest и NUnit

[ExpectedException(typeof(ArgumentException))] 

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

6

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

С другой стороны, если вы используете фреймворк, который не поддерживает это (хотя я и не думаю, что это не так), вы можете вручную добавить блок try ... catch внутри теста, чтобы исключение не распространяется и не приводит к сбою теста.

+0

+1 - точно, что вы должны делать. Большинство модульных тестовых фреймворков позволяют вам идти дальше и сбой, если ожидаемое исключение не выбрасывается. Единичные тесты должны проверять не только то, что функции работают при условии, что условия успешны, но не соответствуют требованиям при отсутствии этих условий. –

1

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

Например, если ваш контракт заявляет getDbRow() выбросит DbNotOpenException, если база данных не открыта, сделать что-то вроде:

db.Close() 
try: 
    x = db.getDbRow() 
catch DbNotOpenException e: 
    return PASSED_TEST 
return FAILED_TEST 

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

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