O Que É Cobertura de Código?
Cobertura de código é a família de métricas que relata quanto do seu código-fonte foi executado durante uma execução de testes.
Cobertura de código e cobertura de testes são frequentemente usadas como sinônimos, mas "cobertura de código" geralmente se refere aos tipos específicos de medição, linha, branch, função e instrução, e como uma ferramenta os calcula. Entender os tipos ajuda você a ler um relatório de cobertura sem ser enganado por um único número em destaque.
Os tipos de cobertura comuns
- Cobertura de linha ou instrução: quais linhas foram executadas.
- Cobertura de branch: quais caminhos verdadeiro/falso de cada decisão foram executados.
- Cobertura de função: quais funções foram chamadas.
- Cobertura de condição: quais subexpressões booleanas foram avaliadas de cada forma.
Como funciona a instrumentação
Uma ferramenta de cobertura insere contadores no seu código, seja reescrevendo o código-fonte, transformando o bytecode ou usando um hook em tempo de execução. À medida que os testes rodam, esses contadores são incrementados. Depois, a ferramenta compara o que foi executado com o total para produzir porcentagens e um mapa linha a linha.
O que os números significam e não significam
Um número alto de cobertura de linha pode esconder branches não testados, então a cobertura de branch costuma ser o sinal mais honesto. Nenhum dos números prova que suas verificações estão corretas; eles apenas provam que o código foi executado. Leia a cobertura como um mapa de pontos cegos, não como uma nota.
Um exemplo rápido
Uma função com um if/else pode atingir 100 por cento de cobertura de linha enquanto apenas um branch é exercitado, e é por isso que a cobertura de branch muitas vezes conta uma história mais verdadeira.
function classify(n) {
if (n > 0) return "positive"; // tested
return "non-positive"; // line never run
}Cobertura de código no CI
Os pipelines normalmente geram a cobertura em um formato padrão como LCOV ou Cobertura, e depois a enviam para um dashboard que acompanha a tendência e comenta nos pull requests. A instrumentação extra desacelera um pouco os testes, então rodar em runners rápidos evita que a etapa de cobertura domine o build.
Principais conclusões
- A cobertura de código abrange métricas de linha, branch, função e condição.
- As ferramentas instrumentam o código para registrar o que foi executado durante os testes.
- A cobertura de branch costuma ser um sinal mais honesto do que a cobertura de linha.