Различия между охватом линий и веток
Я использую плагин 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% с охватом линии.
Надеюсь, что это поможет.