Cobertura de código com o Bazel

O Bazel tem um subcomando coverage para produzir relatórios de cobertura de código em repositórios que podem ser testados com bazel coverage. Devido às peculiaridades dos vários ecossistemas de linguagem, nem sempre é trivial fazer isso funcionar para um determinado projeto.

Esta página documenta o processo geral de criação e visualização de relatórios de cobertura e também apresenta algumas observações específicas de linguagem para idiomas cuja configuração é bem conhecida. É melhor ler primeiro a seção geral e depois os requisitos de um idioma específico.

Embora seja possível fazer muitas personalizações, este documento se concentra na produção e no consumo de lcov relatórios, que atualmente é o caminho mais bem aceito.

Como criar um relatório de cobertura

Preparação

O fluxo de trabalho básico para criar relatórios de cobertura exige o seguinte:

  • Um repositório básico com metas de teste
  • Um conjunto de ferramentas com as ferramentas de cobertura de código específicas do idioma instaladas
  • Uma configuração de "instrumentação" correta

Os dois primeiros são específicos do idioma e bastante simples, mas o último pode ser mais difícil para projetos complexos.

"Instrumentação", neste caso, se refere às ferramentas de cobertura usadas para uma meta específica. O Bazel permite ativar essa opção para um subconjunto específico de arquivos usando o --instrumentation_filter flag, que especifica um filtro para metas testadas com a instrumentação ativada. Para ativar a instrumentação para testes, o --instrument_test_targets flag é obrigatório.

Por padrão, o Bazel tenta corresponder aos pacotes de destino e imprime o filtro relevante como uma mensagem INFO.

Execução da cobertura

Para gerar um relatório de cobertura, use bazel coverage --combined_report=lcov [target]. Isso executa os testes da meta, gerando relatórios de cobertura no formato lcov para cada arquivo.

Quando terminar, o Bazel executa uma ação que coleta todos os arquivos de cobertura produzidos e os mescla em um, que é finalmente criado em $(bazel info output_path)/_coverage/_coverage_report.dat.

Os relatórios de cobertura também são produzidos se os testes falharem, mas isso não se estende aos testes com falha. Somente os testes aprovados são informados.

Visualização da cobertura

O relatório de cobertura é gerado apenas no formato lcov não legível. A partir dele, podemos usar o utilitário genhtml (parte do projeto lcov) para produzir um relatório que pode ser visualizado em um navegador da Web:

genhtml --branch-coverage --output genhtml "$(bazel info output_path)/_coverage/_coverage_report.dat"

O genhtml também lê o código-fonte para anotar a cobertura ausente nesses arquivos. Para que isso funcione, espera-se que genhtml seja executado na raiz do projeto do Bazel.

Para conferir o resultado, abra o arquivo index.html produzido no diretório genhtml em qualquer navegador da Web.

Para mais ajuda e informações sobre a ferramenta genhtml ou o formato de cobertura lcov consulte o projeto lcov.

Configuração específica do idioma

As seções a seguir detalham considerações específicas do idioma para configurar a cobertura de código com o Bazel.

C++

Linux

A cobertura de C++ funciona imediatamente com a configuração padrão.

macOS

O valor padrão de GCOV_PREFIX_STRIP quase certamente está incorreto e precisa ser ajustado manualmente, porque o valor correto depende da sua configuração.

Quando o valor está incorreto, nenhum dado de cobertura é encontrado.

Exemplo para definir GCOV_PREFIX_STRIP=10 bazel coverage //foo:foo_test --test_env=GCOV_PREFIX_STRIP=10`

Java

O Java funciona imediatamente com a configuração padrão. As cadeias de ferramentas do Bazel contêm tudo o que é necessário para a execução remota, incluindo o JUnit.

Python

Consulte os documentos de cobertura rules_python para conferir outras etapas necessárias para ativar o suporte à cobertura no Python.