Как правильно обрабатывать создание отчета о покрытии тестами (HTML) с помощью Bazel? - PullRequest
1 голос
/ 03 августа 2020

Цель

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

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

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

...