Как правильно обрабатывать создание отчета о покрытии тестами (HTML) с помощью Bazel?
Цель
Я хотел бы обработать весь процесс создания HTML-отчета с данными о тестовом покрытии через Bazel.
Составные части
Я понимаю, что для достижения своей цели необходимы следующие компоненты:
- Файл lcov .dat: предоставляет информацию о том, какие части программы фактически выполняются (т. е. "покрываются") при выполнении конкретного тестового примера. Я могу сгенерировать необходимые файлы lcov для своего проекта, запустив
./bazelw query "attr(name, '.*test_main', //...)" | xargs ./bazelw coverage --combined_report=lcov
(все мои тестовые объекты названыtest_main
, вот как я могу выполнитьcoverage
во всех них и объедините результаты с--combined_report=lcov
; - genhtml: исполняемый файл, который может анализировать файл lcov и генерировать из него отчет о тестировании HTML (конечная цель);
- охват.blz : настраиваемое правило базеля, которое принимает
.dat
файл иgenrule
двоичный файл в качестве входных данных и выводит окончательный HTML-код и его значения (изображения и другие HTML-файлы);
Что мне удалось сделать до сих пор...
Создайте исполняемый скрипт для genhtml
Я не уверен, что это лучший подход, однако на данный момент мне он показался разумным:
#!/bin/zsh
TOOLS_ROOT="${HOME}/.devxp/tools"
LCOV_BIN_HOME="${TOOLS_ROOT}/lcov/bin"
LCOV_GIT_REPO="https://github.com/linux-test-project/lcov.git"
GENHTML="${LCOV_BIN_HOME}/genhtml"
function main () {
if [[ ! -f "${GENHTML}" ]]; then
_install &> /dev/null
fi
"${GENHTML}" "${@}"
}
function _install () {
mkdir -p "${LCOV_HOME}"
pushd "${TOOLS_ROOT}" || true
git clone "${LCOV_GIT_REPO}"
cd "${LCOV_HOME}" || true
make install
popd &> /dev/null || true
}
main "${@}"
Создайте группу файлов для доступа к.dat в репозитории.
Следуя предложениям из - Использование Bazel для создания отчета о покрытии;
filegroup(
name = "coverage_files",
srcs = glob(["bazel-out/**/coverage.dat"]),
visibility = [
"//visibility:public"
]
)
Это живет в корне моего репозитория BUILD
файл
Начать мое собственное правило
В файле coverage_report.bzl
def _coverage_report_impl(ctx):
dat_lcov_file = ctx.attr.coverage_files
coverage_report = rule(
implementation = _coverage_report_impl,
attrs = {
"coverage_files": attr.label(),
},
)
В контексте реализации пользовательского правила у меня есть следующие вопросы:
- ВОПРОС 1: Я не знаю, был ли уже создан файл.dat, так как он требует
bazel coverage
чтобы сбежать. Могу ли я отсюда принудительно установить покрытие базелем? - ВОПРОС 2: я не знаю, как получить ссылку на свой исполняемый файл
genhtml
инструмент внутри здесь. Мой план состоял в том, чтобы сделать что-то вродеgenhtml *.dat -o output
; - ВОПРОС 3: Я не знаю, как указать выходные файлы
genhtml
как результат для этого правила (как видите, я впервые пытаюсь реализовать собственное правило);
Любая помощь очень ценится!
Справочный материал