Що таке охоплення коду та як ви вимірюєте його?


275

Що таке охоплення коду та як ви вимірюєте його?

Мені було задано це питання стосовно покриття кодом автоматичного тестування. Здається, що поза автоматизованими інструментами це більше мистецтво, ніж наука. Чи є приклади реального світу, як використовувати покриття коду?

Відповіді:


242

Покриття коду - це вимірювання кількості рядків / блоків / дуг вашого коду, виконаних під час роботи автоматизованих тестів.

Покриття коду збирається за допомогою спеціалізованого інструменту для інструментації двійкових файлів для додавання викликів відстеження та проведення повного набору автоматизованих тестів на інструментальний продукт. Хороший інструмент дасть вам не тільки відсоток виконуваного коду, але також дозволить детально ознайомитись з даними та точно побачити, які рядки коду були виконані під час конкретного тесту.

Наша команда використовує Magellan - власний набір інструментів для покриття коду. Якщо ви є магазином .NET, Visual Studio має інтегровані інструменти для збору покриття коду. Ви також можете скочувати деякі спеціальні інструменти, як описано у цій статті .

Якщо ви магазин C ++, Intel має деякі інструменти, які працюють для Windows та Linux, хоча я не використовував їх. Я також чув, що є інструмент gcov для GCC, але я нічого не знаю про це і не можу надати вам посилання.

Щодо того, як ми його використовуємо - покриття коду є одним із наших критеріїв виходу для кожної віхи. Насправді у нас є три показники покриття коду - покриття від одиничних тестів (від команди розробників), тестів сценаріїв (від команди тестування) та комбінованого покриття.

BTW, хоча висвітлення коду - це хороший показник того, скільки ви проводите тестування, це не обов'язково є хорошим показником того, наскільки добре ви тестуєте свій продукт. Є інші показники, які слід використовувати разом із покриттям коду для забезпечення якості.


40
"Існують інші показники, які слід використовувати разом із покриттям коду для забезпечення якості." Чи можете ви сказати, що це за інші показники?
Десантники

Ви також можете використовувати Testwell CTC ++ , це досить повний інструмент покриття коду для C, C ++, C # та Java
B_PRIEUR

1
@Abdul Коли ви вимірюєте покриття коду, слід запускати обидва типи тестів і вимірювати охоплення коду для них окремо. Що стосується "дуг коду" - це гілки виконання коду, як якщо / то.
Франці Пенов

1
@Maverick більшість людей припускають тестування одиниць, коли вони говорять про покриття коду, проте в Microsoft ми вимірювали покриття коду як з тестування блоків, так і з інтеграційного тестування.
Франці Пенов

1
@darth_coder взагалі нічого. Додаток також не буде автоматично інструментуватися, і якщо нічого, що збирає дані інструментарію, присутність нової програми не має значення. Єдиний випадок, коли це може вплинути на речі, це те, що додаток працює одночасно з автоматичними тестами та викликає запуск інструментального коду ОС у тому ж процесі, що і тестова автоматизація, тим самим потенційно показуючи деякий код ОС як запущений, тобто не торкалися тестів.
Франці Пенов

189

Покриття коду в основному тестує те, що значна частина вашого коду охоплена тестами. Отже, якщо у вас 90% покриття коду, це означає, що 10% коду не покриваються тестами. Я знаю, що ви можете думати, що 90% коду покрито, але ви повинні дивитись з іншого кута. Що зупиняє вас на 100% покритті коду?

Хорошим прикладом буде такий:

if(customer.IsOldCustomer()) 
{
}
else 
{
}

Тепер у наведеному вище коді є два контури / гілки. Якщо ви завжди натискаєте на гілку "ТАК", тоді ви не охоплюєте іншу частину, і це буде показано в результатах покриття коду. Це добре, тому що тепер ви знаєте, що те, що не охоплено, і ви можете написати тест, щоб покрити іншу частину. Якщо не було покриття коду, то ви просто сидите на бомбі, яка вибухнула.

NCover - хороший інструмент для вимірювання покриття коду.


5
Найкраща відповідь, майже 10 років тому! Чорт! :)
Нікос

4
Проста і змістовна відповідь :)
Парвен

Так. Єдине, що мало сенс. Незважаючи на те, що я навіть не намагався продовжувати прокручування вниз. Тут я зупинився. Закладка.
TheRealChx101

64

Пам'ятайте лише, що "100% охоплення кодом" не означає, що все перевіряється повністю - хоча це означає, що кожен рядок коду тестується, це не означає, що вони перевіряються в кожній (звичайній) ситуації.

Я б використовував кодове покриття, щоб виділити біти коду, для якого, ймовірно, слід писати тести. Наприклад, якщо будь-який інструмент покриття коду показує, що myImportantFunction () не виконується під час виконання моїх поточних одиничних тестів, їх, мабуть, слід вдосконалити.

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


1
- "100% охоплення кодом" не означає, що все тестується повністю - хоча це означає, що кожен рядок коду тестується, це не означає, що вони перевіряються в кожній (звичайній) ситуації ..- "під кожною (загальною) ситуація "це стосується введення даних та параметрів? У мене виникають труднощі з розумінням того, що якщо все перевірено, це не прирівнюється до тестування повністю.
Абдул

20
Тільки тому, що кожен рядок вашого коду виконується в якийсь момент ваших тестів, це не означає, що ви перевірили кожен можливий сценарій, під яким може бути запущений код. Якби у вас була функція, яка приймала xі поверталася, x/xі ви провели тест за допомогою my_func (2), ви мали б 100% охоплення (оскільки код функції буде запущений), але ви пропустили величезну проблему, коли параметр 0. Тобто ви не протестували всі необхідні сценарії навіть із 100% охопленням.
Стів

Чи можете ви, будь ласка, заглянути в цю ситуацію, коли тестові приклади підрозділу написані не для всіх методів. Чи буде покриття кодом все ще 100%. stackoverflow.com/questions/43395968/…
Сачин Кумар

52

Доповнюючи кілька пунктів до багатьох попередніх відповідей:

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

Як було сказано вище у відповідях, існують різні критерії покриття, такі як шляхи, умови, функції, заяви тощо.

  1. Охоплення умов: Усі булеві вирази, що підлягають оцінці, відповідають істинним та хибним.
  2. Покриття рішення: Не просто булеві вирази, які повинні бути оцінені одночасно істинними та хибними, але охоплювати всі наступні тіла if-elseif-else.
  3. Покриття циклу: означає, чи виконується кожен можливий цикл одноразово, не раз та нуль. Крім того, якщо у нас є припущення про максимальну граничну величину, то, якщо це можливо, випробуйте максимальний граничний час і - один більше максимального граничного часу.
  4. Покриття входу та виходу: перевірка на всі можливі виклики та його повернене значення.
  5. Покриття значення параметра (ПВХ). Щоб перевірити, чи перевірені всі можливі значення параметра. Наприклад, рядок може бути будь-яким із таких: a) null, b) порожнім, c) пробілом (пробіл, вкладки, новий рядок), d) дійсним рядком, e) недійсним рядком, f) однобайтовим рядком, g ) двобайтовий рядок. Якщо не перевірити кожне можливе значення параметра, може залишитися помилка. Тестування лише одного з них може призвести до 100% покриття коду, оскільки кожен рядок охоплюється, але оскільки протестовано лише один із семи варіантів, значить, лише 14,2% покриття значення параметра.
  6. Покриття спадкування: У випадку об'єктно-орієнтованого джерела при поверненні похідного об'єкта, посиланого базовим класом, слід перевірити покриття для оцінки, чи повертається об'єкт рідних братів.

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


2
Приємне доповнення тут до інших відповідей
HDave

14

Покриття коду було добре пояснено в попередніх відповідях. Тож це скоріше відповідь на другу частину питання.

Ми використовували три інструменти для визначення покриття коду.

  1. JTest - фірмовий інструмент, побудований над JUnit. (Це також генерує одиничні тести.)
  2. Cobertura - інструмент покриття коду з відкритим кодом, який легко поєднується з тестами JUnit для створення звітів.
  3. Емма - ще одна - цю ми використовували для дещо іншої мети, ніж тестування одиниць. Він використовувався для створення звітів про покриття, коли веб-додаток отримує доступ до кінцевих користувачів. Це в поєднанні з інструментами веб-тестування (приклад: Canoo) може дати вам дуже корисні звіти про покриття, які розповідають, скільки коду охоплюється під час типового використання кінцевим користувачем.

Ми використовуємо ці інструменти для того, щоб

  • Подивіться, що розробники написали хороші одиничні тести
  • Переконайтесь, що під час тестування в чорному ящику пройде весь код

6

Покриття коду - це просто міра тестування коду. Існує безліч критеріїв покриття, які можна виміряти, але зазвичай це різні шляхи, умови, функції та заяви в межах програми, які складають загальне покриття. Показником покриття коду є лише відсоток тестів, які виконують кожен із цих критеріїв покриття.

Щодо того, як я займаюся відстеженням покриття тестових одиниць на своїх проектах, я використовую інструменти аналізу статичного коду для відстеження.


5

Для Perl є чудовий модуль Devel :: Cover, який я регулярно використовую на своїх модулях.

Якщо збірка та установка управляється Module :: Build, ви можете просто запустити, ./Build testcoverщоб отримати хороший HTML-сайт, який повідомляє про покриття під підряд, рядок та стан, з приємними кольорами, що дозволяє легко зрозуміти, який шлях коду не висвітлено.


1

У попередніх відповідях висвітлення коду було добре пояснено. Я лише додаю деякі знання, пов'язані з інструментами, якщо ви працюєте iOSта OSXплатформи, Xcode надає можливість тестувати та контролювати охоплення коду.

Довідкові посилання:

https://developer.apple.com/library/archive/documentation/DeveloperTools/Conceptual/testing_with_xcode/chapters/07-code_coverage.html

https://medium.com/zendesk-engineering/code-coverage-and-xcode-6b2fb8756a51

Обидва є корисними посиланнями для вивчення та вивчення покриття коду за допомогою Xcode.


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.