Модульное тестирование C # предупреждает вместо сбоя - PullRequest
4 голосов
/ 13 января 2011

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

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

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

Ответы [ 5 ]

9 голосов
/ 13 января 2011

Похоже, вы пытаетесь проверить слишком много вещей в одном тесте.

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

Концепции модульного тестирования: красный сбой, зеленый проход. Я знаю, что MSTest также допускает желтый, но он не будет делать то, что вы хотите. Вы можете сделать Assert.Inconclusive, чтобы получить желтый свет. Я использовал это, когда работал над базой кода, в которой было много интеграционных тестов, основанных на конкретных данных базы данных. Вместо того, чтобы провалить тест, я начал давать результаты неубедительными. Код, возможно, работал просто отлично, но данные отсутствовали. И не было никаких оснований полагать, что данные всегда будут там (они не были хорошими тестами IMO).

1 голос
/ 13 января 2011

Если вы используете Gallio / MbUnit , вы можете использовать Assert.Multiple для достижения желаемого. Он фиксирует ошибочные утверждения, но не останавливает выполнение теста немедленно. Все ошибочные утверждения собираются и сообщаются позже в конце теста.

[Test]
public void MultipleAssertSample()
{
   Assert.Multiple(() =>
   {
      Assert.Fail("Boum!");
      Assert.Fail("Paf!");
      Assert.Fail("Crash!");
   });
}

Тест в приведенном выше примере, очевидно, проваливается, но что интересно, так это то, что эти 3 ошибки показаны в протоколе испытаний. Выполнение не останавливается при первом сбое.

1 голос
/ 13 января 2011

Из того, что вы объяснили в вопросе, это скорее приемочный тест (чем юнит тест).Фреймворки модульного тестирования спроектированы так, чтобы быстро проваливаться.Вот почему Assert ведет себя так же, как и он (и это хорошо.)

Возвращаясь к вашей проблеме: вам следует взглянуть на использование среды приемочного тестирования, такой как Fitnesse, которая бы поддерживала то, что вы хотите, т.е.покажите мне шаги, которые завершились неудачно, но продолжите выполнение до конца.
Однако, если вы ДОЛЖНЫ использовать среду модульного тестирования, используйте собирающую переменную / параметр для имитации этого поведения.например,

  • Сохранять List<string> в тесте
  • и добавлять описательное сообщение об ошибке для каждого неудачного шага
  • В конце теста утверждать, что сборпеременная пуста
0 голосов
/ 13 января 2011

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

0 голосов
/ 13 января 2011

Модульное тестирование черно-белое - либо вы проходите тесты, либо нет, либо вы нарушаете логику, либо нет, либо ваши данные в БД верны или нет (хотя модульное тестирование с БД больше не является модульным тестированием как таковым).

Что вы собираетесь делать с предупреждением?Это пройдет или не получится?Если это пройдет, то какой смысл в этом случае модульного тестирования?Если это не удастся ... ну ... просто не получится.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...