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
유틸리티 (인코브 유틸리티의 일부)를
프로젝트)를 사용하여 웹에서 볼 수 있는 보고서를 생성합니다.
브라우저:
genhtml --output genhtml "$(bazel info output_path)/_coverage/_coverage_report.dat"
genhtml
는 소스 코드도 읽어서 누락된 주석을 추가합니다.
포함할 수 있습니다. 이 작업을 수행하려면
genhtml
는 bazel 프로젝트의 루트에서 실행됩니다.
결과를 보려면 다음과 같이 생성된 index.html
파일을 열기만 하면 됩니다.
genhtml
디렉터리에 액세스할 수 있습니다.
genhtml
도구 또는
lcov
적용 형식(LVC 프로젝트 참고)
원격 실행
원격 테스트 실행으로 실행하는 경우 현재 몇 가지 주의사항이 있습니다.
- 보고서 조합 작업은 아직 원격으로 실행할 수 없습니다. 이것은
Bazel이 커버리지 출력 파일을
그래프 (이 문제 참조)가 포함되어 있으므로
조합 작업에 대한 입력으로 올바르게 처리되지 않을 수 있습니다. 받는사람
이 문제를 해결하려면
--strategy=CoverageReport=local
를 사용하세요.- 참고:
대신
--strategy=CoverageReport=local,remote
(Bazel이 설정된 경우)local,remote
을 사용해 봅니다.
- 참고:
대신
--remote_download_minimal
및 유사 플래그도 사용할 수 없습니다. 발생할 수 있습니다- 테스트 시 Bazel이 적용 범위 정보를 생성하지 못함
확인할 수 있습니다 이 문제를 해결하려면
--nocache_test_results
는 적용 범위 실행에 맞게 특별히 설정할 수 있습니다. 물론 테스트 시간 측면에서 많은 비용이 발생합니다. --experimental_split_coverage_postprocessing
및--experimental_fetch_all_coverage_outputs
<ph type="x-smartling-placeholder">- </ph>
- 일반적으로 적용 범위는 테스트 작업의 일부로 실행되며 기본적으로 모든 적용 범위를 리모컨의 출력으로 다시 가져오지는 않습니다. 실행할 수 있습니다 이 플래그는 기본값을 재정의하고 커버리지 데이터 자세한 내용은 이 문제를 참고하세요. 확인하세요.
언어별 구성
자바
자바는 기본 구성으로 즉시 작동합니다. 이 bazel 도구 모음에는 원격 실행을 지원합니다
Python
기본 요건
Python으로 커버리지를 실행하려면 몇 가지 기본 요건이 있습니다.
- b01c859가 포함된 bazel 바이너리 Bazel 3.0보다 크거나 같아야 합니다.
- covering.py의 수정된 버전 <ph type="x-smartling-placeholder"></ph>
수정된 scope.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",
)
그런 다음cover.py 요구사항은 다음과 같이 테스트 타겟에서 사용할 수 있습니다.
BUILD
파일에서 다음을 설정합니다.
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",
],
)
적용 범위를 추가하는 대신 기본 제공 Python 도구 모음을 사용하는 경우
모든 py_test
타겟에 종속 항목을 추가하는 대신 적용 범위 도구를 추가할 수 있습니다.
도구 모음 구성입니다
pip_install 규칙은 Python에 종속되므로
도구 모음에서 실행하므로 coverage
모듈을 가져오는 데 사용할 수 없습니다.
대신 WORKSPACE
를 추가하세요.예를 들면 다음과 같습니다.
http_archive(
name = "coverage_linux_x86_64"",
build_file_content = """
py_library(
name = "coverage",
srcs = ["coverage/__main__.py"],
data = glob(["coverage/*", "coverage/**/*.py"]),
visibility = ["//visibility:public"],
)
""",
sha256 = "84631e81dd053e8a0d4967cedab6db94345f1c36107c71698f746cb2636c63e3",
type = "zip",
urls = [
"https://files.pythonhosted.org/packages/74/0d/0f3c522312fd27c32e1abe2fb5c323b583a5c108daf2c26d6e8dfdd5a105/coverage-6.4.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
],
)
그런 다음 Python 도구 모음을 다음과 같이 구성합니다.
py_runtime(
name = "py3_runtime_linux_x86_64",
coverage_tool = "@coverage_linux_x86_64//:coverage",
files = ["@python3_9_x86_64-unknown-linux-gnu//:files"],
interpreter = "@python3_9_x86_64-unknown-linux-gnu//:bin/python3",
python_version = "PY3",
)
py_runtime_pair(
name = "python_runtimes_linux_x86_64",
py2_runtime = None,
py3_runtime = ":py3_runtime_linux_x86_64",
)
toolchain(
name = "python_toolchain_linux_x86_64",
exec_compatible_with = [
"@platforms//os:linux",
"@platforms//cpu:x86_64",
],
toolchain = ":python_runtimes_linux_x86_64",
toolchain_type = "@bazel_tools//tools/python:toolchain_type",
)