Я ввів модульні тести в кодові бази, які раніше не були. Останній великий проект, з яким я брав участь, де я робив цей продукт, вже був у виробництві з нульовими тестовими одиницями, коли я прибув до команди. Коли я пішов - через 2 роки - у нас було 4500+ або більше тестів, що дало близько 33% покриття коду в кодовій базі з 230 000 + LOC виробництва (фінансовий додаток Win-Forms у режимі реального часу). Це може здатися низьким, але результатом було суттєве поліпшення якості коду та швидкості дефектів - плюс покращення моралі та рентабельності.
Це можна зробити, коли ви маєте як точне розуміння, так і відданість сторонам, які беруть участь у цьому.
Перш за все, важливо зрозуміти, що одиничне тестування - це вміння саме по собі. Ви можете бути дуже продуктивним програмістом за "звичайними" стандартами і все ще намагаєтеся писати одиничні тести таким чином, щоб масштабувати масштабніші проекти.
Крім того, спеціально для вашої ситуації додавання одиничних тестів до існуючої бази коду, яка не має тестів, також є спеціалізованою майстерністю. Якщо ви або хтось із вашої команди не має успішного досвіду введення тестів одиниць у існуючу базу коду, я б сказав, що читання книги Перу не є обов'язковою умовою (не є обов'язковою або настійно не рекомендується).
Перехід до одиничного тестування вашого коду - це інвестиція в людей та навички так само, як і в якість бази коду. Розуміння цього є дуже важливим з точки зору мислення та управління очікуваннями.
Тепер для ваших коментарів та питань:
Однак я стурбований тим, що в кінцевому підсумку я пропущу велику картину і пропущу фундаментальні тести, які були б включені, якби я використовував TDD з початку роботи.
Коротка відповідь: Так, ви пропустите тести, і так, вони, можливо, спочатку не будуть схожі на те, що вони мали б у ситуації із зеленим полем.
Відповідь глибшого рівня така: це не має значення. Ви починаєте без тестів. Почніть додавати тести та рефактор, як підете. Коли рівень кваліфікації покращиться, починайте підвищувати планку для всього щойно написаного коду, доданого до вашого проекту. Продовжуйте покращувати тощо ...
Тепер, читаючи між рядками тут, у мене складається враження, що це виходить із думки про «досконалість як привід для неприйняття заходів». Кращий спосіб мислення - зосередитись на впевненості в собі. Так як ви, можливо, ще не знаєте, як це зробити, ви зрозумієте, як рухатись і заповнити заготовки. Тому причин для занепокоєння немає.
Знову ж таки, це вміння. Не можна переходити від нульових тестів до TDD-досконалості одним «процесом» або «поетапним» приготуванням книжкового підходу лінійним способом. Це буде процес. Ваші очікування повинні полягати в поступовому та поступовому прогресі та вдосконаленні. Чарівної таблетки немає.
Хороша новина полягає в тому, що по мірі проходження місяців (і навіть років) ваш код поступово почне перетворюватися на «належний» і добре перевірений код.
Як бічна записка. Ви побачите, що головна перешкода для введення одиничних тестів у стару базу коду - це відсутність згуртованості та надмірні залежності. Тому, ймовірно, ви побачите, що найважливішим вмінням стане те, як зламати існуючі залежності та код роз'єднання, а не писати самі фактичні одиничні тести.
Чи є якісь процеси / кроки, яких слід дотримуватись, щоб забезпечити те, що існуючі рішення були належним чином перевірені, а не просто введені в дію?
Якщо у вас вже цього немає, налаштуйте сервер збірки та встановіть безперервну збірку інтеграції, яка працює на кожній реєстрації, включаючи всі тести одиниць із покриттям коду.
Тренуйте своїх людей.
Почніть десь і почніть додавати тести, поки ви прогресуєте з точки зору замовника (див. Нижче).
Використовуйте покриття коду як орієнтир про те, яка частина вашої виробничого коду знаходиться на тесті.
Час нарощування завжди повинен бути швидким. Якщо час збирання повільний, навички тестування одиниць відстають. Знайдіть повільні тести та вдосконаліть їх (відокремте виробничий код та випробування ізольовано). Добре написано, вам слід легко мати кілька тисяч одиничних тестів і все-таки завершити збірку за 10 хвилин (~ 1 - кілька мс / тест - це хороша, але дуже груба інструкція. Можливо, застосовуються деякі винятки, такі як код за допомогою відображення тощо. ).
Перевірити та адаптувати.
Як я можу переконатися, що тести є якісними і не є лише випадком будь-якого тесту, ніж кращим, ніж жодних тестів.
Ваше власне судження повинно бути вашим першоджерелом реальності. Немає метрики, яка може замінити майстерність.
Якщо у вас немає такого досвіду чи судження, подумайте про те, щоб укласти договір з тим, хто це робить.
Два грубі вторинні показники - це загальне покриття коду та швидкість збирання.
Чи варто докладати зусиль для існуючого рішення, яке знаходиться у виробництві?
Так. Переважна більшість коштів, витрачених на побудовану на замовлення систему чи рішення, витрачається після її виробництва. І вкладаючи гроші в якість, люди та навички ніколи не повинні бути невданими.
Чи було б краще проігнорувати тестування для цього проекту та додати його у можливій майбутній переписці?
Вам доведеться враховувати не тільки інвестиції в людей та навички, а головне загальну вартість власності та очікуваний час життя системи.
Моя особиста відповідь у більшості випадків була б "так, звичайно", тому що я знаю її набагато краще, але я визнаю, що можуть бути винятки.
Що буде кориснішим; витративши кілька тижнів на додавання тестів або кілька тижнів на додавання функціональності?
Ні. Ваш підхід повинен полягати в тому, щоб додати тести до вашої кодової бази НАВСЯК ви досягаєте прогресу з точки зору функціональності.
Знову ж таки, це вкладення коштів у людей, навички ТА якість кодової бази, і як таке воно вимагатиме часу. Члени команди повинні навчитися розбивати залежності, писати одиничні тести, вивчати нові звички, вдосконалювати дисципліну та усвідомлення якості, як краще розробляти програмне забезпечення тощо. Важливо розуміти, що коли ви починаєте додавати тести, члени вашої команди, ймовірно, не роблять володіти цими навичками ще на тому рівні, яким вони повинні бути, щоб цей підхід був успішним, тому зупиняти прогрес витрачати весь час, щоб додати багато тестів, просто не вийде.
Крім того, додавання тестових одиниць до існуючої кодової бази будь-якого значного розміру проекту - ВЕЛИЧЕЗЕ завдання, яке вимагає відданості та наполегливості. Ви не можете змінити щось принципове, очікуйте багато навчання в дорозі і попросіть свого спонсора не очікувати жодної рентабельності інвестицій, зупинивши потік ділової вартості. Це не пролетить, і, чесно кажучи, не повинно.
По-третє, ви хочете прищепити вашій команді здорові цінності фокусу на бізнесі. Якість ніколи не йде за рахунок замовника, і ви не можете швидко пройти без якості. Також замовник живе в мінливому світі, і ваше завдання - полегшити йому адаптацію. Вирівнювання клієнтів вимагає як якості, так і поточного значення бізнесу.
Що ви робите, це погашення технічної заборгованості. І ви це робите, все ще обслуговуючи своїх клієнтів, постійно змінюючи потреби. Поступово, коли борг погашається, ситуація покращується, і легше обслуговувати замовника і доставляти більше вартості. І т. Д. Цей позитивний імпульс - це те, до чого слід прагнути, оскільки він підкреслює принципи стійкого темпу і підтримуватиме та вдосконалює мораль - як для вашої команди розвитку, так і для клієнта та ваших зацікавлених сторін.
Сподіваюся, що це допомагає