Различия между охватом линий и веток

Я использую плагин Cobertura Maven для одного из моих проектов. Но у меня есть вопрос о сгенерированном отчете:

В чем разница между охватом строк и веток?

Ответ 1

Покрытие линии измеряет количество заявлений, которые вы принимали (утверждение обычно представляет собой строку кода, не включая комментарии, условные обозначения и т.д.). Проверки веток проверяются, если вы приняли истинную и ложную ветвь для каждого условного (если, while, for). У вас будет в два раза больше ветвей, чем условные.

Почему вас это волнует? Рассмотрим пример:

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

Если вы вызываете этот метод с isCoolUser, установленным в true, вы получаете 100% -ный охват операторов. Звучит хорошо? NOPE, там будет нулевой указатель, если вы вызываете с помощью false. Однако в первом случае у вас есть 50% -ный охват веток, поэтому вы можете увидеть, что в тестировании чего-то не хватает (и часто в вашем коде).

Ответ 2

Возьмите этот код в качестве упрощенного примера:

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

Если ваш тест использует только cond, который является истинным и никогда не запускает ветвь else, у вас есть:

  • 4 из 5 рассмотренных строк
  • 1 из 2 закрытых веток

Также Cobertura report сам вводит подсказки всплывающих подсказок при щелчке заголовка столбца:

Охват линии. Процент строк, выполненных в этом тестовом прогоне.

Отражательный охват. Процент ветвей, выполняемых этим тестовым прогоном.

Ответ 3

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

Вам нужно адресовать все строки: ветвь 1 и ветвь 2, чтобы получить 100% покрытие как для LineCoverage, так и для BranchCoverage.

Если вы вообще ничего не пропустите, вы получите половину охвата ветки. Если вы пропустили что-либо в # строке в обоих случаях, вы получите значение BranchCoverage 100%, но не 100% с охватом линии.

Надеюсь, что это поможет.