Не пытайтесь покрыть юнит-тестами все приложение с самого начала. Делайте это небольшими, постепенными шагами. Установите небольшую веху в течение недели или двух, а затем начните писать тесты для первой функциональности этой вехи. Затем начните реализовывать эту функциональность. Это должно быть примерно так:
Маленькие, пошаговые шаги
- Разбейте приложение на более мелкие вехи функций, которые вы можете увидеть в этот момент
- Выберите наиболее актуальную функцию, которая должна быть реализована на данный момент
- Разбейте эту функцию на более мелкие задачи
- Написать тест для одной из задач
- Запустите тест. Должно произойти сбой ( RED ). Если оно прошло, ваш тест не пройден.
- Начните писать наименьшее количество кода, чтобы пройти этот тест. Допускаются жестко закодированные значения.
- Запустить тесты ( ЗЕЛЕНЫЙ ). Они должны пройти (особенно при использовании жестко закодированных значений). Теперь вы знаете, что у вас есть страховка для будущих рефакторингов.
- Начните рефакторинг ( REFACTOR ) вашего кода, если это необходимо, в противном случае перейдите к шагу 4.
Подготовка к изменению
Преимущество этого метода, разбивающего огромную задачу на управляемые части, состоит в том, что он дает вам возможность закончить что-то в течение недели или двух. Позже, руководство может пересмотреть свои приоритеты, и вам придется реорганизовать список с первого пункта выше. Другое преимущество состоит в том, что наличие на каждом шаге модульного теста, который поддерживает вас, дает уверенность в том, что вы действительно что-то делаете, и вы действительно можете доставить что-то своему руководству быстрее, чем вы думаете, потому что на каждом этапе вы получаете несколько) рабочая версия вашей программы. Они видят прогресс, и это очень важно как для вас, так и для них. Они видят, что работа фактически выполняется, и вы получаете обратную связь, необходимую для вашего приложения (требования всегда меняются, давайте будем их менять как можно раньше).
Как сказал Gren , вы, вероятно, путаете варианты использования с модульным тестированием. Действия, которые пользователь может выполнить с приложением, могут быть точно так же обработаны одним методом в модели предметной области. Так что ситуация может быть не такой плохой, как кажется.
Нет предварительного дизайна, даже для модульных тестов
В любом случае, не пытайтесь писать все свои тесты с самого начала. Я так и делал, и это был большой провал. Выполнив небольшие итерации (тестовый метод / реализация метода), вы станете гораздо более продуктивным и уверенным в себе. Когда вы пишете все свои тесты заранее, вы можете заметить, что из-за факторизаций, необходимых для прохождения первых тестов, вам необходимо переосмыслить весь API, который вы предусмотрели при написании тестов, в то время как написание теста, затем реализация, тест, затем реализация, и в итоге вы получите то, что называется эмерджентным дизайном. И это лучший вид дизайна. Так появились шаблоны дизайна. Шаблоны проектирования не возникли у человека, который целый день стоял и думал о способах решения проблемы.