Bazel ile kod kapsamı

Sorun bildirme Kaynağı görüntüleme Nightly · 8.0 . 7.4 . 7.3 · 7.2 · 7.1 · 7.0 · 6.5

Bazel, bazel coverage ile test edilebilen depolar için kod kapsamı raporları oluşturmak üzere coverage alt komutuna sahiptir. Çeşitli dil ekosistemlerinin kendine özgü özellikleri nedeniyle, bu işlemi belirli bir projede gerçekleştirmek her zaman kolay değildir.

Bu sayfada, kapsam raporları oluşturma ve görüntülemeyle ilgili genel süreç açıklanmakta, ayrıca yapılandırması bilinen diller için dillere özel notlar da yer almaktadır. Bu dokümanı okumanın en iyi yolu, önce genel bölümü, ardından belirli bir dil için gerekenler hakkındaki bölümü okumaktır. Ayrıca, bazı ek hususları dikkate almanız gereken uzaktan yürütme bölümüne de göz atın.

Çok fazla özelleştirme yapılabilmesine rağmen bu dokümanda, şu anda en iyi desteklenen rota olan lcov raporlarının oluşturulması ve kullanılması ele alınmaktadır.

Kapsam raporu oluşturma

Hazırlık

Kapsam raporları oluşturmayla ilgili temel iş akışı için aşağıdakiler gereklidir:

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

İlk ikisi dile özgüdür ve çoğunlukla basittir. Ancak sonuncusu karmaşık projeler için daha zor olabilir.

Bu durumda "donanım", belirli bir hedef için kullanılan kapsam araçlarını ifade eder. Bazel, bu özelliği belirli bir dosya alt kümesi için etkinleştirmenize olanak tanır. Bunun için --instrumentation_filter işaretçisini kullanır. Bu işaretçi, enstrümantasyon etkinken test edilen hedefler için bir filtre belirtir. Testler için enstrümantasyonu etkinleştirmek üzere --instrument_test_targets işareti gereklidir.

Varsayılan olarak bazel, hedef paketleri eşleştirmeye çalışır ve ilgili filtreyi INFO mesajı olarak yazdırır.

Yayın kapsamı

Kapsam raporu oluşturmak için bazel coverage --combined_report=lcov [target] simgesini kullanın. Bu işlem, hedef için testleri çalıştırarak her dosya için lcov biçiminde kapsam raporları oluşturur.

İşlem tamamlandığında bazel, oluşturulan tüm kapsam dosyalarını toplayan ve tek bir dosyada birleştiren bir işlem yürütür. Bu dosya daha sonra $(bazel info output_path)/_coverage/_coverage_report.dat altında oluşturulur.

Testler başarısız olursa kapsam raporları da oluşturulur. Ancak bu, başarısız testler için geçerli değildir. Yalnızca başarılı testler raporlanır.

Haber yayınını görüntüleme

Kapsam raporu yalnızca insanlar tarafından okunamayan lcov biçiminde çıktı olarak verilir. Bu bilgilerden, web tarayıcısında görüntülenebilecek bir rapor oluşturmak için genhtml yardımcı programını (lcov projesinin bir parçası) kullanabiliriz:

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

genhtml'ün, bu dosyalarda eksik kapsamı açıklamak için kaynak kodu da okuduğunu unutmayın. Bunun işe yaraması için genhtml'ün bazel projesinin kökünde yürütülmesi gerekir.

Sonucu görüntülemek için genhtml dizininde oluşturulan index.html dosyasını herhangi bir web tarayıcısında açmanız yeterlidir.

genhtml aracı veya lcov kapsama biçimi hakkında daha fazla yardım ve bilgi için lcov projesine bakın.

Uzaktan yürütme

Uzaktan test yürütme özelliğinin şu anda birkaç sınırlaması vardır:

  • Rapor birleştirme işlemi henüz uzaktan çalıştırılamaz. Bunun nedeni, Bazel'in kapsam çıkış dosyalarını grafiğinin bir parçası olarak değerlendirmemesidir (bu soruna bakın). Bu nedenle, bu dosyaları birleştirme işleminin girişleri olarak doğru şekilde işleyemez. Bu sorunu gidermek için --strategy=CoverageReport=local kullanın.
    • Not: Bazel, stratejileri çözme şekli nedeniyle local,remote'yi denemek üzere ayarlanmışsa bunun yerine --strategy=CoverageReport=local,remote gibi bir değer belirtmeniz gerekebilir.
  • --remote_download_minimal ve benzer işaretler de bu nedenle kullanılamaz.
  • Testler daha önce önbelleğe alınmışsa Bazel şu anda kapsam bilgisi oluşturamaz. Bu sorunu gidermek için --nocache_test_results, özellikle kapsam çalıştırmaları için ayarlanabilir. Ancak bu, test süreleri açısından elbette ağır bir maliyete neden olur.
  • --experimental_split_coverage_postprocessing ve --experimental_fetch_all_coverage_outputs
    • Kapsam genellikle test işleminin bir parçası olarak çalıştırılır. Bu nedenle, varsayılan olarak tüm kapsamı uzaktan yürütmenin çıktıları olarak geri almayız. Bu işaretler varsayılan ayarı geçersiz kılar ve kapsam verilerini alır. Daha fazla bilgi için bu sayfada yer alan makaleyi inceleyin.

Dile özgü yapılandırma

Java

Java, varsayılan yapılandırmayla kullanıma hazır olarak çalışır. Bazel araç zincirleri, JUnit dahil olmak üzere uzaktan yürütme için gereken her şeyi içerir.

Python

Ön koşullar

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

Değiştirilen coverage.py dosyasını kullanma

Bunu yapmanın bir yolu rules_python aracılığıyladır. Bu, requirements.txt dosyası kullanma olanağı sağlar. Dosyada listelenen şartlar daha sonra pip_install depo kuralı kullanılarak bazel hedefleri olarak oluşturulur.

requirements.txt şu girişe sahip olmalıdır:

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

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

Ardından, coverage.py koşulu, BUILD dosyalarında aşağıdakiler ayarlanarak test hedefleri tarafından kullanılabilir:

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 bir Python araç seti kullanıyorsanız kapsam bağımlılığını her py_test hedefine eklemek yerine kapsam aracını araç seti yapılandırmasına ekleyebilirsiniz.

pip_install kuralı Python araç setine bağlı olduğundan coverage modülünü almak için kullanılamaz. Bunun yerine WORKSPACE adresinizi ekleyin.

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 aşağıdaki gibi yapılandırın:

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