Чи повинен я рефакторний тест на модуль, коли я вилучаю клас із системи, що перевіряється?


13

Я написав цей клас, який робить кілька речей (можливо, це є порушенням Принципу єдиної відповідальності). Зараз я усвідомлюю, що в якійсь іншій частині проекту потрібен фрагмент цієї логіки, і так, як я збираюся його викрити, - це вилучення класу з моєї оригінальної системи, що перевіряється.

Я передбачаю, що зможу це зробити, не змінюючи тестового коду, але коли я закінчу, ви можете стверджувати, що тест вже не є одиничним тестом. Це буде тестування оригінального класу та класу, який я видобув. Іншими словами, у мене буде один тестовий випадок, але дві системи, які перевіряються.

Чи повинен я повернути тестовий код після того, як я закінчу? IE: Створіть ExtractedClassTest і перемістіть у нього всі відповідні тести з OriginalClassTest? Це здається, що це може бути трохи ризиковано: я можу втратити деяке покриття в процесі, це може бути не так просто, як переміщення тесту, і я в кінцевому підсумку переписую якийсь тестовий код, який, як я знаю, працював, але не може більше, тощо.

З іншого боку, якщо я залишлю OriginalClassTest таким, який є, я можу побачити, що це проблема з тестовим технічним обслуговуванням. Буде трохи заплутано дізнатися, де знаходяться тести ExtractedClass. Ваше перше враження буде, що його не існує. З часом, з великою кількістю виробничих кодексів, це може стати серйозною проблемою.

Я новачок у TDD, тому я хотів би поради експерта. Спасибі!

Відповіді:


7

Переглянувши цю дивовижну розмову "Ян Купер: TDD, куди все пішло не так", я не погоджуюся з @pdr. Я думаю, вам слід тримати лише оригінальні тести. Ваша здатність до рефакторації вашої системи, яка перевіряється, не порушуючи, не записуючи та не змінюючи жодних тестів, - це в першу чергу мета написання тестів.

Якби я тестував вилучений клас, я б протестував реалізацію, а не поведінку. Як результат, мій код буде складніше переробити в майбутньому: ці нові тести, ймовірно, не зможуть, навіть якщо поведінка все-таки спрацювала.


6

За тривалістю розробки майте і те, і інше. Зберігайте старі тести як впевненість, що ви нічого не зламали, пишіть нові тести (з нуля), щоб допомогти вам розробити класи, як вони мають бути.

Зрештою, запустіть і видаліть все, що не було в старих тестах. Будьте уважні в цьому аналізі; не видаляйте щось, оскільки ви думаєте, що це повинно бути непрацездатним. Продемонструйте собі (чи комусь іншому чи гумову качку), чому вона вже не потрібна. Перервіть тест і переконайтеся, що з ним перерветься інший тест.

Все, що залишилося в старих тестах, слід брати для кожного випадку, але в основному вони повинні бути переписані в нову структуру.

Оскільки ти маєш рацію, ти не хочеш залишитись з кошмаром на технічне обслуговування. Але ви не хочете менше покриття шляху, ніж раніше.


1
Я щойно це зробив, і я повинен сказати, що це досить демотивує. Незважаючи на те, що мої зміни були прямо вперед, пройшло близько 2 годин, щоб переконатися, що я відновив свої тести правильно, і я все ще маю те саме покриття. Стало очевидним, що я повинен додати кілька додаткових тестів до нового тесту лише для того, щоб переконатися, що я перевіряв речі. Я вважаю, що було б ефективніше витягнути клас та залишити дві системи на тестуванні. Чи підказує ця кількість роботи, що я погано написав тести?
Даніель Каплан

1
@tieTYT: Важко відповісти на це, не сидівши, спостерігаючи за тобою. Іноді TDD виглядає як більша робота, ніж це варто. Іншим часом вам нагадають, чому ви турбуєтесь. І в інший час це саме ви ускладнюєте. Навчитися розказувати різницю - це велика частина отримання хорошого досвіду в TDD.
пдр

Як ви вважаєте, чи є ймовірність того, що в цьому випадку я не повинен був би відновити свої тести чи вважаєте, що це малоймовірно?
Даніель Каплан

1
@tieTYT: Навряд чи так. Неможливо, ні.
пдр
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.