Bazel incluye un subcomando coverage para generar informes de cobertura de código
en repositorios que se pueden probar con bazel coverage. Debido a las peculiaridades de los diversos ecosistemas de lenguajes, no siempre es trivial hacer que esto funcione para un proyecto determinado.
En esta página, se documenta el proceso general para crear y ver informes de cobertura, y también se incluyen algunas notas específicas del lenguaje para los lenguajes cuya configuración es conocida. Se recomienda leer primero la sección general y, luego, los requisitos para un lenguaje específico.
Si bien es posible realizar muchas personalizaciones, este documento se centra en
la producción y el consumo de lcov informes, que actualmente es la
ruta mejor compatible.
Cómo crear un informe de cobertura
Preparación
El flujo de trabajo básico para crear informes de cobertura requiere lo siguiente:
- Un repositorio básico con objetivos de prueba
- Una cadena de herramientas con las herramientas de cobertura de código específicas del lenguaje instaladas
- Una configuración de "instrumentación" correcta
Los dos primeros son específicos del lenguaje y, en su mayoría, directos. Sin embargo, el último puede ser más difícil para proyectos complejos.
En este caso, "instrumentación" se refiere a las herramientas de cobertura que se usan para un objetivo específico. Bazel permite activar esta opción para un
subconjunto específico de archivos con la
--instrumentation_filter
marca, que especifica un filtro para los objetivos que se prueban con la
instrumentación habilitada. Para habilitar la instrumentación para las pruebas, se requiere la
--instrument_test_targets
marca.
De forma predeterminada, bazel intenta hacer coincidir los paquetes de destino y muestra el filtro pertinente como un mensaje INFO.
Cómo ejecutar la cobertura
Para generar un informe de cobertura, usa bazel coverage
--combined_report=lcov
[target]. Esto ejecuta las pruebas para el objetivo y genera informes de cobertura en formato lcov para cada archivo.
Una vez finalizado, bazel ejecuta una acción que recopila todos los archivos de cobertura producidos
y los combina en uno, que luego se crea finalmente
en $(bazel info
output_path)/_coverage/_coverage_report.dat.
También se generan informes de cobertura si fallan las pruebas, aunque ten en cuenta que esto no se extiende a las pruebas fallidas, solo se informan las pruebas aprobadas.
Cómo ver la cobertura
El informe de cobertura solo se genera en el formato lcov no legible. A partir de esto, podemos usar la utilidad genhtml (parte del proyecto lcov) para generar un informe que se pueda ver en un navegador web:
genhtml --branch-coverage --output genhtml "$(bazel info output_path)/_coverage/_coverage_report.dat"
Ten en cuenta que genhtml también lee el código fuente para anotar la cobertura faltante en estos archivos. Para que esto funcione, se espera que genhtml se ejecute en la raíz del proyecto bazel.
Para ver el resultado, abre el archivo index.html generado en el directorio genhtml en cualquier navegador web.
Para obtener más ayuda e información sobre la herramienta genhtml, o el
lcov formato de cobertura, consulta el proyecto lcov.
Configuración específica del lenguaje
En las siguientes secciones, se detallan las consideraciones específicas del lenguaje para configurar la cobertura de código con Bazel.
C++
Linux
La cobertura de C++ debería funcionar de inmediato con la configuración predeterminada.
macOS
El valor predeterminado de GCOV_PREFIX_STRIP es casi seguro incorrecto y debe ajustarse de forma manual porque el valor correcto depende de tu configuración.
Cuando el valor es incorrecto, no se encontrarán datos de cobertura.
Ejemplo para establecer GCOV_PREFIX_STRIP=10
bazel coverage //foo:foo_test --test_env=GCOV_PREFIX_STRIP=10`
Java
Java debería funcionar de inmediato con la configuración predeterminada. Las cadenas de herramientas de bazel también contienen todo lo necesario para la ejecución remota, incluido JUnit.
Python
Consulta los documentos de cobertura de rules_pythonpara conocer los pasos adicionales necesarios para habilitar la compatibilidad con la cobertura en Python.