У нас є великий мультиплатформенний додаток, написаний мовою C. (з невеликою, але зростаючою кількістю C ++). Він розвивався протягом багатьох років із багатьма функціями, яких ви очікували б у великому додатку C / C ++:
#ifdef
пекло- Великі файли, через які важко виділити перевіряється код
- Функції, які є занадто складними, щоб їх можна було легко перевірити
Оскільки цей код орієнтований на вбудовані пристрої, запустити його на фактичній цілі дуже багато. Тому ми хотіли б зробити більше нашої розробки та тестування за короткі цикли, на локальній системі. Але ми хотіли б уникнути класичної стратегії "скопіювати / вставити у файл .c у вашій системі, виправити помилки, скопіювати / вставити назад". Якщо розробники збираються зробити це для цього, ми хотіли б мати можливість відтворити ті самі тести пізніше та запускати автоматизовано.
Ось наша проблема: для того, щоб рефакторинг коду був більш модульним, нам потрібно, щоб він був більш перевіреним. Але для того, щоб запровадити автоматизовані модульні тести, нам потрібно, щоб вони були більш модульними.
Одна проблема полягає в тому, що оскільки наші файли настільки великі, ми можемо мати функцію всередині файлу, яка викликає функцію в тому ж файлі, яку нам потрібно заглушити, щоб зробити хороший модульний тест. Здається, це було б меншою проблемою, оскільки наш код стає більш модульним, але до цього ще далеко.
Одне, про що ми думали, - це позначення коментарем вихідного коду, який можна перевірити. Тоді ми могли б написати сценарій сканування скриптів для перевіреного коду, скомпілювати його в окремий файл і зв’язати з модульними тестами. Ми могли повільно запровадити модульні тести, оскільки ми виправляємо дефекти та додаємо більше функціональних можливостей.
Однак є занепокоєння, що підтримка цієї схеми (разом з усіма необхідними функціями заглушки) стане занадто великою проблемою, і розробники припинять підтримувати модульні тести. Тож інший підхід полягає у використанні інструменту, який автоматично генерує заглушки для всього коду, і пов’язує файл із цим. (єдиним інструментом, який ми знайшли, що зробить це, є дорогий комерційний продукт) Але, схоже, такий підхід вимагає, щоб увесь наш код був більш модульним, перш ніж ми зможемо почати, оскільки лише зовнішні дзвінки можна заглушити.
Особисто я волів би, щоб розробники думали про свої зовнішні залежності та розумно писали власні заглушки. Але це може бути приголомшливим, щоб загасити всі залежності для жахливо зарослого файлу в 10 000 рядків. Може бути важко переконати розробників, що їм потрібно підтримувати заглушки для всіх своїх зовнішніх залежностей, але чи це правильний спосіб це зробити? (Ще один аргумент, який я чув, полягає в тому, що супровідник підсистеми повинен підтримувати заглушки для своєї підсистеми. Але мені цікаво, чи "примушування" розробників писати власні заглушки призведе до кращого модульного тестування?)
#ifdefs
, Звичайно, додати ще цілий аспект проблеми.
Ми розглянули декілька платформ модульних тестів на основі C / C ++, і є безліч варіантів, які виглядають чудово. Але ми не знайшли нічого, що полегшило б перехід від "волосистої кулі коду без модульних тестів" до "коду, що перевіряється модулем".
Тож ось мої запитання до будь-кого іншого, хто пройшов через це:
- Що є гарною відправною точкою? Ми йдемо у правильному напрямку, чи нам не вистачає чогось очевидного?
- Які інструменти можуть бути корисними для переходу? (бажано безкоштовно / з відкритим кодом, оскільки наш бюджет зараз приблизно "нульовий")
Зверніть увагу, що наше середовище збірки базується на Linux / UNIX, тому ми не можемо використовувати жодні інструменти лише для Windows.