Bazel을 사용한 코드 범위

Bazel은 coverage 하위 명령어를 사용하여 bazel coverage로 테스트할 수 있는 저장소에 코드 범위 보고서를 생성합니다. 다양한 언어 생태계의 특이성으로 인해 특정 프로젝트에서 이 작업을 항상 쉽게 할 수 있는 것은 아닙니다.

이 페이지에서는 적용 범위 보고서를 만들고 확인하는 일반적인 절차를 설명하고 잘 알려진 언어 언어의 몇 가지 언어별 참고사항도 제공합니다. 이 가이드는 일반 섹션을 먼저 읽어보고 특정 언어의 요구사항을 읽어보는 것이 좋습니다. 또한 원격 실행 섹션에는 몇 가지 추가 고려사항이 있습니다.

많은 맞춤설정이 가능하지만 이 문서에서는 현재 가장 잘 지원되는 경로인 lcov 보고서를 생성하고 사용하는 방법에 중점을 둡니다.

노출 범위 보고서 만들기

준비

범위 보고서를 만들기 위한 기본 워크플로에는 다음이 필요합니다.

  • 테스트 대상이 있는 기본 저장소
  • 언어별 코드 적용 범위 도구가 설치된 도구 모음
  • 올바른 '계측' 구성

전자의 경우 언어별로 다르며 대부분 후자의 경우 복잡한 프로젝트에 더 어려울 수 있습니다.

이 경우 '계측'은 특정 타겟에 사용되는 커버리지 도구를 나타냅니다. Bazel을 사용하면 계측으로 테스트되는 타겟에 대한 필터를 지정하는 --instrumentation_filter 플래그를 사용하여 파일의 특정 하위 집합에 대해 이 기능을 사용 설정할 수 있습니다. 사용 설정되었습니다. 테스트 계측을 사용 설정하려면 --instrument_test_targets 플래그가 필요합니다.

기본적으로 bazel은 대상 패키지를 일치시키려고 시도하고 관련 필터를 INFO 메시지로 출력합니다.

노출 범위 실행

노출 범위 보고서를 생성하려면 bazel coverage --combined_report=lcov [target]를 사용합니다. 그러면 타겟 테스트가 실행되어 각 파일의 lcov 형식으로 커버리지 보고서가 생성됩니다.

완료되면 bazel이 생성된 모든 커버리지 파일을 수집하는 작업을 실행하고 하나로 병합한 다음 $(bazel info output_path)/_coverage/_coverage_report.dat 아래에 만듭니다.

적용 범위 테스트는 테스트가 실패하더라도 생성됩니다. 단, 이 테스트는 실패한 테스트로 확장되지 않으며 통과 테스트만 보고됩니다.

노출 범위 보기

범위 보고서는 사람이 읽을 수 없는 lcov 형식으로만 출력됩니다. 여기에서 genhtml 유틸리티 (lcov 프로젝트의 일부)를 사용해서 웹브라우저에서 볼 수 있는 보고서를 생성할 수 있습니다.

genhtml --output genhtml "$(bazel info output_path)/_coverage/_coverage_report.dat"

genhtml은 소스 코드도 읽어 이 파일에서 누락된 커버리지를 주석 처리합니다. 이를 위해 genhtml가 bazel 프로젝트의 루트에서 실행될 것으로 예상됩니다.

결과를 확인하려면 모든 웹브라우저에서 genhtml 디렉터리에 생성된 index.html 파일을 열기만 하면 됩니다.

genhtml 도구 또는 lcov 노출 범위 형식에 관한 추가 도움말 및 정보는 lcov 프로젝트를 참고하세요.

원격 실행

현재 원격 테스트 실행에서는 몇 가지 주의사항이 있습니다.

  • 보고서 조합 작업은 아직 원격으로 실행할 수 없습니다. Bazel이 커버리지 출력 파일을 그래프의 일부로 고려하지 않고 (이 문제 참조) 조합의 입력으로 올바르게 처리할 수 없기 때문입니다. 있습니다. 이 문제를 해결하려면 --strategy=CoverageReport=local를 사용하세요.
    • Bazel이 local,remote을 시도하도록 설정된 경우 Bazel이 전략을 해결하는 방법에 따라 --strategy=CoverageReport=local,remote와 같은 이름을 지정해야 할 수도 있습니다.
  • --remote_download_minimal와 비슷한 플래그는 전자의 결과로 사용될 수도 없습니다.
  • Bazel은 현재 테스트가 이전에 캐시된 경우 범위 정보를 만들지 못합니다. 이 문제를 해결하기 위해 --nocache_test_results를 특별히 커버리지 실행용으로 설정할 수 있지만, 이 경우 테스트 시간 측면에서 많은 비용이 발생합니다.
  • --experimental_split_coverage_postprocessing--experimental_fetch_all_coverage_outputs
    • 일반적으로 적용 범위는 테스트 작업의 일부로 실행되므로 기본적으로 모든 적용 범위를 원격 실행의 출력으로 다시 가져오지 않습니다. 이러한 플래그는 기본값을 재정의하고 범위 데이터를 가져옵니다. 자세한 내용은 이 문제를 참조하세요.

언어별 구성

자바

자바는 기본 구성으로 즉시 작동해야 합니다. bazel 도구 모음에는 JUnit을 포함한 원격 실행에 필요한 모든 것이 포함됩니다.

Python

기본 요건

Python으로 커버리지를 실행하려면 몇 가지 기본 요건이 있습니다.

수정된 coverage.py 사용

방법은 다음과 같습니다.Rules_Python 를 사용하면requirements.txt 이후 이 파일에 나열된 요구사항은pip_install 저장소 규칙

requirements.txt에는 다음 항목이 있어야 합니다.

git+https://github.com/ulfjack/coveragepy.git@lcov-support

그런 다음 rules_python, pip_install, requirements.txt 파일을 WORKSPACE 파일에서 다음과 같이 사용해야 합니다.

load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")

http_archive(
    name = "rules_python",
    url = "https://github.com/bazelbuild/rules_python/releases/download/0.5.0/rules_python-0.5.0.tar.gz",
    sha256 = "cd6730ed53a002c56ce4e2f396ba3b3be262fd7cb68339f0377a45e8227fe332",
)

load("@rules_python//python:pip.bzl", "pip_install")

pip_install(
   name = "python_deps",
   requirements = "//:requirements.txt",
)

그러면 BUILD 파일에서 다음을 설정하여 coverage.py 요구사항을 테스트 대상에 사용할 수 있습니다.

load("@python_deps//:requirements.bzl", "entry_point")

alias(
    name = "python_coverage_tools",
    actual = entry_point("coverage"),
)

py_test(
    name = "test",
    srcs = ["test.py"],
    env = {
        "PYTHON_COVERAGE": "$(location :python_coverage_tools)",
    },
    deps = [
        ":main",
        ":python_coverage_tools",
    ],
)