Юнит-тестирование с зависимостями между тестами - PullRequest
22 голосов
/ 02 октября 2010

Как вы проводите модульное тестирование, когда у вас есть

  • некоторые общие юнит-тесты
  • более сложные тесты, проверяющие крайние случаи, в зависимости от общих

Чтобы привести пример, представьте себе тестирование CSV-ридера (я только что сделал запись для демонстрации),

def test_readCsv(): ...

@dependsOn(test_readCsv)
def test_readCsv_duplicateColumnName(): ...

@dependsOn(test_readCsv)
def test_readCsv_unicodeColumnName(): ...

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

Я нашел эти связанные, но разные вопросы,

UPDATE:

Я нашел TestNG , в котором есть отличная встроенная поддержка тестовых зависимостей. Вы можете написать такие тесты,

@Test{dependsOnMethods = ("test_readCsv"))
public void test_readCsv_duplicateColumnName() {
   ...
}

Ответы [ 5 ]

9 голосов
/ 02 октября 2010

Лично я бы не беспокоился о создании зависимостей между юнит-тестами. Это звучит как запах кода для меня. Несколько баллов:

  • Если тест не пройден, пусть другие не пройдут и получат хорошее представление о масштабе проблемы, вызванной изменением кода.
  • Неудачные испытания должны быть скорее исключением, чем нормой, так зачем тратить усилия и создавать зависимости, когда в подавляющем большинстве случаев (надеюсь!) Никакой выгоды не будет? Если сбои происходят часто, ваша проблема не в зависимостях модульного теста, а в частых сбоях теста.
  • Модульные тесты должны выполняться очень быстро. Если они работают медленно, сконцентрируйте свои усилия на увеличении скорости этих тестов, а не на предотвращении последующих сбоев. Сделайте это, развязав свой код и используя внедрение зависимостей или насмешки.
5 голосов
/ 23 мая 2012

Хоботок является версией Python TestNG (которая является библиотекой Java).

См. packages.python.org / proboscis /

Поддерживает зависимости, например

@test(depends_on=[test_readCsv])
public void test_readCsv_duplicateColumnName() {
   ...
}
2 голосов
/ 13 октября 2015

Я реализовал плагин для Nose (Python), который добавляет поддержку тестовых зависимостей и приоритетов тестов.

Как упоминалось в других ответах / комментариях, это часто плохая идея,однако могут быть исключения, когда вы захотите это сделать (в моем случае это была производительность для интеграционных тестов - с огромными накладными расходами для перехода в тестируемое состояние, минуты против часов).

Вы можете найти это здесь: nosedep .

Минимальный пример:

def test_a:
  pass

@depends(before=test_a)
def test_b:
  pass

Чтобы гарантировать, что test_b всегда выполняется до test_a.

2 голосов
/ 02 октября 2010

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

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

0 голосов
/ 04 октября 2010

В соответствии с лучшими практиками и принципами юнит-тестирования юнит-тест не должен зависеть от других.

Каждый контрольный пример должен проверять конкретное изолированное поведение.

Тогда, если какой-то тест будет неудачен, вы будете точно знать, что случилось с нашим кодом.

...