Цель
Я хотел бы обработать весь процесс создания отчета HTML с данными о тестовом покрытии через Bazel.
Компоненты
Для достижения моих цель Я понимаю, что необходимы следующие компоненты:
- lcov .dat файл : предоставляет информацию о том, какие части программы фактически выполняются (т.е. «покрыто») при запуске конкретного тестового примера . Я могу сгенерировать необходимые файлы lcov для своего проекта, запустив
./bazelw query "attr(name, '.*test_main', //...)" | xargs ./bazelw coverage --combined_report=lcov
(все мои тестовые цели названы test_main
, поэтому я могу выполнить команду coverage
во всех из них и объединить результаты с --combined_report=lcov
; - gen html: исполняемый файл, который может анализировать файл lcov и генерировать на его основе отчет об испытании HTML (конечная цель);
- extension.blz: Пользовательское правило базеля, которое принимает файл
.dat
и двоичный файл genrule
в качестве входных данных и выводит окончательный HTML и его зависимости (изображения и другие HTML-файлы);
То, что я смог сделать до сих пор ...
Создать исполняемый скрипт для gen html
Я не конечно, если это лучший подход, однако, на данный момент мне он показался разумным:
#!/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"
]
)
Это живет в моем репозитории root 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
побежал. Могу ли я принудительно установить покрытие bazel отсюда? - ВОПРОС 2: Я не знаю, как получить здесь ссылку на мой исполняемый
genhtml
инструмент. Мой план состоял в том, чтобы сделать что-то вроде genhtml *.dat -o output
; - ВОПРОС 3 : Я не знаю, как указать выходные файлы
genhtml
в качестве выходных данных для этого правила (как Вы можете видеть, что я впервые пытаюсь реализовать собственное правило);
Любая помощь очень ценится!
Справочные материалы