Я розумію розробку тестових програм настільки, що вам дозволяється писати продуктивний код лише тоді, коли у вас є невдалий (червоний) тест одиниці.
Ні. Вам дозволяється написати лише найпростіший код, щоб змінити повідомлення тесту. Тут нічого не сказано про те, який саме тест.
Насправді, ви, мабуть, почнете з написання невдалого (червоного) тесту на прийняття для критерію прийняття, точніше, ви напишете найпростіший тест на прийняття, який, можливо, може вийти з ладу; після цього ви запускаєте тест, спостерігаєте за тим, як він не виходить, і переконайтеся, що він не працює з правильної причини. Потім ви пишете невдалий функціональний тест для фрагмента функціональності цього критерію прийняття. Знову ви пишете найпростіший функціональний тест, який, можливо, може вийти з ладу, запустити його, спостерігати за тим, як він вийшов з ладу, і переконаєтеся, що він не працює з правильної причини. Потім ви пишете невдалий тест одиниці, найпростіший тест одиниці, який, можливо, не вдався, запустіть його, спостерігаючи за тим, як він не виходить, переконайтеся, що він не працює з правильної причини.
Тепер ви пишете найпростіший виробничий код, який міг би змінити повідомлення про помилку. Запустіть тест ще раз, переконайтеся, що повідомлення про помилку змінилося, що воно змінилось у правильному напрямку та що код змінив повідомлення з правильної причини. (В ідеалі повідомлення про помилку вже повинно пройти, і тест повинен пройти, але частіше за все краще зробити невеликі кроки, змінюючи повідомлення, а не намагатися пройти тест за один раз - це причина чому розробники тестових рамок витрачають стільки зусиль на свої повідомлення про помилки!)
Як тільки ви отримаєте тест на одиницю, ви перефактуруєте свій виробничий код під захистом ваших тестів. (Зверніть увагу, що наразі тест прийняття та функціональний тест все ще не спрацьовують, але це нормально, оскільки ви переробляєте лише окремі одиниці, які охоплені одиничними тестами.)
Тепер ви створюєте наступний блок-тест і повторюєте вище, поки не пройде і функціональний тест. Під захистом функціонального тесту тепер ви можете проводити рефактори в декількох одиницях.
Цей середній цикл тепер повторюється до тих пір, поки не пройде випробування на прийняття, і в цей момент ви можете робити рефактори для всієї системи.
Тепер ви вибираєте наступний критерій прийняття, і зовнішній цикл починається заново.
Кент Бек, "відкривач" TDD (йому не подобається термін "винахідник", він каже, що люди робили це весь час, він просто дав йому ім'я і написав про це книгу) використовує аналогію з фотографії та називає це "збільшення та зменшення масштабу".
Примітка: не завжди потрібні три рівня тестів. Можливо, іноді потрібно більше. Частіше потрібно менше. Якщо ваші функціональні можливості невеликі, а ваші функціональні тести швидкі, ви можете пройти без (або з меншими одиницями тестів). Часто потрібні лише приймальні тести та одиничні тести. Або ваші критерії прийняття настільки дрібні, що ваші тести прийняття є функціональними тестами.
Кент Бек каже, що якщо у нього швидкий, малий і зосереджений функціональний тест, він спочатку напише одиничні тести, нехай одиничні тести керують кодом, а потім видалять (деякі) одиничні тести знову, які охоплюють код, який також охоплений швидким функціональним тестом. Пам’ятайте: тестовий код - це також код, який потрібно підтримувати та відновлювати, чим менше там, тим краще!
Однак мені цікаво, чи можна застосовувати тестовий підхід до інших форм тестів.
Ви дійсно не застосовуєте TDD до тестів. Ви застосовуєте його до всього процесу розробки. Ось що означає "керована" частина Test- Driven -Development: весь ваш розвиток визначається тестами. Тести не тільки керують кодом, який ви пишете, вони також визначають, який код написати, який код написати далі. Вони керують вашим дизайном. Вони говорять вам, коли закінчите. Вони розповідають, над чим працювати далі. Вони розповідають про вади дизайну у вашому коді (коли тести важко написати).
Кіт Брейтвайт створив вправу, яку він називає TDD так, як ніби це ти знаєш . Він складається з набору правил (заснованих на трьох Правилах дядька Боба Мартіна TDD , але набагато суворіших), яких ви повинні суворо дотримуватися і які покликані спрямовувати вас до більш жорсткого застосування TDD. Найкраще це працює з парним програмуванням (щоб ваша пара могла переконатися, що ви не порушуєте правила) та інструктором.
Правила такі:
- Напишіть рівно один новий тест, найменший тест, який ви, здається, вказуєте у напрямку рішення
- Бачити це не вдалося; збої компіляції зараховуються до збоїв
- Зробіть тест із (1) проходження, записавши найменший код реалізації у способі тестування .
- Рефактор для видалення дублювання та в іншому випадку, необхідного для поліпшення дизайну. Будьте чіткі щодо використання цих рухів:
- ви хочете новий метод - дочекайтеся часу рефакторингу, а потім… створіть нові (нетестові) методи, виконуючи один із цих способів, і жодним іншим способом:
- бажано: виконайте метод Extract для коду реалізації, створеного відповідно до (3) для створення нового методу в тестовому класі, або
- якщо потрібно: перемістіть код реалізації згідно (3) у існуючий метод реалізації
- ви хочете новий клас - дочекайтеся часу рефакторингу, а потім… створіть нетестові класи, щоб вказати призначення для методу Move і без жодної іншої причини
- заповнити класи впровадження методами, виконуючи Move Method, і ніяким іншим способом
Ці правила призначені для здійснення TDD. Вони не призначені для того, щоб насправді робити TDD у виробництві (хоча ніщо не заважає вам це спробувати). Вони можуть відчувати розчарування, тому що іноді буде здаватися, ніби ти робиш тисячі маленьких крихітних кроків, не роблячи жодного реального прогресу.