Я использую плагин Cobertura Maven для одного из моих проектов. Но у меня есть вопрос о сгенерированном отчете:
В чем разница между охватом строк и веток?
Я использую плагин Cobertura Maven для одного из моих проектов. Но у меня есть вопрос о сгенерированном отчете:
В чем разница между охватом строк и веток?
Покрытие линии измеряет количество заявлений, которые вы принимали (утверждение обычно представляет собой строку кода, не включая комментарии, условные обозначения и т.д.). Проверки веток проверяются, если вы приняли истинную и ложную ветвь для каждого условного (если, 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% -ный охват веток, поэтому вы можете увидеть, что в тестировании чего-то не хватает (и часто в вашем коде).
Возьмите этот код в качестве упрощенного примера:
if(cond) {
line1();
line2();
line3();
line4();
} else {
line5();
}
Если ваш тест использует только cond
, который является истинным и никогда не запускает ветвь else
, у вас есть:
Также Cobertura report сам вводит подсказки всплывающих подсказок при щелчке заголовка столбца:
Охват линии. Процент строк, выполненных в этом тестовом прогоне.
Отражательный охват. Процент ветвей, выполняемых этим тестовым прогоном.
if(cond){
//branch 1
}else{
//branch 2
}
Вам нужно адресовать все строки: ветвь 1 и ветвь 2, чтобы получить 100% покрытие как для LineCoverage, так и для BranchCoverage.
Если вы вообще ничего не пропустите, вы получите половину охвата ветки. Если вы пропустили что-либо в # строке в обоих случаях, вы получите значение BranchCoverage 100%, но не 100% с охватом линии.
Надеюсь, что это поможет.