Bazel ile kod kapsamı

Bazel, bazel coverage ile test edilebilen depolarda kod kapsamı raporları oluşturmak için bir coverage alt komutu içerir. Çeşitli dil ekosistemlerinin deyimlerinden dolayı, belirli bir projede bu işi yapmak her zaman önemsizdir.

Bu sayfada, kapsam raporları oluşturma ve görüntülemeyle ilgili genel süreç açıklanmaktadır ve yapılandırması iyi bilinen diller için dile özgü bazı notlar da yer alır. Bunun için önce genel bölümü, ardından belirli bir dilin gereksinimlerini okuyun. Dikkat edilmesi gereken diğer bazı noktalar için uzaktan yürütme bölümünü de inceleyin.

Pek çok özelleştirme mümkün olsa da bu belge, şu anda en iyi desteklenen rota olan lcov raporlarını oluşturmaya ve tüketmeye odaklanmaktadır.

Kapsam raporu oluşturma

Hazırlık

Kapsam raporları oluşturmak için temel iş akışı aşağıdakileri gerektirir:

  • Test hedefleri olan bir temel kod deposu
  • Dile özel 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 çoğunlukla anlaşılır olsa da ikincisi karmaşık projeler için daha zor olabilir.

Bu durumda "Enstrümantasyon", belirli bir hedef için kullanılan kapsam araçlarını belirtir. Bazel, araçlarla test edilen hedefler için bir filtre belirten --instrumentation_filter işaretini kullanarak dosyaların belirli bir alt kümesinin bunu etkinleştirmesine izin verir etkin. Testlerde araçları etkinleştirmek için --instrument_test_targets işareti gerekir.

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

Çalışan kapsam

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

Tamamlandıktan sonra bazel, üretilen tüm kapsam dosyalarını toplayan ve bunu birleştirerek bir işlem gerçekleştirir. Daha sonra bu dosyalar nihai olarak $(bazel info output_path)/_coverage/_coverage_report.dat altında oluşturulur.

Testler başarısız olduğunda kapsam raporları da oluşturulur. Ancak bunun başarısız testleri kapsamadığını unutmayın. Yalnızca başarılı testler raporlanır.

Görüntüleme kapsamı

Kapsam raporu yalnızca insanlar tarafından okunamayan lcov biçiminde çıkıştır. Böylece 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 öğesinin bu dosyalardaki eksik kapsamı ek açıklama olarak eklemek için kaynak kodunu da okuduğunu unutmayın. Bunun işe yaraması için genhtml, bazel projesinin kök düzeyinde yürütülür.

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

genhtml aracı veya lcov kapsam 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 şu anda dikkat edilmesi gereken birkaç nokta 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 düşünmemesi (bu soruna bakın) ve bu nedenle bunları doğru bir şekilde girdi olarak değerlendirememesidir işlem. Bu sorunu çözmek için --strategy=CoverageReport=local kullanın.
    • Not: Bazel'in stratejileri çözme biçimi nedeniyle Bazel, local,remote metriğini deneyecek şekilde ayarlanmışsa bunun yerine --strategy=CoverageReport=local,remote gibi bir değer belirtilmesi gerekebilir.
  • --remote_download_minimal ve benzer işaretler, ilkinin sonucu olarak da kullanılamaz.
  • Testler daha önce önbelleğe alındıysa Bazel şu anda kapsam bilgileri oluşturamamaktadır. Bu sorunu aşmak için özellikle kapsam çalıştırmaları için --nocache_test_results ayarlanabilir. Ancak bu süre, test süreleri açısından ciddi bir maliyet oluşturur.
  • --experimental_split_coverage_postprocessing ve --experimental_fetch_all_coverage_outputs
    • Genellikle kapsam, test işleminin bir parçası olarak çalıştırılır. Bu nedenle, varsayılan olarak tüm uzaklığı varsayılan olarak uzak yürütme çıkışları olarak geri alırız. Bu işaretler varsayılanı geçersiz kılar ve kapsam verilerini alır. Daha ayrıntılı bilgi 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. Ana araç zincirleri, JUnit de dahil olmak üzere uzaktan yürütme için gerekli olan her şeyi içerir.

Python

Ön koşullar

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

Değiştirilen kapsama dahil.

Bunu yapmanın bir yolu,kurallar_piton , bu işlem birrequirements.txt dosya için belirtilen gereksinimler, daha sonra kullanılan hedef kitlepip_yükleme kod deposu kuralı.

requirements.txt aşağıdaki girişi içermelidir:

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

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

Daha sonra kapsam.py gereksinimi, BUILD dosyalarında aşağıdaki ayarlar yapılarak test hedefleri tarafından tüketilebilir:

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