Різниця між покриттям лінії та відділення


94

Я використовую плагін Cobertura Maven для одного зі своїх проектів. Але у мене питання щодо сформованого звіту:

Яка різниця між покриттям ліній та філіями?

Відповіді:


168

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

Чому вам все одно? Розглянемо приклад:

public int getNameLength(boolean isCoolUser) {
    User user = null;
    if (isCoolUser) {
        user = new John(); 
    }
    return user.getName().length(); 
}

Якщо ви викликаєте цей метод із isCoolUserвстановленим значенням true, ви отримуєте 100% покриття виписки. Звучить добре? NOPE, якщо ви телефонуєте за допомогою, буде нульовий вказівник false. Однак у вас є 50% покриття філій у першому випадку, тому ви можете бачити, що у вашому тестуванні (і часто в коді) чогось не вистачає.


8
Чудова відповідь! Це показує, коли покриття лінії створює хибне відчуття наявності хорошого коду!
— MAGx2,

які можливі помилки ви можете отримати через покриття ліній або покриття філій?
— Емна Аяді

61

Візьмемо цей код як спрощений приклад:

if(cond) {
    line1();
    line2();
    line3();
    line4();
} else {
    line5();
}

Якщо ваш тест використовує лише condістину і ніколи не запускає elseгілку, яку ви маєте:

  • 4 з 5 рядків
  • Покрита 1 з 2 гілок

Також сам звіт Cobertura представляє кілька приємних спливаючих підказок під час натискання заголовка стовпця:

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

Покриття філій - відсоток гілок, виконаних під час цього тестового запуску.


Я сподівався написати цю відповідь, але ти випередив мене (на багато років). Чітка відповідь. Дякую.
— Soundararajan

3
if(cond){
    //branch 1
}else{  
    //branch 2
}

Вам потрібно звернутися до всіх рядків - гілка 1 та гілка 2, щоб отримати 100% покриття як для LineCoverage, так і для BranchCoverage.

Якщо ви взагалі щось пропустите, ви отримаєте половину покриття філій. Якщо ви пропустили що-небудь у # рядках і в тому, і в іншому випадку, ви отримаєте BranchCoverage 100%, але не 100% з покриттям ліній.

Сподіваюся, це допомагає.

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