Спочатку TDD походить від рухливого руху, де тестування було написано на передній панелі як спосіб забезпечити те, що ви кодувались, залишилося правильним, враховуючи специфікацію, яка тепер була чітко визначена в тестовому коді. Це також виглядало як дуже важливий аспект рефакторингу, оскільки ви змінювали код, ви могли покластися на тести, щоб довести, що ви не змінили поведінку коду.
Тоді інструменти зібралися і подумали, що вони знають інформацію про ваш код і потім зможуть генерувати тестові заглушки, щоб допомогти вам у написанні одиничних тестів, і я думаю, що тут все пішло не так.
Тестові заглушки генеруються на комп’ютері, який не має поняття, що ви робите, він просто безглуздо виробляє заглушку для кожного методу, тому що саме так сказано. Це означає, що у вас є тестовий випадок для кожного методу, незалежно від складності цього методу або того, чи підходить він для тестування окремо.
Це відбувається при тестуванні з неправильного кінця методології TDD. У TDD ви повинні розібратися, що робити з кодом, а потім створити код, який цього домагається. Це самореалізується тим, що ви закінчуєте писати тести, які доводять, що код робить те, що робить код, а не те, що він повинен робити. У поєднанні з автоматичним створенням тестових заглушок на основі методу ви сильно витрачаєте свій час, доводячи кожен крихітний аспект свого коду, який може так легко виявитись неправильним, коли всі дрібні шматочки зібрані разом.
Коли Фаулер описав тестування у своїй книзі, він посилався на тестування кожного класу своїм основним методом. Він вдосконалив це, але концепція все-таки однакова - ви протестуєте весь клас, щоб він працював у цілому, всі ваші тести поєднані разом, щоб довести взаємодію всіх цих методів, щоб клас можна було повторно використовувати з визначеними очікуваннями.
Я думаю, що набори інструментів тестували нам користь, привели нас до думки, що інструментарій - це єдиний спосіб робити речі, коли насправді вам потрібно більше подумати, щоб отримати найкращий результат від свого коду. Якщо сліпо поставити тестовий код у тестові заглушки для крихітних шматочків, це просто означає, що вам доведеться повторити свою роботу в тесті інтеграції (і якщо ви збираєтесь це робити, то чому б не пропустити повністю надмірно тестовий етап одиниці). Це також означає, що люди витрачають багато часу, намагаючись отримати 100% тестовий покрив, і багато часу створюючи велику кількість глузуючого коду та даних, які краще витратити на полегшення коду для тесту інтеграції (тобто якщо у вас стільки залежність даних, одиничний тест може бути не найкращим варіантом)
Нарешті, крихкість тестових одиниць на основі методу лише показує проблему. Рефакторинг призначений для використання в одиничних тестах, якщо ваші тести постійно ламаються, тому що ви рефакторинг, то з усім підходом щось пішло серйозно не так. Рефакторинг любить створювати та видаляти методи, тому очевидно, що тестовий підхід на основі методу не є тим, що спочатку було призначено.
Я не сумніваюся, що багато методів отримають тести, написані для них, усі загальнодоступні методи класу повинні бути протестовані, але ви не можете відійти від концепції тестування їх разом як частини єдиного тестового випадку. Наприклад, якщо у мене є набір і метод отримання, я можу написати тести, які містять дані і перевіряють, чи внутрішні члени встановлені нормально, або я можу використовувати кожен, щоб ввести деякі дані, а потім знову вийти, щоб побачити, чи це все-таки такий же і не натертий. Це тестування класу, не кожен метод ізольовано. Якщо сеттер покладається на приватний метод помічника, то це нормально - вам не потрібно знущатися над приватним методом, щоб переконатися, що сетер працює, не якщо ви перевіряєте весь клас.
Я думаю, що релігія потрапляє в цю тему, отже, ви бачите розкол в тому, що зараз відомо як «поведінка, орієнтована на поведінку» та «тестово-орієнтована» розробка - оригінальна концепція одиничного тестування була розроблена для поведінки.