Тести написання одиниць у середині


14

Це тестування підрозділу на 100% чи це зовсім не така угода?

Я переглянув свої старі проекти і почав додавати функції, на цей раз з одиничним тестуванням. Однак чи це в кінцевому рахунку марно, якщо я буду повторно використовувати минулі компоненти, які не мають одиничних тестів?

Чи потрібно писати одиничні тести для всіх попередніх класів і взагалі не турбуватись, чи нормально писати одиничні тести лише для нових матеріалів, які я додаю?

Відповіді:


14

Будь-які одиничні тести краще, ніж жодні. Тож це не угода про все або нічого.

У вашому випадку, оскільки тестова розробка не є нормою - вам буде цікаво, якими тестами є користь.

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

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

Додано до інструменту покриття коду, як Emma - і ви зможете постійно контролювати поліпшення загального покриття тесту.


3

Я працював над дуже великою базою коду, яка спочатку не мала одиничних тестів. Дотримуючись декількох практик, ми зараз (через кілька років) маємо більшу частину кодової бази, охопленої тестами.

Весь новий код повинен мати одиничні тести.

До всього зміненого коду повинні бути додані одиничні тести.

Те, як ми безпечно додавали тести до старого коду, не порушуючи його, полягає насамперед у використанні наступного базового підходу:

Виберіть невеликий розділ коду, який вам потрібно змінити функціональність.

  1. Спробуйте створити тести інтеграції на системному рівні для оточення коду. Через комбінаторну складність тестування на цьому рівні ці тести будуть лише формувати тест "диму", щоб зібрати основні помилки.
  2. Введіть потрібні інтерфейси для того, щоб мати можливість перевірити змінений код. Використовуйте методи рефакторингу, що складаються з послідовностей дуже малих змін, до яких ви впевнені, є правильними. Спробуйте використовувати підтримку інструментів, де це можливо. Це можна зробити, наприклад, перемістивши / витягнувши метод, який ви змінюєте, на власний об’єкт. Регулярно перевіряйте зміни, щоб можна було повернути їх. Регулярно рецензуйте, як ви внесли зміни, переглянувши історію контролю редагування.

    Постарайтеся внести мінімум щодо змін, необхідних для того, щоб зламати залежності, які заважають вам додавати тести.

  3. Напишіть тести, наскільки це можливо, покрийте функціональність коду, який ви збираєтесь змінити. Регулярно відвідуйте та рецензуйте всі зміни.
  4. Напишіть тести на нову зміну функціональності / функціональності.
  5. Реалізуйте функціонал (це ваш звичайний цикл TDD)
  6. Переконайтесь, що рефакторируйте ділянки, які ви охопили тести (червоно-зелений-рефактор).

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

Ми спостерігали величезне зменшення кількості помилок, які потрапляли до наших тестувальників якості. Оскільки регресії функціональності зараз майже не чуті, тому я думаю, що варто було докласти зусиль для нас.


2

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


2

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


+1 "нові деталі - це найімовірніше, що містять помилки"
MIA

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

1

Ви можете почати висвітлювати свій поточний код і, якщо у вас є певний час, почати висвітлювати основний функціонал старого коду. Також ви можете попросити у прем'єр-міністра додатковий час для цього =)


0

Це тестування підрозділу на 100% чи це зовсім не така угода?

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

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