Покриття коду
Покриття коду (англ. code coverage, tests coverage) — міра, яка використовується при тестуванні програмного забезпечення. Вона визначається відсотком тестованого вихідного коду (сирцевий код) програми.
Техніка покриття коду була однією із перших методик, винайдених для систематичного тестування програмного забезпечення. Перша згадка покриття коду в публікаціях з'явилася 1963 року[1].
Критерії
Існує кілька різноманітних способів вимірювання покриття, основні з них:
- покриття операторів — чи кожен рядок коду був виконаний та відтестований;
- покриття умов — чи кожна гілка виконання (обчислення логічної умови) була виконана і відтестована;
- покриття шляхів — чи всі можливі шляхи через даний фрагмент коду були виконані та відтестовані;
- покриття функцій — чи кожна з функцій була виконана та відтестована;
- покриття вхід/вихід — чи всі виклики функцій та повернення із них були виконані та відтестовані.
Для програмного забезпечення із особливими вимогами до безпеки часто виникає потреба продемонструвати, що тестами досягається 100 % покриття для одного із критеріїв.
Деякі із наведених критеріїв покриття пов'язані поміж собою; для прикладу, покриття шляхів включає в себе і покриття умов і покриття операторів. Покриття операторів не включає в себе покриття умов, як демонструє фрагмент програми мовою програмування Сі:
printf("this is");
if (bar < 1)
{
printf(" not ");
}
printf("a positive integer");
Якщо тут bar = −1
, то покриття операторів буде цілковитим, а покриття умов — ні, через те, що випадок недотримання умови в операторі if — не покритий (і при цьому для додатних чисел вивід буде спотворений). Повне покриття зазвичай неможливе. Фрагмент коду, який містить n умов, містить шляхів; в той час як цикл взагалі породжує безмежну кількість шляхів. Деякі шляхи в програмі можуть бути недосягнутими у зв'язку з тим, що в тестових даних були відсутніми такі дані, які могли привести до виконання цих шляхів. Не існує універсального алгоритму, який би вирішував проблему неосяжних шляхів (цей алгоритм можна було б використовувати для вирішення проблеми зупинки).
На практиці, для досягнення покриття шляхів використовують наступний підхід: виділяються класи шляхів (до прикладу, до одного класу можна віднести шляхи, які відрізняються лише кількістю ітерацій в одному й тому ж циклі), 100 % покриття досягнуте, якщо покриті всі класи шляхів (клас вважається покритим, якщо покрито хоча б один шлях з нього).
Практичне застосування
Зазвичай вихідний код забезпечується тестами, які регулярно виконують. Отриманий звіт аналізується з метою виявити ті ділянки коду, які не протестовані, після чого проводиться оновлення набору тестів, а саме пишуться тести для непокритих ділянок коду. Ціль полягає в тому, щоб отримати набір тестів для регресивного тестування, при якому детально перевіряється весь вихідний код.
Ступінь покриття коду зазвичай представляють у відсотковому вигляді. До прикладу, «було протестовано 67 % коду». Зміст цієї фрази залежить від того, який критерій було використано, оскільки 67 % покриття шляхів — це кращий результат ніж 67 % покриття операторів. Питання про взаємозв'язок покриття коду та якості тестового набору на даний момент ще не є остаточно вирішеним.
Реалізації
- gcov - gcc
- tcov - sun
- Testwell CTC++
Виноски
- Joan C. Miller, Clifford J. Maloney (February 1963). Systematic mistake analysis of digital computer programs. Communications of the ACM (New York, NY, USA: ACM) 6 (2): 58–63. ISSN 0001-0782. doi:10.1145/366246.366248.
Посилання
- RTCA/DO-178B. Software Considerations In Airborne Systems And Equipment Certification, 1992.
Дивись також
- Метрика програмного забезпечення
- Регресивне тестування
- Покриття вимог