Bazel có một lệnh con coverage
để tạo báo cáo
về mức độ phù hợp của mã trên các kho lưu trữ mà bạn có thể thử nghiệm với bazel coverage
. Do sự độc đáo của các hệ sinh thái ngôn ngữ khác nhau, không phải lúc nào
bạn cũng có thể thực hiện tác phẩm này cho một dự án cụ thể.
Trang này ghi lại quy trình chung về việc tạo và xem các báo cáo về mức độ phù hợp, đồng thời cũng có một số ghi chú riêng về ngôn ngữ cho các ngôn ngữ nổi tiếng có cấu hình. Tốt nhất là bạn nên đọc phần phần chung rồi đọc phần về các yêu cầu cho một ngôn ngữ cụ thể. Ngoài ra, hãy lưu ý đến phần thực thi từ xa. Bạn nên cân nhắc thêm một số điều này.
Mặc dù có thể tùy chỉnh nhiều nội dung, tài liệu này tập trung vào việc sản xuất và sử dụng các báo cáo lcov
(đây là tuyến đường được hỗ trợ nhiều nhất).
Tạo báo cáo mức độ phù hợp
Chuẩn bị
Quy trình cơ bản để tạo báo cáo mức độ phù hợp cần có những yêu cầu sau:
- Kho lưu trữ cơ bản có các mục tiêu thử nghiệm
- Chuỗi công cụ có cài đặt các công cụ lập trình cụ thể cho từng ngôn ngữ
- Cấu hình "tính toán" chính xác
Hai dự án trước đây mang tính cụ thể về ngôn ngữ và chủ yếu là đơn giản, tuy nhiên, hai dự án này có thể sẽ khó khăn hơn đối với các dự án phức tạp.
"Thiết bị" trong trường hợp này là các công cụ lập chỉ mục được sử dụng cho một mục tiêu cụ thể. Bazel cho phép bật tính năng này cho một tập hợp con các tệp cụ thể bằng cách sử dụng cờ
--instrumentation_filter
.
Tệp này sẽ chỉ định bộ lọc cho các mục tiêu được thử nghiệm bằng
cách đo lường đã bật. Để bật tính năng đo lường cho các thử nghiệm, bạn bắt buộc phải gắn cờ
--instrument_test_targets
.
Theo mặc định, bazel cố gắng so khớp(các) gói mục tiêu và in
bộ lọc có liên quan dưới dạng thông báo INFO
.
Mức độ phù hợp khi chạy
Để tạo báo cáo về mức độ phù hợp, hãy sử dụng bazel coverage
--combined_report=lcov
[target]
. Quá trình này chạy
thử nghiệm cho mục tiêu, tạo báo cáo mức độ phù hợp ở định dạng lcov cho từng tệp.
Sau khi hoàn tất, bazel chạy một thao tác thu thập tất cả các tệp
mức độ phù hợp đã tạo và hợp nhất các tệp đó thành một. Cuối cùng, tệp này sẽ được
tạo trong $(bazel info
output_path)/_coverage/_coverage_report.dat
.
Báo cáo mức độ phù hợp cũng được tạo ra nếu thử nghiệm không thành công, mặc dù lưu ý rằng điều này không mở rộng sang các thử nghiệm không thành công mà chỉ báo cáo các bài kiểm tra đạt.
Xem thông tin cập nhật
Báo cáo mức độ phù hợp chỉ xuất ra ở định dạng lcov
không đọc được. Từ đó, chúng tôi có thể sử dụng tiện ích genhtml
(một phần của dự án lcov) để tạo báo cáo có thể xem được trong trình duyệt web:
genhtml --output genhtml "$(bazel info output_path)/_coverage/_coverage_report.dat"
Xin lưu ý rằng genhtml
cũng đọc mã nguồn để chú thích về mức độ phù hợp bị thiếu
trong các tệp này. Để tính năng này hoạt động, dự kiến rằng
genhtml
sẽ được thực thi trong thư mục gốc của dự án bazel.
Để xem kết quả, bạn chỉ cần mở tệp index.html
được tạo trong thư mục
genhtml
trên bất kỳ trình duyệt web nào.
Để được trợ giúp thêm và cung cấp thông tin về công cụ genhtml
hoặc định dạng phạm vi của lcov
, hãy xem dự án lcov.
Thực thi từ xa
Hiện tại, quy trình chạy thử nghiệm từ xa có một số lưu ý:
- Hành động kết hợp báo cáo chưa thể chạy từ xa. Điều này là do Bazel không coi các tệp đầu ra mức độ phù hợp là một phần của
biểu đồ (xem vấn đề này) và do đó có thể không coi chính xác các tệp đó là dữ liệu đầu vào của tổ hợp hành động. Để
giải quyết vấn đề này, hãy sử dụng
--strategy=CoverageReport=local
.- Lưu ý: Bạn có thể cần phải chỉ định nội dung nào đó như
--strategy=CoverageReport=local,remote
, nếu Bazel được thiết lập để thửlocal,remote
, do cách Bazel giải quyết các chiến lược.
- Lưu ý: Bạn có thể cần phải chỉ định nội dung nào đó như
- Bạn cũng không thể sử dụng
--remote_download_minimal
và các cờ tương tự do có các trường hợp cũ. - Bazel hiện sẽ không tạo được thông tin về mức độ phù hợp nếu trước đó
các thử nghiệm đã được lưu vào bộ nhớ đệm. Để giải quyết vấn đề này, bạn có thể đặt
--nocache_test_results
cụ thể cho thời gian kiểm tra, mặc dù việc này tất nhiên sẽ tốn nhiều chi phí về thời gian thử nghiệm. --experimental_split_coverage_postprocessing
và--experimental_fetch_all_coverage_outputs
- Thông thường, mức độ phù hợp được chạy như một phần của hành động kiểm tra và do đó, theo mặc định, chúng tôi không lấy lại tất cả mức độ phù hợp dưới dạng kết quả của thực thi từ xa. Các cờ này sẽ ghi đè nội dung mặc định và lấy dữ liệu về mức độ phù hợp. Hãy xem vấn đề này để biết thêm thông tin chi tiết.
Cấu hình theo ngôn ngữ cụ thể
Java
Java sẽ hoạt động ngay tức thì với cấu hình mặc định. Các công cụ bot chứa tất cả mọi dữ liệu cần thiết để thực thi từ xa, kể cả JUnit.
Python
Điều kiện tiên quyết
Mức độ phù hợp khi chạy bằng python có một số điều kiện tiên quyết:
- Tệp nhị phân bazel bao gồm b01c859, phải là mã Bazel bất kỳ >3.0.
- Phiên bản được phủ sóng.py.
Sử dụng phạm vi phủ sóng đã sửa đổi.py
Một cách để thực hiện việc này là quarules_python , thao tác này cung cấp
khả năng sử dụngrequirements.txt
thì các yêu cầu được liệt kê
trong tệp này sẽ được tạo dưới dạng mục tiêu bazel bằng cách sử dụng
pip_install quy tắc lưu trữ.
requirements.txt
phải có mục nhập sau:
git+https://github.com/ulfjack/coveragepy.git@lcov-support
Sau đó, bạn nên sử dụng tệp rules_python
, pip_install
và tệp requirements.txt
trong tệp WORKSPACE vì:
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",
)
Sau đó, bạn có thể sử dụng yêu cầu coverage.py theo các mục tiêu thử nghiệm bằng cách
đặt các mục sau trong các tệp 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",
],
)