Безумовно. Деякі люди кажуть, "будь-який тест краще, ніж тест взагалі". Я категорично не погоджуюсь - погано написані тести розчарували час вашої розробки, і ви закінчуєте витрачати дні на виправлення "зламаних" тестів, оскільки вони в першу чергу не були хорошими одиничними тестами. Для мене наразі дві речі, на які я зосереджуюсь, щоб зробити мої тести цінними, а не тягарем:
Технічне обслуговування
Ви повинні перевірити результат ( що відбувається), а не метод ( як це відбувається). Ваша настройка для тесту повинна бути максимально відокремлена від впровадження: налаштовуйте лише результати для викликів служб тощо, які абсолютно необхідні.
- Використовуйте глузливі рамки, щоб переконатися, що ваші тести не залежать від зовнішнього
- Надайте перевагу заглушкам над макетами (якщо ваша рамка відрізняє їх), де це можливо
- Ніякої логіки в тестах! Ifs, перемикачі, натягування, кейси, пробні вилози тощо - все це велике значення, оскільки вони можуть вводити помилки в сам тестовий код
Читабельність
Добре дозволити трохи більше повторень у ваших тестах, яких ви зазвичай не допускаєте у виробничому коді, якщо це зробить їх більш читабельними. Просто збалансуйте це за допомогою реконструкції, описаної вище. Будьте чіткими, що робить тест!
- Постарайтеся підтримувати для своїх тестів стиль "упорядкувати, діяти, стверджувати". Це відокремлює ваше налаштування та очікування сценарію, від дії, що виконується, і результату, який стверджується.
- Підтримуйте одне логічне твердження за кожний тест (якщо назва вашого тесту містить "і", можливо, вам знадобиться розбити його на кілька тестів)
На закінчення, ви повинні дуже перейматися "смердючими" тестами - вони можуть закінчитися просто марною тратою вашого часу, не надаючи ніякої цінності.
Ви сказали:
Тестування блоку зазвичай вимагає різних "смердючих хак", таких як функції заглушки.
Здається, що ви, безумовно, могли прочитати деякі технічні засоби тестування, такі як використання системи глузування, щоб зробити ваше життя набагато простішим. Я дуже настійно рекомендую The Art of Unit Testing , який охоплює вищезазначене та багато іншого. Мені це стало просвітницьким після довгого боротьби з погано написаними, нездійсненними, "смердючими" тестами. Це одна з найкращих інвестицій за час, яку я зробив цього року!