Bazel menampilkan sub-perintah coverage
untuk menghasilkan laporan cakupan
kode pada repositori yang dapat diuji dengan bazel coverage
. Karena
idiosyncrasies dari ekosistem ekosistem yang berbeda, tidak selalu
mudah untuk membuatnya berfungsi untuk project tertentu.
Halaman ini mendokumentasikan proses umum untuk membuat dan melihat laporan cakupan, serta menampilkan beberapa catatan khusus bahasa untuk bahasa yang konfigurasinya sudah dikenal. Sebaiknya baca dengan membaca bagian umum terlebih dahulu, lalu membaca persyaratan untuk bahasa tertentu. Perhatikan juga bagian eksekusi jarak jauh, yang memerlukan beberapa pertimbangan tambahan.
Meskipun banyak penyesuaian dapat dilakukan, dokumen ini berfokus pada pembuatan dan penggunaan laporan lcov
, yang saat ini merupakan rute yang paling didukung dengan baik.
Membuat laporan cakupan
Persiapan
Alur kerja dasar untuk membuat laporan cakupan memerlukan hal berikut:
- Repositori dasar dengan target pengujian
- Toolchain dengan alat cakupan kode khusus bahasa yang terinstal
- Konfigurasi "instrumentasi" yang benar
Format yang kedua bersifat spesifik per bahasa dan sebagian besar bersifat langsung, tetapi yang kedua bisa lebih sulit untuk project yang kompleks.
Dalam hal ini "Instrumentasi" mengacu pada alat cakupan yang digunakan untuk target tertentu. Bazel memungkinkan tindakan ini diaktifkan untuk
subfile tertentu menggunakan flag
--instrumentation_filter
, yang menentukan filter untuk target yang diuji dengan
instrumentasi diaktifkan. Guna mengaktifkan instrumentasi untuk pengujian, flag
--instrument_test_targets
diperlukan.
Secara default, bazel mencoba mencocokkan paket target, dan mencetak
filter yang relevan sebagai pesan INFO
.
Cakupan yang berjalan
Untuk membuat laporan cakupan, gunakan bazel coverage
--combined_report=lcov
[target]
. Tindakan ini akan menjalankan pengujian untuk target, yang menghasilkan laporan cakupan dalam format lcov untuk setiap file.
Setelah selesai, bazel menjalankan tindakan yang mengumpulkan semua file
cakupan yang dihasilkan, dan menggabungkannya menjadi satu, yang akhirnya
dibuat di bagian $(bazel info
output_path)/_coverage/_coverage_report.dat
.
Laporan cakupan juga dibuat jika pengujian gagal, meskipun perhatikan bahwa pengujian ini tidak diperluas ke pengujian yang gagal. Hanya pengujian yang lulus yang akan dilaporkan.
Melihat cakupan
Laporan cakupan hanya berupa output dalam format lcov
yang tidak dapat dibaca manusia. Dari sini, kita dapat menggunakan utilitas genhtml
(bagian dari project lcov) untuk membuat laporan yang dapat dilihat di browser web:
genhtml --branch-coverage --output genhtml "$(bazel info output_path)/_coverage/_coverage_report.dat"
Perhatikan bahwa genhtml
juga membaca kode sumber untuk menganotasi cakupan
yang hilang dalam file ini. Agar hal ini berfungsi, diharapkan
genhtml
dieksekusi di root project bazel.
Untuk melihat hasilnya, cukup buka file index.html
yang dihasilkan di
direktori genhtml
di browser web apa pun.
Untuk mendapatkan bantuan dan informasi lebih lanjut seputar alat genhtml
, atau
format cakupan lcov
, lihat project lcov.
Eksekusi jarak jauh
Menjalankan dengan eksekusi pengujian jarak jauh saat ini memiliki beberapa peringatan:
- Tindakan kombinasi laporan belum dapat dijalankan dari jarak jauh. Hal ini
karena Bazel tidak menganggap file output cakupan sebagai bagian dari
grafiknya (lihat masalah ini), sehingga tidak dapat
memperlakukannya dengan benar sebagai input untuk tindakan kombinasi. Untuk mengatasi masalah ini, gunakan
--strategy=CoverageReport=local
.- Catatan: Anda mungkin perlu menentukan sesuatu seperti
--strategy=CoverageReport=local,remote
sebagai gantinya, jika Bazel disiapkan untuk mencobalocal,remote
, karena cara Bazel menyelesaikan strategi.
- Catatan: Anda mungkin perlu menentukan sesuatu seperti
--remote_download_minimal
dan flag serupa juga tidak dapat digunakan sebagai konsekuensi dari flag pertama.- Bazel saat ini akan gagal membuat informasi cakupan jika pengujian telah di-cache sebelumnya. Untuk mengatasi hal ini,
--nocache_test_results
dapat ditetapkan khusus untuk cakupan yang berjalan, meskipun hal ini tentu menimbulkan biaya yang besar dalam hal waktu pengujian. --experimental_split_coverage_postprocessing
dan--experimental_fetch_all_coverage_outputs
- Biasanya, cakupan dijalankan sebagai bagian dari tindakan pengujian, sehingga secara default, kami tidak mendapatkan semua cakupan kembali sebagai output dari eksekusi jarak jauh secara default. Flag ini mengganti default dan mendapatkan data cakupan. Lihat masalah ini untuk mengetahui detail selengkapnya.
Konfigurasi khusus bahasa
Java
Java akan berfungsi langsung dengan konfigurasi default. Toolchain Bazel berisi semua yang diperlukan untuk eksekusi jarak jauh, termasuk JUnit.
Python
Lihat dokumen cakupan rules_python
untuk mengetahui langkah-langkah tambahan yang diperlukan guna mengaktifkan dukungan cakupan di Python.