Как правильно обрабатывать создание отчета о покрытии тестами (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 как результат для этого правила (как видите, я впервые пытаюсь реализовать собственное правило);

Любая помощь очень ценится!

Справочный материал

0 ответов

Другие вопросы по тегам