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.
- Not:
Bazel ayarlanmışsa
--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:
- b01c859 içeren bir bazel ikili programı, değer Bazel >3.0 olmalıdır.
- kapsam.py'nin değiştirilmiş bir sürümü.
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",
)