Skip to content
Latchkey

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.

Lines run vs branches missed
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.

Guias relacionados