Хоча я все за модульне тестування, я іноді замислююсь, чи справді ця форма тестування першою розробкою справді корисна ...
Такі невеликі тривіальні тести можуть стати "канаркою в шахті" для вашої кодової бази, попереджаючи про небезпеку, поки не пізно. Тривіальні тести корисно тримати, оскільки вони допомагають правильно налаштувати взаємодію.
Наприклад, подумайте про тривіальний тест, проведений, щоб дослідити, як використовувати API, який вам незнайомий. Якщо цей тест має якесь відношення до того, що ви робите в коді, який використовує API "по-справжньому", корисно тримати цей тест навколо. Коли API випускає нову версію, і вам потрібно оновити. Тепер ви маєте свої припущення щодо того, як ви очікуєте, що API поведеться, записані у виконуваному форматі, який ви можете використовувати для лову регресій.
... [у реальному процесі у вас є 3-4 шари над кодом (бізнес-запит, документ вимог, архітектурний документ), де фактично визначене бізнес-правило (ціна зі знижкою - ціна - знижка) може бути неправильно визначене. Якщо така ситуація, ваш модульний тест для вас нічого не означає.
Якщо ви роками кодуєте без написання тестів, для вас може бути не відразу очевидно, що це має якесь значення. Але якщо ви вважаєте, що найкращий спосіб працювати - це "достроково звільнити, часто випускати" або "спритний", оскільки ти хочеш мати можливість розгортання швидко / безперервно, тоді твій тест, безумовно, щось означає. Єдиний спосіб зробити це - легітимізувати кожну зміну коду за допомогою тесту. Яким би малим не був тест, коли у вас є зелений набір тестів, ви теоретично можете його розгорнути. Див. Також "безперервне виробництво" та "вічна бета-версія".
Вам також не потрібно бути "першим випробуванням", щоб бути прихильником цього мислення, але, як правило, це найефективніший спосіб дістатися туди. Коли ви робите TDD, ви замикаєтесь на невеликий цикл червоно-зеленого рефактора, який триває дві-три хвилини. Ви жодного разу не можете зупинитися і піти, а на руках у вас повний хаос, який буде потребувати години для налагодження та складання.
До того ж, ваш юніт-тест - ще одна точка відмови ...
Успішний тест - це той, який демонструє збій в системі. Невдалий тест попередить вас про помилку в логіці тесту або в логіці вашої системи. Мета ваших тестів - зламати код або довести, що один із сценаріїв працює.
Якщо ви пишете тести після коду, ви ризикуєте написати тест, який є "поганим", тому що для того, щоб побачити, що ваш тест справді працює, ви повинні бачити його як зламаним, так і працюючим. Коли ви пишете тести після коду, це означає, що вам доведеться "сплескнути пастку" і ввести помилку в код, щоб побачити, що тест не вдався. Більшість розробників не лише неспокійно ставляться до цього, але стверджують, що це марна трата часу.
Що ми тут отримуємо?
Безумовно, користь робити речі таким чином. Michael Feathers визначає "застарілий код" як "неперевірений код". Коли ви застосовуєте такий підхід, ви легітимізуєте кожну зміну, внесену до своєї кодової бази. Це більш суворе, ніж невикористання тестів, але якщо мова йде про підтримку великої кодової бази, це платить за себе.
Якщо говорити про Пір’я, то тут варто ознайомитися з двома чудовими ресурсами:
Обидва вони пояснюють, як застосовувати такі типи практики та дисципліни в проектах, які не є "Грінфілдом". Вони пропонують методи написання тестів навколо тісно пов'язаних компонентів, жорстких дротових залежностей та речей, над якими ви не обов'язково маєте контроль. Вся справа у пошуку "швів" та тестуванні навколо них.
[Я] якщо ціна зі знижкою неправильна, тестова група все одно знайде проблему, як модульне тестування врятувало якусь роботу?
Такі звички схожі на інвестиції. Повернення не є негайним; вони накопичуються з часом. Альтернативою нетестуванню є, по суті, заборгованість за те, що він не може вловлювати регресії, вводити код, не боячись помилок інтеграції, або керувати дизайнерськими рішеннями. Краса в тому, що ви легітимізуєте кожну зміну, внесену до вашої кодової бази.
Чого мені тут не вистачає? Будь ласка, навчіть мене любити TDD, оскільки я поки що важко приймаю його як корисний. Я теж хочу, бо хочу залишатися прогресивним, але для мене це просто не має сенсу.
Я розглядаю це як професійну відповідальність. Це ідеал, до якого слід прагнути. Але це дуже важко виконувати і втомлювати. Якщо ви піклуєтесь про це і вважаєте, що не повинні створювати код, який не тестується, ви зможете знайти силу волі, щоб навчитися хорошим звичкам тестування. Одне, що я зараз багато роблю (як і інші), - це таймбокс, який годину писав код без жодних тестів, а потім мав дисципліну, щоб його викинути. Це може здатися марним, але насправді це не так. Це не так, як вправи коштували компанії фізичних матеріалів. Це допомогло мені зрозуміти проблему та те, як писати код таким чином, щоб він був якіснішим і перевіряється.
Моя порада, зрештою, полягала б у тому, що якщо у вас справді немає бажання добре це робити, тоді взагалі цього не робіть. Погані тести, які не підтримуються, погано працюють тощо, можуть бути гіршими, ніж відсутність будь-яких тестів. Важко навчитися самостійно, і ви, мабуть, цього не полюбите, але навчитися буде практично неможливо, якщо у вас немає бажання це робити або ви не бачите в цьому достатньої цінності, щоб гарантувати час інвестування.
Кілька людей постійно згадують, що тестування допомагає застосувати специфікацію. Я бачив, що специфікація також помилялася, частіше за все ...
Клавіатура розробника - це місце, де гума стикається з дорогою. Якщо специфікація помилкова, і ви не піднімаєте на ній прапор, то дуже ймовірно, що вас за це звинуватить. Або, принаймні, ваш код буде. Важко дотримуватися дисципліни та строгості, пов’язаних із тестуванням. Це зовсім не просто. Для цього потрібні практика, багато навчання та багато помилок. Але врешті-решт це окупається. У швидкому, швидко мінливому проекті - це єдиний спосіб спати вночі, незалежно від того, чи це гальмує вас.
Тут слід задуматись також про те, що в минулому було доведено, що методи, принципово такі самі, як тестування, працюють: «чиста кімната» та «дизайн за контрактом», як правило, створюють однакові типи конструкцій з «мета» -кодами, які тести роблять, і застосовують такі в різних точках. Жоден з цих методів не є срібними кулями, і жорсткість в кінцевому підсумку обійдеться вам в обсязі функцій, які ви можете забезпечити з точки зору часу виходу на ринок. Але справа не в цьому. Йдеться про можливість підтримувати те, що ви робите. І це дуже важливо для більшості проектів.