code coverage tutorial
Цей вичерпний посібник пояснює, що таке висвітлення коду при тестуванні програмного забезпечення, його види, переваги та недоліки:
Кінцевою метою будь-якої компанії-розробника програмного забезпечення є розробка якісного програмного забезпечення. Для досягнення цієї мети програмне забезпечення має бути ретельно протестовано.
Таким чином, тестування є невід'ємною частиною розробки програмного додатку. Отже, важливо, щоб розроблене програмне забезпечення перевірялося розробником (що робиться на етапі модульного тестування), а потім передавалось команді контролю якості для ретельного тестування, щоб переконатися, що воно містить мінімальні помилки або відсутні.
Програмне забезпечення проходить модульне тестування перед тим, як відпустити його на перевірку фактичній тестовій групі. Оскільки це тестування передбачає тестування на рівні коду, це робиться розробником. Це робиться для того, щоб кожна частина коду, що перевіряється, працювала належним чином.
Тут невеликі фрагменти коду, які були розроблені, перевіряються ізольовано для забезпечення їх правильності. Але питання, яке часто вимальовується у свідомості розробника, є скільки модульного тестування слід зробити і відповідь на це полягає у висвітленні кодексу.
Цей підручник дасть вам глибокі знання про те, що таке висвітлення коду та навіщо воно нам потрібне. Ви дізнаєтесь, чим воно відрізняється від випробувального покриття.
Ми також поглянемо на інструменти та методології, які використовуються для висвітлення коду, і наприкінці цього підручника ми побачимо переваги разом з його недоліками. Деякі міфи, пов'язані з висвітленням коду, також будуть висвітлені тут.
Що ви дізнаєтесь:
Що таке висвітлення коду
Це важлива метрика одиничного тестування. Це дуже зручно в знанні ефективності модульних тестів. Це міра, яка вказує, який відсоток вихідного коду буде виконано під час тестування.
Простіше кажучи, ступінь, до якого вихідний код програмного забезпечення або програми буде виконаний під час тестування, називається покриттям коду.
Якщо тести виконують весь фрагмент коду, включаючи всі гілки, умови або цикли, тоді ми сказали б, що існує повне охоплення всіх можливих сценаріїв, і, отже, покриття коду становить 100%. Щоб зрозуміти це ще краще, візьмемо приклад.
Нижче наведено простий код, який використовується для додавання двох чисел та відображення результату залежно від значення результату.
Input a, b Let c = a + b If c <10, print c Else, print ‘Sorry’
Вищевказана програма приймає два входи, тобто 'a' і 'b'. Сума обох зберігається у змінній c. Якщо значення c менше 10, тоді значення 'c' друкується, інакше надрукується 'Sorry'.
Тепер, якщо у нас є кілька тестів для перевірки вищезазначеної програми зі значеннями a & b, такі що сума завжди менше 10, тоді інша частина коду ніколи не виконується. У такому випадку ми сказали б, що охоплення не є повним.
Це був лише невеликий приклад, щоб пояснити значення висвітлення коду. Оскільки ми будемо досліджувати більше, ви отримаєте кращу ясність щодо цього.
Навіщо нам потрібне охоплення коду
(зображення джерело )
Різні причини роблять висвітлення коду важливим, і деякі з них перелічені нижче:
список зважених графів суміжності c ++
- Це допомагає встановити, що програмне забезпечення має менше помилок порівняно з програмним забезпеченням, яке не має належного покриття коду.
- Сприяючи покращенню якості коду, це опосередковано допомагає забезпечити більш якісне програмне забезпечення.
- Це міра, за допомогою якої можна дізнатися ефективність тесту (ефективність модульних тестів, написаних для тестування коду).
- Допомагає ідентифікувати ті частини вихідного коду, які не перевірятимуться.
- Це допомагає визначити, чи є поточне тестування (модульне тестування) достатнім чи ні, і чи потрібні ще деякі тести.
Покриття коду проти тестового покриття
Щоб зрозуміти різницю між покриттям коду та тестовим покриттям, давайте спочатку зрозуміємо значення тестового покриття.
Покриття тесту
Це показник того, скільки частин очікуваного тестування було охоплено під час тестування програмного забезпечення. Автор 'Очікуване тестування' ми маємо на увазі повний набір тестових кейсів, які написані для виконання для тестування певного програмного забезпечення.
Припустимо, для тестування програмного забезпечення було складено 500 загальних тестових кейсів. Зараз в рамках тестування було виконано лише 300 тестових справ. Припустимо, це пов’язано з браком часу. У цьому випадку нижче буде подано тестове покриття.
Покриття тесту = (Виконані тестові випадки / Загальна кількість тестових випадків) * 100
= (300/500) * 100
= 60%
Давайте порівняємо це з тим, що таке висвітлення коду.
Покриття коду
Це міра, яка показує, якою мірою виконується вихідний код програми під час тестування коду. Таким чином, це показує ступінь тестування вихідного коду.
Припустимо, щоб протестувати додаток із 500 рядками коду, тести виконують лише 400 рядків коду. Припустимо, що це пов’язано з тим, що певний цикл / умова не виконується. У цьому випадку нижче буде описано код.
Покриття коду = (кількість виконаних рядків коду / загальна кількість рядків коду) * 100
= (400/500) * 100
= 80%
Нижче наведено відмінності між покриттям коду та покриттям тесту:
Покриття тесту | Покриття коду |
---|---|
Це показник того, яка частина передбачуваного тестування була охоплена під час тестування програмного забезпечення. | Це міра, яка показує, якою мірою виконується вихідний код програми під час тестування коду. |
Покриття тесту можна розрахувати за наведеною нижче формулою: Покриття тесту = (Виконані тестові випадки / Загальна кількість тестових випадків) * 100 | Покриття коду можна розрахувати за наведеною нижче формулою: Покриття коду = (кількість виконаних рядків коду / загальна кількість рядків коду) * 100 |
Методології
Тут ми обговоримо різні методи, які є / можуть бути використані для вимірювання охоплення Кодексу.
Щоб зрозуміти ці методології, давайте розглянемо наведений нижче фрагмент коду:
найкращий безкоштовний конвертер DVD в AVI - -
Add (int a, int b) { If (b > a) { b = b - a Print b } If (a > b) { b = a – b Print b } Else Print ‘0’ }
Покриття заяви
Ця методологія є мірою, яка повідомляє, чи всі можливі виконувані оператори коду у вихідному коді були виконані принаймні один раз. Це метод, який гарантує, що кожен рядок вихідного коду принаймні один раз охоплюється тестами.
Це може здатися простим, але потрібно дотримуватися обережності під час вимірювання охоплення звітності. Причиною є те, що у вихідному коді може бути певна умова, яка може не виконуватися залежно від вхідних значень.
Це означало б, що всі рядки коду не будуть охоплені тестуванням. Таким чином, нам може знадобитися використовувати різні набори вхідних значень, щоб охопити всі такі умови у вихідному коді.
Наприклад, у наведеному вище вихідному коді, якщо вхідні значення приймаються як 2 і 3, тоді частина «Інакше» коду не буде виконана. Однак, якщо введені значення мають типи 3 і 2, тоді частина коду «Якщо» не буде виконана.
Це означає, що за будь-якого з наборів значень нашого випису охоплення не буде 100%. У такому випадку нам, можливо, доведеться виконати тести з усіма трьома ((2, 3), (3, 2), (0, 0)) наборами, щоб забезпечити 100% покриття виписки.
Покриття функції
Як випливає з назви, ця методологія вимірює ступінь охоплення функцій, присутніх у вихідному коді, під час тестування. Всі функції, які містяться у вихідному коді, перевіряються під час виконання тесту. Знову ж таки, слід переконатися, що ми перевіряємо ці функції на різні значення, щоб функція була ретельно перевірена.
У вихідному коді може бути декілька функцій, і залежно від використовуваних вхідних значень функція може бути викликана або не викликана. Отже, метою Покриття функцій є забезпечення того, щоб у нас була кожна функція, до якої вимагається.
Наприклад, у наведеному вище вихідному коді, якщо наші тести навіть один раз викликають функцію «Додати», тоді ми називаємо це як повне покриття функції.
Покриття стану
У вихідному коді, де б ми не мали умови, результатом буде логічне значення або true, або false. Покриття умов має на меті встановити, чи включають тести обидва значення, тобто істинне, хибне.
У вихідному коді, коли кожна зустрічається умова обчислюється як для істинних, так і для помилкових станів, тоді Покриття умов для коду називається повним.
Наприклад, у наведеному вище коді, якщо використовуються набори значень (2, 3) та (4, 2), тоді Покриття умов буде 100%. Коли використовується набір даних (2, 3), тоді (b> a) отримує значення true, а (a> b) - false. Подібним чином, коли використовується набір даних (4, 2), тоді (b> a) оцінює як false і (a> b) - як true.
Таким чином, обидві умови мають як значення, тобто істинне та хибне. Отже, охоплення умовами буде 100%.
Покриття філії
Ця методологія спрямована на те, щоб кожна гілка, що з’являється у кожній умовній структурі, виконувалась у вихідному коді. Наприклад, у наведеному вище коді всі оператори «If» та будь-яке супровідне твердження «Else» повинні охоплюватися тестом на 100% охоплення філій.
Наприклад, у наведеному вище коді, якщо використовуються набори значень (2, 3), (4, 2), (1, 1), тоді охоплення філії буде 100%. Коли використовується набір даних (2, 3), тоді (b> a) і виконується перша гілка «Якщо». Подібним чином, коли використовується набір даних (4, 2), тоді (a> b) отримує значення true і виконується друга гілка «Якщо».
Потім із набором даних (1, 1) гілка ‘Else’ обчислюється як true і виконується. Тим самим забезпечуючи 100% охоплення філій.
Покриття філії проти стану покриття
Покриття філій часто плутають із покриттям умов, однак ці два відмінності.
Давайте зрозуміємо це на простому прикладі.
If (a >0) & (b >0) Then Print “Hello” Else Print “Bye”
Давайте запишемо набір даних, необхідний для завершення Покриття філії:
(1, 1) - У цьому випадку і a, і b є істинними, тому умова If виконується.
(1, 0) - У цьому випадку значення 'a' відповідає дійсності, а значення 'b' буде помилковим, тому виконується інша частина коду.
Як ми знаємо, метою Покриття філій є виконання кожної гілки хоча б один раз, і ця мета досягнута.
Покриття стану:
(1, 0) - У цьому випадку 'a' відповідає дійсності, а 'b' буде помилковим.
(0, 1) - У цьому випадку „a“ є хибним, а „b“ буде істинним.
Метою Покриття умов є отримання кожного з істинних та хибних для кожної виконаної умови, і ця мета тут досягнута.
Ви помічали, що інша частина не виконується в умовах покриття? Це те, чим покриття умов відрізняється від покриття філій.
Інструменти для охоплення коду
Для вимірювання охоплення кодом будь-якого програмного забезпечення на ринку доступно кілька інструментів.
Нижче наведено деякі інструменти для довідки:
- Parasoft JTest
- Testwell CTC ++
- Покриття
- JaCoCo
- CodeCover
- Покриття Bullseye
- EMMA
- OpenCover
- NCover
- Хлюп КОКО
- Вимірювач покриття
- GCT
- TCAT C / C ++
- Гретель
- JCov
Рекомендована література => Інструменти покриття коду
Вищевказане посилання міститиме наступну інформацію про ці інструменти:
- Основні характеристики
- Тип ліцензії
- Офіційна URL-адреса
- Плюси і мінуси
- Остання версія
Переваги
Як видно вище, це дуже корисні показники тесту з наведених нижче причин:
- Це допомагає визначити ті області у вихідному коді, які залишаться неперевіреними / не виявленими тестами.
- Це дуже зручно при ідентифікації використаного / мертвого коду, тим самим покращуючи якість коду.
- Ефективність модульних тестів може бути відома за допомогою Code Coverage.
- За допомогою цих показників можна поставити програмне забезпечення кращої якості.
Недоліки
- Намагання забезпечити 100% охоплення коду іноді спричиняє недостатню надійність тестів, що призводить до втрати сценаріїв, схильних до дефектів.
- На відміну від загальноприйнятого сприйняття, воно не може гарантувати, якщо розроблене програмне забезпечення задовольняє всі вимоги.
Міфи проти фактів
Міф | Факт |
---|---|
Наявність 100% покриття коду гарантує, що програмне забезпечення не матиме помилок. | Ні, 100% покриття коду не може гарантувати вільне програмне забезпечення. Хороше покриття коду в поєднанні з гарними зусиллями команди контролю якості може забезпечити програмне забезпечення з мінімальними помилками або без них. |
Наявність 100% покриття коду означає, що написаний код ідеальний. | Ні, власне кажучи, якщо важливі вимоги спочатку не були зафіксовані кодом, тоді код не можна назвати досконалим, незважаючи на 100% покриття коду. |
Покриття коду вимірює ефективність тестів, проведених на програмному продукті. | Ні, Покриття коду - це просто міра, яка використовується для перевірки ефективності модульних тестів, тобто тестів, виконаних лише на вихідному коді Програмного забезпечення. |
FAQ
Q # 1) Що є прийнятним висвітленням коду?
Відповідь: Досягнення 100% охоплення коду не повинно бути метою під час модульного тестування програмного коду. Але чому б і ні? Щоб зрозуміти причину, можливо, вам доведеться зануритися трохи глибше, щоб зрозуміти основне значення.
Коли ми націлюємося на 100% охоплення, то частіше трапляється, що вся увага при розробці тестів спрямована на те, щоб тестуватись кожне твердження, цикл, гілка чи умова. Отже, ми докладаємо занадто багато зусиль, які, можливо, не варті врахування витраченого часу.
Більше того, зосередження уваги на високому висвітленні також призводить до упущення важливих сценаріїв, які можуть мати дефекти, оскільки все, що ми прагнемо, це забезпечити тестування кожного рядка коду.
Зосередження уваги на високому охопленні коду не завжди важливо, і це не може бути фіксованим числом, яке потрібно орієнтувати для тестування різних кодів. Однак загалом охоплення 75% - 80% має бути ідеальним числом.
Під час тестування нашого коду основна увага повинна бути зосереджена на забезпеченні охоплення критичних та можливих схильних до помилок сценаріїв. Якщо їх пропустити, то, незважаючи на 100% покриття коду, наші тести просто матимуть низьку ефективність.
Q # 2) Як перевірити покриття коду?
Відповідь: Для перевірки відсотка покриття коду, якого ви могли б досягти за допомогою тестів, призначених для тестування коду, ми маємо на ринку кілька інструментів. Залежно від мови програмування, яка використовується, ми маємо різні інструменти.
Деякі з них перелічені нижче:
- Java - Покриття, JaCoCo
- Javascript - Blanket.js, Стамбул
- Python - Coverage.py
- Рубін - SimpleCov
Використовуючи ці інструменти, ми можемо отримати повний звіт про тести, які допоможуть нам знати, яка частина коду буде виконана, а яка буде втрачена нашими тестами.
Q # 3) Чи охоплення кодом є хорошою метрикою?
список мов програмування високого рівня
Відповідь: У реальних сценаріях це корисно певною мірою і певним чином.
Спочатку дивлячись на його обмеження, ми добре знаємо, що наявність 100% покриття не гарантує, що Кодекс не містить помилок, а також не гарантує, що всі вимоги були охоплені кодексом, тобто, незважаючи на 100% покриття коду, ми є дуже ймовірно, що в коді є помилки, причиною є те, що покриття не гарантує тестування всіх сценаріїв.
Більше того, якщо вимоги були пропущені під час написання коду, то немає ніякого відображення вимог з кодом, про який піклуються як про частину охоплення коду.
Сказавши це, ми не можемо заперечувати, що коли ми використовуємо покриття коду як метрики, це дає нам уявлення, чи ми охопили основні вимоги тестування кожного рядка нашого коду. Цей відсоток охоплення дає нам уявлення про те, скільки частин нашого коду виконується за допомогою наших модульних тестів.
Ми дізнаємось, скільки нашого коду буде невиконано. Це, у свою чергу, допомагає нам вирішити, наскільки більше модульних тестів потрібно і для яких частин коду.
Таким чином, ми можемо зробити висновок, що поганий рівень охоплення дає нам уявлення про неефективність модульних тестів. У той же час забезпечення 100% покриття не є гарантією коду без дефектів. Таким чином, потрібно мати збалансований підхід, коли ми не надто підкреслюємо важливість націлювання на високий відсоток покриття коду.
Q # 4) Як я можу покращити охоплення коду?
Відповідь: Звіт про охоплення коду, який надається інструментами охоплення, такими як JaCoCo, Стамбул тощо, показує сфери, які охоплюються тестами, а також ті, які залишаться невипробуваними.
Знаючи неперевірені частини коду, тести можна писати як вручну, так і за допомогою будь-якого інструменту автоматизації, щоб охопити області, які в іншому випадку залишаться неперевіреними, і тим самим збільшити покриття коду.
Тут важливо відзначити, що, хоча ми можемо написати сотні рядків коду для тестування функції в коді, але охоплення може бути набагато меншим. Причина в тому, що занадто глибоке тестування частини величезного коду не допоможе збільшити покриття коду.
Таким чином, якщо метою є збільшення охоплення, тоді слід подбати про те, щоб охопити всі функції, умови та петлі, замість того, щоб занурюватися глибоко в одну функцію та писати великі тести для цієї єдиної функції.
Висновок
Високоякісний програмний продукт - це те, що потрібно в сучасному швидкому темпі Інтернету.
За забезпечення якісного програмного забезпечення відповідає не тільки інженер з контролю якості, а й розробник. Таким чином, Code Coverage дуже корисний, коли мова йде про надання якісного продукту команді QA розробником (розробниками).
Цей посібник пояснив усе про покриття коду та його використання. Ми також трохи глибше зрозуміли різницю між покриттям коду та тестовим покриттям. Окрім цього, ми отримали розуміння методологій, що використовуються разом із різноманітними інструментами охоплення коду.
Тут були докладені переваги та недоліки. Нарешті, ми зруйнували деякі міфи та поширені запитання, пов’язані з висвітленням коду
Щасливого читання !!
Рекомендована література
- Топ 15 інструментів покриття коду (для Java, JavaScript, C ++, C #, PHP)
- 15 найкращих інструментів JAVA для розробки, побудови, профілювання, охоплення коду та огляду
- Підручник з функцій / методів C # із прикладами коду
- Підручник з обробки винятків C # із прикладами коду
- Підручник з черепахи SVN: Редакції у сховищі коду
- Підручник з довжини масиву Java із прикладами коду
- Підручник з AWS CodeBuild: Витяг коду з Maven Build
- Підручник SVN: Управління вихідним кодом за допомогою Subversion