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


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.