Є компроміс. Чим більше ви будете упаковувати в одному тесті, тим більше шансів на те, що ви будете мати ефект цибулі, намагаючись пройти його. Іншими словами, найперший збій зупиняє це випробування. Ви не будете знати про інші твердження, поки не виправите перший збій. Однак, купа тестів, які в основному схожі, за винятком встановленого коду, - це дуже напружена робота, щоб з'ясувати, що деякі роботи написані, а інші - ні.
Можливі інструменти, засновані на ваших рамках:
- Теорії . Теорія дозволяє перевірити низку фактів про сукупність даних. Потім рамка буде подавати ваші тести кількома сценаріями тестових даних - або польовим, або статичним методом, який генерує дані. Якщо деякі ваші факти застосовуються з урахуванням якихось передумов, а інші - ці рамки не вводять концепцію припущення . Ви
Assume.that()
просто пропускаєте тест даних, якщо вони не відповідають умові. Це дозволяє вам визначити "Працює так, як очікувалося", а потім просто подати їй багато даних. Переглядаючи результати, у вас є запис для батьківських тестів, а потім підзапис для кожної частини даних.
- Параметризовані тести . Параметризовані тести були попередником теорій, тому може не бути такої передумови перевірки, яку ви можете мати з теоріями. Кінцевий результат той самий. Ви переглядаєте результати, у вас є батьківський запис для самого тесту, а потім конкретний запис для кожної точки даних.
- Один тест з декількома твердженнями . На те, щоб здійснити налаштування, потрібно менше часу, але ви в кінцевому підсумку виявляєте проблеми трохи за один раз. Якщо тест буде занадто довгим і занадто багато різних перевірених сценаріїв, є два великих ризики: запустити потрібно буде багато часу, і ваша команда набридне ним і вимкне тест.
- Кілька тестів з подібною реалізацією . Важливо зазначити, що якщо твердження різні, вони тести не перетинаються. Однак це була б загальноприйнята мудрість команди, орієнтованої на TDD.
Я не суворо налаштований на думку, що assert
у вашому тесті може бути лише одне твердження, але я встановлюю обмеження, що всі твердження повинні перевіряти пост-умови однієї дії. Якщо єдина різниця між тестами - це дані, я налаштований використовувати більш вдосконалені функції тестування, керовані даними, такі як параметризовані тести чи теорії.
Зважте свої варіанти, щоб вирішити, який найкращий результат. Я скажу, що "WorksAsExpectedWhenNull" принципово відрізняється, ніж будь-який із випадків, коли ви маєте справу з колекцією, яка має різну кількість елементів.