Підхід "написати тест + рефактор до проходу" виглядає неймовірно антиінженерним.
Ви, мабуть, помилково уявляєте як рефакторинг, так і TDD.
Рефакторинг коду - це процес зміни вихідного коду комп'ютерної програми без зміни його зовнішньої функціональної поведінки з метою вдосконалення деяких нефункціональних атрибутів програмного забезпечення.
Таким чином, ви не можете рефакторний код, поки він не пройде.
І TDD, зокрема тестування модулів (що я вважаю вдосконаленням ядра, оскільки інший тест здається мені досить правдоподібним), не стосується перепроектування компонента, поки він не працює. Йдеться про розробку компонента та роботу над реалізацією, поки компонент не працює так, як було задумано.
Також важливо дійсно зрозуміти, що тестування блоку стосується тестування одиниць . Через тенденцію завжди писати багато речей з нуля, важливо протестувати такі одиниці. Будівельний інженер вже знає характеристики підрозділів, які він використовує (різні матеріали), і може очікувати, що вони працюватимуть. Це дві речі, які часто не стосуються інженерів програмного забезпечення, і це дуже інженерно тестування блоків перед їх використанням, оскільки це означає використання перевірених високоякісних компонентів.
Якщо у будівельного інженера виникла ідея використати нову волоконну тканину для виготовлення даху для покриття стадіону, ви очікуєте, що він перевірить її як одиницю, тобто визначить необхідні характеристики (наприклад, вага, прохідність, стійкість тощо) і після цього випробуйте і вдосконаліть його, поки він не відповідає.
Ось чому TDD працює. Тому що якщо ви створюєте програмне забезпечення перевірених підрозділів, швидше за все, це спрацює, коли ви підключаєте їх, і якщо це не так, ви можете очікувати, що проблема буде в вашому клейовому коді, якщо припустити, що ваші тести мають хороше покриття.
редагувати:
Рефакторинг означає: відсутність змін у функціональності. Одним із пунктів тестування блоку є те, щоб переконатися, що рефакторинг не порушує код. Отже, TDD покликаний запевнити, що рефакторинг не має побічних ефектів.
Зернистість не є предметом перспектив, оскільки, як я вже сказав, одиниці випробовують випробувальні одиниці, а не системи, в результаті яких деталізація точно визначена.
TDD заохочує гарну архітектуру. Це вимагає, щоб ви визначили та впровадили технічні характеристики для всіх своїх підрозділів, змусивши вас спроектувати їх до впровадження, що абсолютно протилежне тому, що ви, здається, думаєте. TDD диктує створення одиниць, які можуть бути протестовані індивідуально і, таким чином, повністю відокремлені.
TDD не означає, що я кидаю тест на програмне забезпечення на спагеті-код і розмішую пасту, поки вона не пройде.
На відміну від цивільного будівництва, в інженерії програмного забезпечення проект зазвичай постійно розвивається. У цивільному будівництві у вас є вимога побудувати міст у положенні A, який може перевозити х тонн і досить широкий для n транспортних засобів на годину.
В інженерії програмного забезпечення клієнт може в основному вирішити в будь-який момент (можливо, після його завершення), що він хоче двоповерховий міст, і що він хоче, щоб він був пов'язаний з найближчою автострадою, і що він хотів би, щоб це був підйомний міст, тому що його компанія нещодавно почали використовувати вітрильні кораблі.
Інженерам програмного забезпечення доручено змінити дизайн. Не тому, що їх конструкції є недоліками, а тому, що це modus operandi. Якщо програмне забезпечення добре розроблене, воно може бути перероблено на високому рівні, не потребуючи перезапису всіх компонентів низького рівня.
TDD - це створення програмного забезпечення з індивідуально протестованими, сильно роз'єднаними компонентами. Добре виконаний, він допоможе вам реагувати на зміни вимог значно швидше та безпечніше, ніж без.
TDD додає вимог до процесу розробки, але не забороняє жодних інших методів забезпечення якості. Зрозуміло, TDD не забезпечує таку ж безпеку, як формальна перевірка, але знову ж таки, формальна перевірка є надзвичайно дорогою та неможливою для використання на системному рівні. І все-таки, якби ти захотів, ти міг би поєднати і те, і інше.
TDD також включає тести, окрім одиничних тестів, які виконуються на системному рівні. Мені це легко пояснити, але важко виконати і важко виміряти. Також вони досить правдоподібні. Хоча я абсолютно бачу їхню необхідність, я не дуже ціную їх як ідеї.
Зрештою, жоден інструмент насправді не вирішує проблему. Інструменти лише полегшують вирішення проблеми. Ви можете запитати: Як долото допоможе мені чудовою архітектурою? Добре, якщо ви плануєте робити прямі стіни, прямі цегли допоможуть. І так, якщо ви дасте цей інструмент ідіоту, він, мабуть, зрештою його проступить через ногу, але це не вина долота, оскільки це не вада TDD, що вона дає помилкову безпеку новачкам, які не пишуть хороших тестів.
Таким чином, у нижньому рядку можна сказати, що TDD працює набагато краще, ніж жодна TDD.