Cakupan kode dengan Bazel

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 untuk membuat laporan cakupan kode 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 lcov laporan, yang saat ini merupakan rute yang paling didukung.

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 diinstal
  • Konfigurasi "instrumentasi" yang benar

Dua hal pertama bersifat khusus bahasa dan sebagian besar mudah, tetapi hal terakhir dapat lebih sulit untuk project yang kompleks.

"Instrumentasi" dalam hal ini mengacu pada alat cakupan yang digunakan untuk target tertentu. Bazel memungkinkan mengaktifkan instrumentasi untuk subset file tertentu menggunakan flag --instrumentation_filter, yang menentukan filter untuk target yang diuji dengan instrumentasi yang diaktifkan. Untuk mengaktifkan instrumentasi untuk pengujian, --instrument_test_targets flag 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, 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 kemudian akhirnya dibuat di $(bazel info output_path)/_coverage/_coverage_report.dat.

Laporan cakupan juga dibuat jika pengujian gagal, tetapi perhatikan bahwa laporan 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 laporan ini, 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 tidak ada dalam file ini. Agar berfungsi, genhtml diharapkan dijalankan di root project bazel.

Untuk melihat hasilnya, cukup buka file index.html yang dihasilkan di direktori genhtml di browser web mana pun.

Untuk mendapatkan bantuan dan informasi lebih lanjut terkait 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), dan oleh karena itu, tidak dapat memperlakukannya dengan benar sebagai input ke tindakan kombinasi. Untuk mengatasi hal ini, gunakan --strategy=CoverageReport=local.
    • Catatan: Anda mungkin perlu menentukan sesuatu seperti --strategy=CoverageReport=local,remote sebagai gantinya, jika Bazel disiapkan untuk mencoba local,remote, karena cara Bazel menyelesaikan strategi.
  • --remote_download_minimal dan flag serupa juga tidak dapat digunakan sebagai konsekuensi dari hal sebelumnya.
  • Bazel saat ini akan gagal membuat informasi cakupan jika pengujian telah di-cache sebelumnya. Untuk mengatasi hal ini, --nocache_test_results dapat ditetapkan secara khusus untuk cakupan yang berjalan, meskipun hal ini tentu saja 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, kita tidak mendapatkan semua cakupan kembali sebagai output 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 langkah-langkah tambahan yang diperlukan untuk mengaktifkan dukungan cakupan di Python.