Различия между покрытием линии и отделения


94

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

В чем разница между покрытием линии и филиала?

Ответы:


170

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

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

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.

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

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.