Покриття коду

Матеріал з Вікіпедії — вільної енциклопедії.
Перейти до: навігація, пошук

Покриття коду — міра, яка використовується при тестуванні програмного забезпечення. Вона відображає відсоток, наскільки вихідний код(сирцевий код) програми був відтестований.

Техніка покриття коду була однією із перших методик, винайдених для систематичного тестування програмного забезпечення. Перша згадка покриття коду в публікаціях з'явилася 1963 року[1].

Критерії[ред.ред. код]

Існує кілька різноманітних способів вимірювання покриття, основні з них:

  • покриття операторів — чи кожен рядок коду був виконаний та відтестований;
  • покриття умов — чи кожна гілка виконання (обчислення логічної умови) була виконана і відтестована;
  • покриття шляхів — чи всі можливі шляхи через даний фрагмент коду були виконані та відтестовані;
  • покриття функцій — чи кожна з функцій була виконана та відтестована;
  • покриття вхід/вихід — чи всі виклики функцій та повернення із них були виконані та відтестовані.

Для програмного забезпечення із особливими вимогами до безпеки часто виникає потреба продемонструвати, що тестами досягається 100 % покриття для одного із критеріїв.

Деякі із наведених критеріїв покриття пов'язані поміж собою; для прикладу, покриття шляхів включає в себе і покриття умов і покриття операторів. Покриття операторів не включає в себе покриття умов, як демонструє фрагмент програми мовою програмування Сі:

printf("this is"); 
if (bar < 1)
{
    printf(" not ");
}
printf("a positive integer");

Якщо тут bar = −1, то покриття операторів буде цілковитим, а покриття умов — ні, через те, що випадок недотримання умови в операторі if — не покритий (і при цьому для додатніх чисел вивід буде спотворений). Повне покриття зазвичай неможливе. Фрагмент коду, який містить n умов, містить 2^n шляхів; в той час як цикл взагалі породжує безмежну кількість шляхів. Деякі шляхи в програмі можуть бути недосягнутими у зв'язку з тим, що в тестових даних були відсутніми такі дані, які могли привести до виконання цих шляхів. Не існує універсального алгоритму, який би вирішував проблему носяжних шляхів (цей алгоритм можна було б використовувати для вирішенняпроблеми зупинки).

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

Практичне застосування[ред.ред. код]

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

Ступінь покриття коду зазвичай представляють у відсотковому вигляді. До прикладу, «було протестовано 67 % коду». Зміст цієї фрази залежить від того, який критерій було використано. Так як 67 % покриття шляхів — це кращий результат ніж 67 % покриття оперторів. Питання про взаємозв'язок покриття коду та якості тестового набору на даний момент ще не є остаточно вирішеним.

Виноски[ред.ред. код]

  1. Joan C. Miller, Clifford J. Maloney Systematic mistake analysis of digital computer programs // Communications of the ACM. — 6 (February 1963) (2) С. 58–63. DOI:10.1145/366246.366248.

Посилання[ред.ред. код]

  • RTCA/DO-178B. Software Considerations In Airborne Systems And Equipment Certification, 1992.

Дивись також[ред.ред. код]

Реалізації[ред.ред. код]