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ü yapıları nedeniyle, belirli bir projede bu işi yapmak her zaman sıradan değildir.
Bu sayfada, kapsam raporları oluşturma ve görüntülemeyle ilgili genel süreç açıklanmakta, ayrıca yapılandırması iyi bilinen diller için dile özgü bazı notlar da 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.
Ç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ş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 "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 "araç", 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. 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.
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.
Haberleri görüntüleme
Kapsam raporu yalnızca insanlar tarafından okunamayan lcov
biçiminde çıktı olarak verilir. Bu bilgilerden, bir 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 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 gidermek için
--strategy=CoverageReport=local
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.
- Not: Bazel, stratejileri çözümleme şeklinden dolayı Bazel
--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 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ı 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 özgü 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:
- Herhangi bir Bazel >3.0 olması gereken, b01c859 içeren bir bazel ikili programı.
- Scope.py'nin değiştirilmiş bir sürümü.
Değiştirilen coverage.py dosyasını 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
, aşağıdaki girişi içermelidir:
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",
)
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ç 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
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 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",
)