Diferenças entre cobertura de linha e ramal

93

Eu uso o plugin Cobertura Maven para um de meus projetos. Mas tenho uma pergunta sobre o relatório gerado:

Qual é a diferença entre cobertura de linha e ramal?

Gillespie59
fonte

Respostas:

168

A cobertura de linha mede quantas instruções você tomou (uma instrução geralmente é uma linha de código, não incluindo comentários, condicionais, etc). A cobertura de ramificação verifica se você pegou a ramificação verdadeira e falsa para cada condicional (if, while, for). Você terá duas vezes mais ramificações do que condicionais.

Por quê você se importa? Considere o exemplo:

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

Se você chamar esse método com isCoolUserdefinido como true, terá 100% de cobertura de instrução. Parece bom? NOPE, haverá um ponteiro nulo se você chamar com false. No entanto, você tem 50% de cobertura de branch no primeiro caso, então você pode ver que algo está faltando em seu teste (e freqüentemente, em seu código).

Kane
fonte
8
Ótima resposta! Mostra quando a cobertura de linha dá a falsa sensação de ter um bom código!
MAGx2
quais são os possíveis bugs que você pode obter devido à cobertura de linha ou cobertura de filial?
Emna Ayadi
61

Considere este código como um exemplo simplificado:

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

Se o seu teste apenas exercita o condser verdadeiro e nunca executa o elsebranch que você tem:

  • 4 de 5 linhas cobertas
  • 1 de 2 ramos cobertos

Além disso , o próprio relatório Cobertura apresenta algumas dicas úteis de ajuda pop-up quando o cabeçalho da coluna é clicado:

Cobertura de linha - A porcentagem de linhas executadas por esta execução de teste.

Cobertura de ramificações - A porcentagem de ramificações executadas por esta execução de teste.

Tomasz Nurkiewicz
fonte
Eu esperava escrever esta resposta, mas você me antecipou (por muitos anos). Resposta clara. Obrigado.
Soundararajan
3
if(cond){
    //branch 1
}else{  
    //branch 2
}

Você precisa abordar todas as linhas no ramal 1 e no ramal 2 para obter 100% de cobertura para LineCoverage e BranchCoverage.

Se você perder alguma coisa em outra coisa, receberá metade da cobertura da agência. Se você perdeu alguma coisa em # de linhas em if e else, você obterá BranchCoverage de 100%, mas não 100% com cobertura de linha.

Espero que isto ajude.

Balaji Boggaram Ramanarayan
fonte