Я це роблю правильно? Якщо ні, що саме я повинен змінити
Важко сказати лише з цього короткого опису, але я підозрюю, що ні, ви не робите це правильно. Примітка. Я не кажу, що те, що ви робите, не працює або є якимось чином поганим, але ви не робите TDD. Середній "D" означає "Driven", тести керують усім, процес розробки, код, дизайн, архітектура, все .
Тести говорять про те, що писати, коли писати, що писати далі, коли припиняти писати. Вони розповідають вам про дизайн та архітектуру. (Дизайн та архітектура виходять з коду за допомогою рефакторингу.) TDD не про тестування. Мова не йде навіть про те, щоб спершу писати тести: TDD - це дозволити тестам керувати вами, їх написання спочатку - лише необхідна умова для цього.
Не має значення, чи ви насправді записуєте код, чи повністю розробили його: ви пишете (скелети) код у голову, а потім пишете тести для цього коду. Це не TDD.
Відмовитися від цієї звички важко . Дійсно, справді важко. Здається, це особливо важко для досвідчених програмістів.
Кіт Брейтвайт створив вправу, яку він називає TDD так, як ніби це ти знаєш . Він складається з набору правил (заснованих на трьох Правилах дядька Боба Мартіна TDD , але набагато суворіших), яких ви повинні суворо дотримуватися і які покликані спрямовувати вас до більш жорсткого застосування TDD. Найкраще це працює з парним програмуванням (так що ваша пара може переконатися, що ви не порушуєте правила) та інструктором.
Правила такі:
- Напишіть рівно один новий тест, найменший тест, який, здається, вказує у напрямку рішення
- Бачити це не вдалося; збої компіляції зараховуються до збоїв
- Зробіть тест з (1) проходження, записавши найменший код реалізації у способі тестування .
- Рефактор для видалення дублювання та в іншому випадку, необхідного для поліпшення дизайну. Будьте чіткі щодо використання цих рухів:
- ви хочете новий метод - дочекайтеся часу рефакторингу, а потім… створіть нові (нетестові) методи, виконуючи один із цих способів, і нічим іншим чином:
- бажано: виконайте метод Extract для коду реалізації, створеного відповідно до (3) для створення нового методу в тестовому класі, або
- якщо потрібно: перемістіть код реалізації згідно (3) у існуючий метод реалізації
- ви хочете новий клас - дочекайтеся часу рефакторингу, а потім… створіть нетестові класи, щоб вказати призначення для методу Move і без жодної іншої причини
- заповнювати класи впровадження методами, виконуючи Move Method, і ніяким іншим способом
Як правило, це призведе до зовсім інших конструкцій, ніж часто застосовуваний "псевдо-TDD метод", "уявляючи собі в голові, яким повинен бути дизайн, потім пишіть тести, щоб змусити цю конструкцію, реалізуйте дизайн, який ви вже планували перед написанням свого тести ".
Коли група людей реалізує щось на кшталт гри «tic tac toe», використовуючи псевдо-TDD, вони, як правило, отримують дуже схожі конструкції, що включають якийсь Board
клас із масивом Integer
s × 3 × 3 . І принаймні частина програмістів насправді написала цей клас без тестів для нього, оскільки вони «знають, що їм це знадобиться» або «потребують чогось, щоб написати свої тести проти». Однак, коли ви змусите ту саму групу застосовувати TDD так, як ніби це ви бажаєте, вони часто стикаються з широким розмаїттям дуже різних конструкцій, часто не використовують нічого, навіть віддалено схожого на Board
.
Чи можна визначити, чи достатньо написаний тест?
Коли вони покривають усі вимоги бізнесу. Тести - це кодування системних вимог.
Чи є гарною практикою написання тесту на дуже просту функціональність, яка може бути еквівалентною 1 + 1 = 2 або це просто перегравання?
Знову ж таки, у вас це відбувається назад: ви не пишете тести на функціональність. Ви пишете функціональність для тестів. Якщо функціональність для проходження тесту виявляється тривіальною, це чудово! Ви щойно виконали системну вимогу і навіть не довелося до цього наполегливо працювати!
Чи добре змінити функціональність і відповідно перевірити, чи змінюється вимога?
Ні. Навпаки. Якщо вимога змінюється, ви змінюєте тест, який відповідає цій вимозі, спостерігаєте за його відмовою, а потім змінюєте код, щоб він пройшов. Тести завжди виходять на перше місце.
Це важко зробити. Вам потрібні десятки, а може й сотні годин обдуманої практики , щоб створити якусь "м'язову пам'ять", щоб дійти до точки, коли коли термін настає і ти під тиском, то навіть не треба думати про це , і це стає найшвидшим і природним способом роботи.