Я працював над дуже великою базою коду, яка спочатку не мала одиничних тестів. Дотримуючись декількох практик, ми зараз (через кілька років) маємо більшу частину кодової бази, охопленої тестами.
Весь новий код повинен мати одиничні тести.
До всього зміненого коду повинні бути додані одиничні тести.
Те, як ми безпечно додавали тести до старого коду, не порушуючи його, полягає насамперед у використанні наступного базового підходу:
Виберіть невеликий розділ коду, який вам потрібно змінити функціональність.
- Спробуйте створити тести інтеграції на системному рівні для оточення коду. Через комбінаторну складність тестування на цьому рівні ці тести будуть лише формувати тест "диму", щоб зібрати основні помилки.
Введіть потрібні інтерфейси для того, щоб мати можливість перевірити змінений код. Використовуйте методи рефакторингу, що складаються з послідовностей дуже малих змін, до яких ви впевнені, є правильними. Спробуйте використовувати підтримку інструментів, де це можливо. Це можна зробити, наприклад, перемістивши / витягнувши метод, який ви змінюєте, на власний об’єкт. Регулярно перевіряйте зміни, щоб можна було повернути їх. Регулярно рецензуйте, як ви внесли зміни, переглянувши історію контролю редагування.
Постарайтеся внести мінімум щодо змін, необхідних для того, щоб зламати залежності, які заважають вам додавати тести.
- Напишіть тести, наскільки це можливо, покрийте функціональність коду, який ви збираєтесь змінити. Регулярно відвідуйте та рецензуйте всі зміни.
- Напишіть тести на нову зміну функціональності / функціональності.
- Реалізуйте функціонал (це ваш звичайний цикл TDD)
- Переконайтесь, що рефакторируйте ділянки, які ви охопили тести (червоно-зелений-рефактор).
Ми виявили, що чим більше ми робимо це, тим легше було. Як і кожного разу, коли ви повертаєтесь до бази коду, це трохи краще.
Ми спостерігали величезне зменшення кількості помилок, які потрапляли до наших тестувальників якості. Оскільки регресії функціональності зараз майже не чуті, тому я думаю, що варто було докласти зусиль для нас.