Bazel ile kod kapsamı

. Sorun bildirin Kaynağı göster Gece · 7,3 · 7,2 · 7,1 · 7,0 · 6,5

Bazel, kod kapsamı oluşturmak için bir coverage alt komutu içerir bazel coverage ile test edilebilen kod depolarıyla ilgili raporlar içerir. Teslim tarihi birbirinden farklı dil ekosistemlerine göre değişse de, bu işi yapmak her zaman sıradan bir iş değil.

Bu sayfada, oluşturma ve görüntülemeyle ilgili genel süreç ve ayrıca haberler ve öneriler için dile özgü bazı notlar iyi bilinen yapılandırmalar olabilir. Baştan okuması daha iyi genel bölümü okumanızı ve ardından belirli bir dile ilişkin şartları okuyun. Ayrıca uzaktan yürütme bölümü, göz atabilirsiniz.

Birçok özelleştirme mümkün olsa da bu belgede lcov raporlarının oluşturulması ve kullanılması, en iyi desteklenen rotadır.

Kapsam raporu oluşturma

Hazırlık

Kapsam raporları oluşturmaya ilişkin temel iş akışı, takip etmek için:

  • Test hedefleri içeren temel bir depo
  • Dile özgü kod kapsamı araçlarının yüklü olduğu bir araç zinciri
  • Doğru bir "araç" yapılandırma

İlk ikisi, dile özgüdür ve çoğunlukla basittir. karmaşık projelerde ikincisi daha zor olabilir.

"Enstrümantasyon" Buradaki kastettiğimiz “Kapsam araçları” belirli bir hedef için kullanılır. Bazel, bir belirli dosya alt kümelerini --instrumentation_filter işareti ile test edilen hedefler için bir filtre belirtir. araçlar etkinleştirildi. Araçları testlerde etkinleştirmek için --instrument_test_targets işareti gerekli.

Varsayılan olarak, bazel hedef paketleri eşleştirmeye çalışır ve INFO mesajı olarak filtre uygulayabilirsiniz.

Geçerli yayın

Kapsam raporu oluşturmak için bazel coverage --combined_report=lcov [target] işlevini kullanın. Bu komut, lcov biçiminde kapsam raporları oluşturarak hedef için testleri kullanabilirsiniz.

İşlem tamamlandığında Bazel, üretilen tüm öğeleri toplayan ve bunları tek bir kaynakta birleştirir. Bu işlem, $(bazel info output_path)/_coverage/_coverage_report.dat altında oluşturulmuştur.

Testler başarısız olduğunda kapsam raporları da oluşturulur, ancak bu, başarısız olan testleri kapsamaz. Yalnızca geçilen testler bildiriliyor.

Kapsamı görüntüleme

Kapsam raporunun çıktısı yalnızca insanlar tarafından okunamayan lcov şeklindedir biçimindedir. Bundan, genhtml yardımcı programını (icov projesi) kullanarak web'de görüntülenebilecek bir rapor oluşturun tarayıcı:

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

genhtml işlevinin eksik olanları belirtmek için kaynak kodu da okuduğunu unutmayın. bu dosyalarda yer alır. Bunun işe yarayabilmesi için genhtml, bazel projesinin kökünde yürütülür.

Sonucu görüntülemek için şu konumda oluşturulan index.html dosyasını açın: Herhangi bir web tarayıcısında genhtml dizini.

genhtml aracı veya lcov kapsam biçimi. lcov projesini inceleyin.

Uzaktan yürütme

Uzaktan test yürütme ile çalıştırmanın şu anda birkaç uyarı vardır:

  • Rapor kombinasyonu işlemi henüz uzaktan çalıştırılamaz. Bu çünkü Bazel, kapsam çıkış dosyalarını (buradaki soruna bakın) ve dolayısıyla bunları kombinasyon işlemine girdi olarak doğru bir şekilde işlememesi gerekir. Alıcı: sorunu çözmek için --strategy=CoverageReport=local kullanın.
    • Not: Bazel ayarlanmışsa --strategy=CoverageReport=local,remote local,remote, Bazel'in stratejileri çözme şekli nedeniyle denenebilir.
  • --remote_download_minimal ve benzer işaretler de kullanılamaz bunların bir sonucu olarak ortaya çıkabiliyor.
  • Testler başarısız olursa Bazel şu anda kapsam bilgileri oluşturamayacak önceden önbelleğe alınmış olduğundan emin olun. Bu sorunu çözmek için --nocache_test_results özellikle kapsam çalıştırmaları için ayarlanabilir. Ancak test süresi açısından yüksek bir maliyete yol açacaktır.
  • --experimental_split_coverage_postprocessing ve --experimental_fetch_all_coverage_outputs
    • Kapsam genellikle test işleminin bir parçası olarak çalıştırılır. uzaktan kumandanın çıkışı olarak tüm kapsamı geri almayız. varsayılan olarak yürütülür. Bu flag'ler, varsayılan değeri geçersiz kılar ve kapsam verileridir. Daha fazla bilgi için bu soruna bakın bolca fırsat sunuyor.

Dile özel yapılandırma

Java

Java, varsayılan yapılandırmayla kullanıma hazır bir şekilde çalışmalıdır. İlgili içeriği oluşturmak için kullanılan bazel araç zincirleri, JUnit de dahil olmak üzere uzaktan yürütme

Python

Ön koşullar

Python ile kapsamı çalıştırmanın bazı ön koşulları vardır:

Değiştirilen kapsam.py'yi kullanma

Bunu rules_python aracılığıyla yapabilirsiniz. requirements.txt dosyası kullanılabilmesi için daha sonra pip_install depo kuralını uygulayın.

requirements.txt alanında şu giriş bulunmalıdır:

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

Bu işlemin ardından rules_python, pip_install ve requirements.txt dosyası WORKSPACE dosyasında şu şekilde kullanılmalıdır:

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

Kapsam.py gereksinimi, daha sonra test hedefleri tarafından BUILD dosyalarında aşağıdakileri ayarlayarak:

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

Hermetik Python araç zinciri kullanıyorsanız her py_test hedefine bağımlılığı artırır. Bunun yerine kapsam aracını yapılandırmanın en iyi yoludur.

pip_install kuralı Python'a bağlı olduğu için araç zincirini oluşturuyorsa coverage modülünü getirmek için kullanılamaz. Bunun yerine WORKSPACE ekleyin, ör.

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

Ardından, Python araç zincirinizi

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