Там есть компромисс. Чем больше вы соберете в одном тесте, тем больше у вас будет эффекта лука, пытающегося заставить его пройти. Другими словами, самый первый сбой останавливает этот тест. О других утверждениях вы не узнаете, пока не исправите первый сбой. Тем не менее, наличие множества модульных тестов, которые в основном похожи, за исключением настроенного кода, является большой занятой работой, просто чтобы выяснить, что некоторые работы написаны, а другие - нет.
Возможные инструменты, основанные на вашей структуре:
- Теории . Теория позволяет вам проверить ряд фактов о наборе данных. Затем инфраструктура будет снабжать ваши тесты несколькими сценариями тестовых данных - либо полем, либо статическим методом, который генерирует данные. Если некоторые из ваших фактов применимы на основе одних предварительных условий, а другие - нет, эти рамки вводят концепцию предположения . Вы
Assume.that()
просто пропускаете тест для данных, если он не проходит предварительное условие. Это позволяет вам определить «Работает как положено», а затем просто передать ему много данных. Когда вы просматриваете результаты, у вас есть запись для родительских тестов, а затем дополнительная запись для каждого фрагмента данных.
- Параметризованные тесты . Параметризованные тесты были предшественниками теорий, поэтому может не быть той проверки предусловий, которую вы можете проводить с теориями. Конечный результат такой же. Если вы просматриваете результаты, у вас есть родительская запись для самого теста, а затем конкретная запись для каждой точки данных.
- Один тест с несколькими утверждениями . На настройку уходит меньше времени, но вы в конечном итоге обнаруживаете проблемы за раз. Если тест слишком длинный и тестируется слишком много различных сценариев, существует два больших риска: его выполнение займет много времени, и ваша команда сыт по горло и отключит тест.
- Несколько тестов с аналогичной реализацией . Важно отметить, что если утверждения различны, они не перекрываются. Однако это было бы общепринятым мнением команды, ориентированной на TDD.
Я не придерживаюсь строгого мнения, что assert
в вашем тесте может быть только одно утверждение, но я налагаю ограничения на то, что все утверждения должны проверять постусловия одного действия. Если единственное различие между тестами - это данные, я бы предпочел использовать более продвинутые функции, основанные на данных, такие как параметризованные тесты или теории.
Взвесьте ваши варианты, чтобы решить, каков наилучший результат. Я скажу, что «WorksAsExpectedWhenNull» принципиально отличается от любого из случаев, когда вы имеете дело с коллекцией, имеющей различное количество элементов.