Code Інструмент покриття: тестування операторів, розгалужень та рішень

⚡ Розумний підсумок

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

  • 🎯 Визначення: Code покриття кількісно визначає, яку частину вихідного коду ваші тести фактично виконують.
  • 📊 методи: Існує п'ять методів — операторний, метод рішення, метод розгалуження, метод умови та метод покриття кінцевим автоматом.
  • 🧩 Заява проти гілки: Покриття операторів перевіряє рядки, тоді як покриття гілок перевіряє кожен результат рішення.
  • 🇧🇷 Code проти функціонального: Code заходи охоплення, що здійснюються кодом; заходи функціонального охоплення, що охоплюють вимоги.
  • 🛠️ Інструменти: Cobertura, OpenClover, EMMA та Sonar автоматизують вимірювання покриття.
  • 🤖 Допомога AI: Інструменти штучного інтелекту генерують тести та автоматично виявляють непротестовані прогалини в покритті з високим рівнем ризику.

Code Підручник з покриття

Що таке Code Покриття?

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

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

Навіщо використовувати Code Тестування покриття?

Ось кілька головних причин використання покриття коду:

  • Це допомагає вам оцінити ефективність реалізації тестів.
  • Він пропонує кількісне вимірювання тестування.
  • Він визначає ступінь перевірки вихідного коду.

Code Методи покриття

Нижче наведено основні методи покриття коду:

  • Покриття заяви
  • Покриття рішень
  • Покриття філій
  • Toggle Покриття
  • Покриття FSM

Покриття заяви

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

Покриття операторів використовується для отримання сценаріїв на основі структури тестованого коду.

Покриття заяви

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

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

Давайте розглянемо це на прикладі розрахунку покриття виписки. Тут ми розглянемо два різні сценарії, щоб перевірити відсоток покриття виписки для кожного сценарію.

Source Code:

Prints (int a, int b) {                       ------------  Printsum is a function
    int result = a + b;
    If (result > 0)
        Print ("Positive", result)
    Else
        Print ("Negative", result)
    }                                        -----------   End of the source code

Сценарій 1: Якщо A = 3, B = 9

Сценарій покриття виписки 1

Жовтим кольором позначені оператори, які виконуються відповідно до сценарію. Кількість виконаних операторів = 5, загальна кількість операторів = 7, отже, покриття операторів = 5/7 = 71%.

Сценарій 2: Якщо A = -3, B = -9

Сценарій покриття виписки 2

Жовтим кольором позначені оператори, які виконуються відповідно до сценарію. Кількість виконаних операторів = 6, загальна кількість операторів = 7, отже, покриття операторів = 6/7 = 85%.

Але загалом, якщо бачите, всі твердження охоплені обома сценаріями. Тож можна зробити висновок, що загальне покриття твердження становить 100%.

Що охоплює Statement Coverage?

  1. Невикористані заяви
  2. померлі Code
  3. Невикористані гілки
  4. Відсутні твердження

Тестування покриття рішень

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

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

Тестування покриття рішень

Приклад охоплення рішень

Розглянемо такий код:

Demo(int a) {
    If (a > 5)
        a = a * 3
    Print (a)
    }

Сценарій 1: Значення a дорівнює 2. Результат рішення «Ні». Якщо позначено (a>5), то покриття рішень = 50%.

Сценарій 2: Значення a дорівнює 6. Результат рішення «Так». Якщо позначено (a>5), то покриття рішень = 50%.

Тестовий випадок Значення А Вихід Покриття рішень
1 2 2 50%
2 6 18 50%

Тестування охоплення філій

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

Наприклад, якщо результати є двійковими, вам потрібно перевірити як True, так і False результати.

Формула для розрахунку покриття філії:

Формула покриття відділень

Приклад покриття філії

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

Тестовий випадок Значення А Вихід Покриття рішень Покриття філій
1 2 2 50% 33%
2 6 18 50% 67%

Переваги покриття відділення:

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

Тестування покриття умов

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

Наприклад, якщо вираз містить логічні операції, такі як І, АБО або XOR, це вказує на загальну кількість можливих варіантів. Покриття умов не гарантує повного покриття рішень.

Формула для розрахунку покриття умов:

Формула покриття стану

Для виразу з двома операндами існують чотири можливі комбінації: TT, FF, TF та FT. Розглянемо вхідні дані X=3, Y=4 (x b) ХИБНІСТЬ, що дає Покриття Умови 1/4 = 25%.

Покриття кінцевого автомата

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

Який тип Code Покриття на вибір

Це, безумовно, найскладніша відповідь. Щоб вибрати метод покриття, тестеру потрібно перевірити, чи:

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

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

Code Покриття проти функціонального покриття

Code Покриття Функціональне покриття
Показує, наскільки добре вихідний код був протестований на вашому тестовому стенді. Вимірює, наскільки добре функціональність конструкції була охоплена вашим тестовим стендом.
Ніколи не використовує специфікацію дизайну. Використовує специфікацію проекту.
Зроблено розробниками. Зроблено тестувальниками.

Code Інструменти покриття

Ось список важливих інструментів для покриття коду:

Назва інструменту Опис
Cobertura Інструмент для оцінки покриття тестами з відкритим вихідним кодом. Він вимірює покриття тестами, використовуючи базу коду та аналізуючи, які рядки коду виконуються, а які ні під час запуску набору тестів.
Клевер Конюшина (OpenClover) також скорочує час тестування, запускаючи лише ті тести, які охоплюють код програми, змінений з моменту попередньої збірки.
DevPartner DevPartner дозволяє розробникам аналізувати Java код для якості та складності коду.
Емма EMMA підтримує покриття класів, методів, рядків та базових блоків, агрегованих на рівнях вихідного файлу, класу та методу.
Калістик Kalistick — це сторонній застосунок, який аналізує код з різних точок зору.
CoView і CoAnt Інструмент покриття коду для метрик, створення макетів об'єктів, тестування коду, покриття шляхів та гілок тощо.
Яблучко для C++ BullseyeCoverage – це інструмент для покриття коду C++ і C.
Сонар Sonar — це інструмент для охоплення відкритого коду, який допомагає керувати якістю коду.

Переваги та недоліки використання Code Покриття

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

Поширені запитання

Багато команд прагнуть досягти 70-80% як практичної мети. Досягнення 100% рідко буває економічно ефективним. Зосередьтеся на охопленні критичної, високоризикової логіки, а не на прагненні до одного числа по всій кодовій базі.

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

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

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

Штучний інтелект аналізує вихідний код та існуючі тести, щоб визначити неперевірені шляхи з високим ризиком, а потім пропонує або генерує нові випадки. Машинне навчання також визначає пріоритети тестів для запуску, скорочуючи час зворотного зв'язку та зберігаючи...ping покриття високе.

Так. Інструменти штучного інтелекту, такі як Diffblue Cover, сканують код та автономно пишуть модульні тести для виявленої логіки. Вони орієнтовані на ризиковані гілки та умови, збільшуючи покриття зі значно меншими ручними зусиллями.

OpenClover вимірює покриття операторів, гілок та методів і збирає понад 20 метрик. Cobertura, ЕММА та JaCoCo є інші широко використовувані безкоштовні варіанти для Java проектів.

Модифіковане покриття умов/рішень вимагає, щоб кожна умова в рішенні незалежно впливала на результат. Воно є суворішим, ніж покриття галузей, і є обов'язковим для критично важливого програмного забезпечення, такого як авіоніка, згідно зі стандартом DO-178C.

Підсумуйте цей пост за допомогою: