Mức độ sử dụng mã với Bazel

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.
  • 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--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:

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",
    ],
)