Наскільки цінний конкретний підхід до тестування, залежить від того, наскільки важливою є місія системи, що розробляється, і наскільки від неї залежить якась інша критична система місії. Простий скрипт гостьової книги для вашого веб-сайту навряд чи можна вважати місією критичним, але якщо веб-сайт, на якому він працює, потенційно може бути порушений помилкою, яка дозволила нефільтроване введення в базу даних і цей сайт пропонує якусь життєво важливу послугу, то він раптом стає набагато більше важливо, щоб сценарій гостьової книги був ретельно перевірений. Те саме стосується і рамки / бібліотечного коду. Якщо ви розробляєте фреймворк з помилкою, то кожна програма, яка використовує цю функцію фреймворку, також має ту саму помилку.
Тестова розробка надає додатковий рівень безпеки щодо тестів. Якщо ви пишете тести поряд або навіть після коду, який ви хочете перевірити, то існує реальний ризик неправильного тестування. Якщо ви спочатку пишете всі тести, то те, як код працює всередині, не може впливати на те, для чого ви пишете тести, і тому існує менша ймовірність, що ви ненавмисно пишете тести, які вважають, що певний помилковий вихід правильний.
Тестова розробка також заохочує ваших розробників писати код, який легко перевірити, оскільки вони не хочуть надавати собі ще більше роботи! Код, який легко перевірити, має тенденцію до коду, який легко зрозуміти, повторно використовувати та підтримувати.
І технічне обслуговування - це те, де ви справді отримаєте нагороди TDD. Переважна більшість програмних зусиль, витрачених на програмне забезпечення, пов'язане з технічним обслуговуванням. Це означає вносити зміни до живого коду, щоб надати йому нові функції, виправити помилки або адаптувати його до нових ситуацій. Вносячи такі зміни, ви хочете бути впевненими, що внесені вами зміни дають бажаний ефект, і що ще важливіше, вони не мають несподіваного впливу на ефекти. Якщо у вас є повний тестовий набір для вашого коду, то легко перевірити, що будь-які внесені вами зміни не порушують щось інше, і якщо внесені вами зміни порушують щось інше, ви можете швидко знайти причину. Переваги є довгостроковими.
У своєму запитанні ви сказали наступне:
Я бачу певну користь у написанні тестів на деякі речі, але дуже мало. І хоча мені спочатку подобається ідея написати тест, я вважаю, що витрачаю значно більше часу на тестування налагодження своїх тестів, щоб змусити їх сказати, що я маю на увазі, ніж я налагоджую фактичний код. Це, мабуть, тому, що тестовий код часто істотно складніше, ніж код, який він тестує. Я сподіваюся, що це просто недосвідчення доступних інструментів (rspec в даному випадку).
Це, здається, говорить про те, що ви не зовсім проходите тестування. Одиничний тест повинен бути надзвичайно простим, лише послідовність викликів методу, а потім супроводжується твердженням для порівняння очікуваного результату з фактичним результатом. Вони повинні бути простими, тому що помилки у ваших тестах були б згубними, і якщо ви вводите петлі, розгалуження чи іншу програму, кидайте контроль у тест, то стає більш ймовірним, що в тесті буде введена помилка. Якщо ви витрачаєте багато часу на тести налагодження, то це вказує на те, що ваші тести надмірно складні, і вам слід спростити їх.
Якщо тести неможливо спростити, то сам факт говорить про те, що з тестовим кодом щось не так. Наприклад, якщо у вашому класі є довгі методи, методи з великою кількістю операторів if / elseif / else або переключення або велика кількість методів, які мають складні взаємодії, продиктовані поточним станом класу, то тести за необхідністю повинні бути надзвичайно складними забезпечити повне покриття коду та перевірити всі можливі випадки. Якщо у вашому класі важко закодовані залежності від інших класів, це знову збільшить кількість обручів, на які вам доведеться перейти, щоб ефективно перевірити свій код.
Якщо ви залишаєте свої класи невеликими і високо зосередженими, за допомогою коротких методів з кількома шляхами виконання та намагаєтесь усунути внутрішній стан, тести можна спростити. І це свого роду суть справи. Хороший код по суті легко перевірити. Якщо код непростий для тестування, мабуть, з цим щось не так.
Складання одиничних тестів - це те, що вам подобається в довгостроковій перспективі, а уникати їх - просто зберігати проблеми на потім. Ви, можливо, не знайомі з поняттям технічної заборгованості, але воно дуже схоже на фінансовий борг. Не написання тестів, не коментування коду, написання твердо кодованих залежностей і так далі - це способи виникнення боргу. Ви "позичаєте" час, скорочуючи куточки на ранніх етапах, і це може допомогти вам досягти строгого терміну, але час, який ви заощадите раніше в проекті, є позикою. Кожен день, який проходить без очищення коду, коментування його належним чином або складання тестового набору коштуватиме вам цікавого. Чим довше це триває, тим більше накопичується інтерес. Врешті-решт, ви виявите, що ваш код став заплутаним безладом, до якого ви не можете внести зміни, не викликаючи ненавмисних наслідків.
Ви можете подумати про те, щоб якнайшвидше писати одиничні тести та постійно оновлювати їх як форму "технічного кредиту". Ви вкладаєте час у банк, витрачаючи його на початку проекту на дотримання належної практики. Ви зацікавитеся цим передбаченням пізніше, коли перейдете до етапу технічного обслуговування проекту. Коли ви хочете внести зміни, ви зможете легко перевірити правильність зміни та те, що вона не має жодних небажаних побічних ефектів, і ви можете отримати оновлення з дверей швидко та без суєти. Якщо помилки з'являються, ви можете додати новий тест одиниці, який здійснює помилку, а потім виправити помилку в коді. При наступному запуску модульного тесту ви зможете переконатися, що помилка була виправлена та що вона не викликала жодних інших проблем. Крім того, ви уникнете "регресії",
TL: DR - Так, вони є реальною допомогою у світі, але вони є інвестицією. Переваги стають очевидними лише пізніше.