| # Setting up coverage |
| |
| As of Bazel 6, the Python toolchains and bootstrap logic supports providing |
| coverage information using the `coverage` library. |
| |
| As of `rules_python` version `0.18.1`, builtin coverage support can be enabled |
| when configuring toolchains. |
| |
| ## Enabling `rules_python` coverage support |
| |
| Enabling the coverage support bundled with `rules_python` just requires setting an |
| argument when registerting toolchains. |
| |
| For Bzlmod: |
| |
| ```starlark |
| python.toolchain( |
| "@python3_9_toolchains//:all", |
| configure_coverage_tool = True, |
| ) |
| ``` |
| |
| For WORKSPACE configuration: |
| |
| ```starlark |
| python_register_toolchains( |
| register_coverage_tool = True, |
| ) |
| ``` |
| |
| :::{note} |
| This will implicitly add the version of `coverage` bundled with |
| `rules_python` to the dependencies of `py_test` rules when `bazel coverage` is |
| run. If a target already transitively depends on a different version of |
| `coverage`, then behavior is undefined -- it is undefined which version comes |
| first in the import path. If you find yourself in this situation, then you'll |
| need to manually configure coverage (see below). |
| ::: |
| |
| ## Manually configuring coverage |
| |
| To manually configure coverage support, you'll need to set the |
| `py_runtime.coverage_tool` attribute. This attribute is a target that specifies |
| the coverage entry point file and, optionally, client libraries that are added |
| to `py_test` targets. Typically, this would be a `filegroup` that looked like: |
| |
| ```starlark |
| filegroup( |
| name = "coverage", |
| srcs = ["coverage_main.py"], |
| data = ["coverage_lib1.py", ...] |
| ) |
| ``` |
| |
| Using `filegroup` isn't required, nor are including client libraries. The |
| important behaviors of the target are: |
| |
| * It provides a single output file OR it provides an executable output; this |
| output is treated as the coverage entry point. |
| * If it provides runfiles, then `runfiles.files` are included into `py_test`. |