Bazel ile kod kapsamı

Sorun bildirin Kaynağı göster

Bazel, bazel coverage ile test edilebilecek depolar hakkında kod kapsamı raporları oluşturmak için bir coverage alt komutu içerir. Farklı dil ekosistemlerinin kendine özgü özellikleri nedeniyle, belirli bir projede bu işi yapmak her zaman sıradan değildir.

Bu sayfada, kapsam raporu oluşturma ve görüntülemeyle ilgili genel süreç anlatılmakta ve ayrıca yapılandırması iyi bilinen diller için dile özgü bazı notlar yer almaktadır. Bu belgeyi, önce genel bölümü, ardından belirli bir dil için gereksinimleri okumanız önerilir. Bazı ek hususlar gerektiren uzaktan yürütme bölümünü de unutmayın.

Birçok özelleştirme mümkün olsa da bu belge, şu anda en iyi desteklenen rota olan lcov raporlarının üretilmesine ve kullanılmasına odaklanmaktadır.

Kapsam raporu oluşturma

Hazırlık

Kapsam raporları oluşturmaya ilişkin temel iş akışı şunları gerektirir:

  • 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ırması

İlk ikisi dile özgüdür ve genelde basittir. Ancak ikinci seçenek, karmaşık projelerde daha zor olabilir.

Bu durumda "araç", belirli bir hedef için kullanılan kapsam araçlarını ifade eder. Bazel, araçlar etkinleştirildiğinde test edilen hedefler için bir filtre belirten --instrumentation_filter işaretini kullanarak bu ayarın belirli bir dosya alt kümesi için etkinleştirilmesini sağlar. Araçları testlerde etkinleştirmek için --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.

Geçerli yayın

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

İşlem tamamlandıktan sonra bazel, üretilen tüm kapsam dosyalarını toplayan ve bunları tek bir dosyada birleştiren bir işlem çalıştırır. Bu işlem son olarak $(bazel info output_path)/_coverage/_coverage_report.dat altında oluşturulur.

Kapsam raporları, testler başarısız olduğunda da oluşturulur. Ancak bu durumun başarısız testler için geçerli olmadığını, yalnızca geçen testlerin raporlandığını unutmayın.

Kapsamı görüntüleme

Kapsam raporunun çıktısı yalnızca insanlar tarafından okunamayan lcov biçiminde olur. Bundan sonra, 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 işlevinin, bu dosyalardaki eksik kapsamı belirtmek için kaynak kodu da okuduğunu unutmayın. Bunun çalışması için genhtml komutunun bazel projesinin kökünde yürütülmesi beklenir.

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 kapsam biçimi hakkında daha fazla yardım ve bilgi için lcov projesine göz atın.

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. Bunun nedeni, Bazel'in kapsam çıkış dosyalarını grafiğinin bir parçası olarak kabul etmemesi (bu soruna bakın) ve dolayısıyla bunları kombinasyon işlemine yönelik girişler olarak doğru şekilde değerlendirememesidir. Bu sorunu çözmek için --strategy=CoverageReport=local uygulamasını kullanın.
    • Not: Bazel, stratejileri çözümleme şeklinden dolayı Bazel local,remote özelliğini denemek üzere ayarlanmışsa bunun yerine --strategy=CoverageReport=local,remote gibi bir değer belirtmeniz gerekebilir.
  • --remote_download_minimal ve benzer işaretler de ilkinin sonucu olarak kullanılamaz.
  • Testler önceden önbelleğe alınmışsa Bazel şu anda kapsam bilgileri oluşturamaz. Bu sorunu çözmek için --nocache_test_results, test süreleri açısından yüksek bir maliyete sahip olsa da kapsam çalıştırmaları için özel olarak ayarlanabilir.
  • --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ı varsayılan olarak uzaktan yürütmenin çıktısı olarak geri almayız. Bu işaretler, varsayılanı geçersiz kılar ve kapsam verilerini alır. Daha fazla ayrıntı için bu soruna bakın.

Dile özel yapılandırma

Java

Java, varsayılan yapılandırmayla kullanıma hazır bir şekilde çalışmalıdır. bazel araç zincirleri, JUnit de 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 kapsam.py'yi kullanma

Bunu yapmanın bir yolu rules_python kullanmaktır. requirements.txt dosyası kullanılabilir. Dosyada listelenen gereksinimler, daha sonra pip_install depo kuralı kullanılarak bazel hedefleri olarak oluşturulur.

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 BUILD dosyalarında aşağıdaki değerin ayarlanmasıyla 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ç zinciri kullanıyorsanız her py_test hedefine kapsam bağımlılığını eklemek yerine kapsam aracını araç zinciri yapılandırmasına ekleyebilirsiniz.

pip_install kuralı Python araç zincirine bağlı olduğundan 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",
)