Bazel memiliki sub-perintah coverage untuk menghasilkan laporan cakupan kode di repositori yang dapat diuji dengan bazel coverage. Karena keunikan berbagai ekosistem bahasa, tidak selalu mudah membuat fitur ini 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 bagian umum terlebih dahulu, lalu baca persyaratan untuk bahasa tertentu. Perhatikan juga bagian eksekusi jarak jauh, yang memerlukan beberapa pertimbangan tambahan.
Meskipun banyak penyesuaian yang dapat dilakukan, dokumen ini berfokus pada
pembuatan dan penggunaan laporan lcov, yang saat ini merupakan
cara yang paling didukung.
Membuat laporan cakupan
Persiapan
Alur kerja dasar untuk membuat laporan cakupan memerlukan hal berikut:
- Repositori dasar dengan target pengujian
- Rangkaian alat dengan alat cakupan kode khusus bahasa yang diinstal
- Konfigurasi "instrumentasi" yang benar
Dua yang pertama bersifat spesifik per bahasa dan sebagian besar mudah dipahami, namun yang terakhir bisa lebih sulit untuk project yang kompleks.
Dalam hal ini, "Instrumentasi" mengacu pada alat cakupan yang digunakan untuk target tertentu. Bazel memungkinkan pengaktifan ini untuk subset file tertentu menggunakan
flag --instrumentation_filter, yang menentukan filter untuk target yang diuji dengan
instrumentasi yang diaktifkan. Untuk mengaktifkan instrumentasi untuk pengujian, tanda
--instrument_test_targets
diperlukan.
Secara default, bazel mencoba mencocokkan paket target, dan mencetak filter yang relevan sebagai pesan INFO.
Menjalankan cakupan
Untuk membuat laporan cakupan, gunakan bazel coverage
--combined_report=lcov
[target]. Tindakan ini menjalankan
pengujian untuk target, 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 kemudian dibuat di $(bazel info
output_path)/_coverage/_coverage_report.dat.
Laporan cakupan juga dibuat jika pengujian gagal, meskipun perhatikan bahwa hal ini tidak mencakup pengujian yang gagal - hanya pengujian yang lulus yang dilaporkan.
Melihat cakupan
Laporan cakupan hanya ditampilkan 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 memberi anotasi pada cakupan yang tidak ada dalam file ini. Agar ini berfungsi, genhtml diharapkan dijalankan di root project bazel.
Untuk melihat hasilnya, buka file index.html yang dihasilkan di direktori genhtml di browser web mana pun.
Untuk mendapatkan bantuan dan informasi lebih lanjut tentang alat genhtml, atau format cakupan lcov, lihat project lcov.
Eksekusi jarak jauh
Menjalankan dengan eksekusi pengujian jarak jauh memiliki beberapa peringatan:
- Tindakan kombinasi laporan belum dapat dijalankan dari jarak jauh. Hal ini terjadi karena Bazel tidak menganggap file output cakupan sebagai bagian dari grafiknya (lihat masalah Bazel #4685), dan oleh karena itu tidak dapat memperlakukannya dengan benar sebagai input ke tindakan kombinasi. Untuk
mengatasi hal ini, gunakan
--strategy=CoverageReport=local.- Catatan: Mungkin perlu menentukan sesuatu seperti
--strategy=CoverageReport=local,remote, jika Bazel disiapkan untuk mencobalocal,remote, karena cara Bazel menyelesaikan strategi.
- Catatan: Mungkin perlu menentukan sesuatu seperti
--remote_download_minimaldan flag serupa juga tidak dapat digunakan sebagai akibat dari hal tersebut.- Bazel akan gagal membuat informasi cakupan jika pengujian telah di-cache sebelumnya. Untuk mengatasinya,
--nocache_test_resultsdapat ditetapkan secara khusus untuk eksekusi cakupan, meskipun hal ini tentu saja menimbulkan biaya yang besar dalam hal waktu pengujian. --experimental_split_coverage_postprocessingdan--experimental_fetch_all_coverage_outputs- Biasanya cakupan dijalankan sebagai bagian dari tindakan pengujian, sehingga secara default, kita tidak mendapatkan semua cakupan kembali sebagai output eksekusi jarak jauh secara default. Tanda ini menggantikan default dan mendapatkan data cakupan. Lihat masalah Bazel #4685 untuk mengetahui detail selengkapnya.
Konfigurasi khusus bahasa
Bagian berikut menjelaskan pertimbangan khusus bahasa untuk menyiapkan cakupan kode dengan Bazel.
C++
Linux
Cakupan C++ harus berfungsi langsung dengan konfigurasi default.
macOS
Nilai default GCOV_PREFIX_STRIP hampir pasti salah dan perlu disesuaikan secara manual karena nilai yang benar bergantung pada penyiapan Anda.
Jika nilainya salah, data cakupan tidak akan ditemukan.
Contoh untuk menyetel GCOV_PREFIX_STRIP=10
bazel coverage //foo:foo_test --test_env=GCOV_PREFIX_STRIP=10`
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 untuk mengaktifkan dukungan cakupan di Python.