Meninjau dan mengonfigurasi hasil cakupan kode di Azure Pipelines

Layanan Azure DevOps | Azure DevOps Server | Azure DevOps Server 2022

Cakupan kode membantu Anda menentukan proporsi kode proyek Anda yang sebenarnya sedang diuji, seperti oleh pengujian unit. Untuk meningkatkan keyakinan Anda terhadap perubahan kode dan melindungi secara efektif terhadap bug, pengujian Anda sebaiknya menjalankan atau mencakup proporsi besar kode Anda.

Saat meninjau hasil cakupan kode, Anda dapat mengidentifikasi jalur kode yang tidak dicakup pengujian. Informasi ini membantu Anda meningkatkan cakupan pengujian dari waktu ke waktu dengan mengurangi utang pengujian.

Artikel ini memperlihatkan kepada Anda cara menampilkan, mengonfigurasi, dan memecahkan masalah cakupan kode di Azure Pipelines. Anda mempelajari cara menyiapkan cakupan berbeda untuk permintaan pull, mengonfigurasi kebijakan cakupan, dan menyelesaikan masalah umum.

Nota

Meskipun Anda dapat membuat kode dari berbagai sistem kontrol versi yang didukung Azure Pipelines, cakupan kode untuk fitur permintaan pull yang dibahas dalam artikel ini saat ini hanya tersedia untuk Azure Repos.

Format, tugas, dan artefak yang didukung

Format yang didukung

Azure Pipelines dapat menerbitkan hasil cakupan, melalui tugas Terbitkan Hasil Cakupan Kode v2. Tugas dapat menampilkan hasil dalam 2 tampilan berbeda:

  • Untuk format cobertura, jacoco, clover, gcov, pcov, dan xml lainnya, tampilan HTML yang dihasilkan berisi detail lebih lanjut dari laporan cakupan kode dan lebih disukai oleh sebagian besar pelanggan.
  • Untuk .coverage/.cjson/.covx – tampilan tabular dihasilkan, berisi lebih sedikit detail daripada tampilan HTML.

Artefak dan hasil

Anda dapat melihat artefak cakupan kode yang diterbitkan selama build di bawah tab Ringkasan pada ringkasan eksekusi alur.

Cuplikan layar memperlihatkan tab Ringkasan dengan pemrosesan manual dan 2 item diterbitkan.

Selain itu, Anda dapat meninjau hasil dari laporan cakupan kode di tab Cakupan Kode :

Cuplikan layar memperlihatkan konten tab Cakupan Kode dengan ringkasan, metrik, dan cakupan.

  • Jika Anda menerbitkan cakupan kode menggunakan format cakupan Cobertura atau JaCoCo, artefak cakupan kode berisi sebuah file .html yang dapat dilihat secara offline untuk analisis lanjutan. Cuplikan layar memperlihatkan ringkasan laporan HTML.
  • Untuk .NET dan .NET Core, Anda dapat mengakses tautan untuk mengunduh artefak dengan memilih tonggak cakupan kode dalam ringkasan build.
  • Visual Studio Test dapat mengumpulkan cakupan untuk aplikasi .NET dan .NET Core. Ini menghasilkan .coverage file yang dapat Anda unduh dan gunakan untuk analisis lebih lanjut di Visual Studio. Cuplikan layar memperlihatkan hasil cakupan kode.

Tasks

Publikasikan Hasil Cakupan Kode menerbitkan hasil cakupan kode ke Azure Pipelines, yang dihasilkan oleh build dalam format Cobertura atau JaCoCo.

Tugas bawaan seperti Visual Studio Test, .NET Core, Ant, Maven, Gulp, Grunt, dan Gradle menyediakan opsi untuk menerbitkan data cakupan kode ke alur.

Pertimbangan Docker

Untuk aplikasi yang menggunakan Docker, Anda dapat menjalankan build dan pengujian di dalam kontainer dan menghasilkan hasil cakupan kode dalam kontainer. Untuk menerbitkan hasil ke pipeline, buat artefak yang dihasilkan tersedia untuk tugas Terbitkan Hasil Cakupan Kode. Untuk referensi, lihat contoh serupa untuk menerbitkan hasil pengujian di bawah bagian Membangun, menguji, dan menerbitkan hasil dengan file Docker untuk Docker.

Pertimbangan penting

  • Dalam pipeline multi-tahap YAML, hasil cakupan kode hanya tersedia setelah seluruh pipeline selesai. Anda mungkin perlu memisahkan tahap build ke dalam alurnya sendiri jika Anda ingin meninjau hasil cakupan kode sebelum menyebarkan ke produksi.
  • Menggabungkan hasil cakupan kode dari beberapa eksekusi pengujian saat ini hanya berfungsi untuk .NET dan .NET Core. Tidak ada rencana untuk mendukung format lain.

Cakupan penuh vs cakupan perbedaan

Cakupan penuh mengukur cakupan untuk seluruh basis kode proyek. Dalam konteks permintaan pull, pengembang berfokus pada perubahan yang mereka buat dan ingin mengetahui apakah baris kode tertentu yang ditambahkan atau diubah tercakup. Jenis cakupan ini adalah cakupan diff.

Pengaturan cakupan YAML berbeda dari alur YAML karena pengaturan cakupan berlaku untuk repositori Anda dan digunakan terlepas dari alur mana yang membangun kode Anda. Pemisahan ini juga berarti bahwa jika Anda menggunakan alur build yang berbasis perancang klasik, Anda akan mendapatkan pemeriksaan status cakupan kode untuk permintaan penarikan.

Indikator cakupan muncul dalam tampilan file yang diubah terlepas dari apakah detail komentar permintaan pull diaktifkan.

Mengonfigurasi cakupan diff

Untuk mengubah pengaturan default pengalaman cakupan kode untuk permintaan pull, sertakan file YAML konfigurasi bernama azurepipelines-coverage.yml di akar repositori Anda. Atur nilai yang diinginkan dalam file ini, dan Azure DevOps menggunakannya secara otomatis saat alur berjalan.

Anda dapat mengubah pengaturan berikut:

Cuplikan layar memperlihatkan pengaturan yang dapat Anda konfigurasi.

Konfigurasi contoh

coverage:  
  status:                    # Code coverage status will be posted to pull requests based on targets defined below. 
    comments: on             # Off by default. When on, details about coverage for each file changed will be posted as a pull request comment.  
    diff:                    # Diff coverage is code coverage only for the lines changed in a pull request. 
      target: 60%            # Set this to a desired percentage. Default is 70 percent 

Anda dapat menemukan lebih banyak contoh dengan detail dalam cakupan kode repositori sampel YAML.

Status cakupan, detail, dan indikator

Saat Anda menyiapkan pipeline untuk mengumpulkan dan menerbitkan cakupan kode, status cakupan kode akan diposting ketika Anda membuat pull request. Secara default, server memeriksa bahwa pengujian mencakup setidaknya 70% baris yang diubah. Anda dapat mengubah target ambang batas cakupan diff menjadi nilai yang Anda pilih dengan memodifikasi parameter target yang disebutkan sebelumnya.

Cuplikan layar memperlihatkan pemeriksaan Status cakupan gagal.

Pemeriksaan status menghitung cakupan perbedaan untuk semua file dalam pull request. Untuk melihat persentase untuk setiap file, aktifkan Detail seperti yang dijelaskan di bagian sebelumnya. Saat diaktifkan, sistem memposting detail sebagai komentar pada permintaan pull.

Cuplikan layar memperlihatkan hasil pemeriksaan cakupan diff gagal.

Dalam tampilan file yang diubah dari permintaan pull, baris yang diubah juga dianotasi dengan indikator cakupan untuk menunjukkan apakah baris tersebut tercakup.

Cuplikan layar memperlihatkan indikator cakupan perubahan baris permintaan pull.

Menerapkan perlindungan cabang dengan kebijakan cakupan kode

Secara bawaan, pemeriksaan status cakupan kode pada permintaan pull bersifat opsional - tidak menghalangi penggabungan dengan cakupan rendah. Untuk memastikan perubahan memenuhi ambang batas cakupan minimum sebelum penggabungan, konfigurasikan kebijakan cabang yang menggunakan pemeriksaan status cakupan.

Status cakupan kode yang diposting dari alur mengikuti konvensi {name-of-your-pipeline/codecoverage} penamaan.

Nota

  • Kebijakan cabang di Azure Repos (bahkan kebijakan opsional) mencegah permintaan pull selesai secara otomatis jika gagal. Perilaku ini bukan khusus untuk kebijakan cakupan kode.
  • Kebijakan cakupan kode tidak diubah menjadi "Gagal" jika proses build mengalami kegagalan.

Panduan pemecahan masalah

Mengapa saya melihat DLL duplikat dalam tampilan cakupan tab Cakupan Kode?

Anda mungkin melihat DLL duplikat ketika .NET Core dan .NET Framework digunakan dalam jalur pemrosesan. Harapkan DLL duplikat ketika keduanya digunakan, yang dirancang karena modul yang sama berasal dari jalur yang berbeda.

Mengapa tidak ada data cakupan di tab Cakupan Kode?

Beberapa alasan dapat menyebabkan masalah ini:

  • Tidak ada pengujian atau DLL yang ada: Jika file tidak berisi pengujian atau DLL, nilai cakupannya adalah 0. Azure DevOps tidak menampilkan data cakupan kode di tab saat nilai cakupan adalah 0. Sebaliknya, ini menunjukkan pesan di bawah tab Cakupan Kode yang menjelaskan mengapa tidak ada data cakupan.

  • XML cakupan kosong: Saat Anda menggunakan tugas Terbitkan Cakupan Kode, jika cakupan .xml yang diberikan sebagai input tidak berisi informasi apa pun atau tidak memiliki garis yang tercakup, tidak ada data cakupan yang muncul di bawah tab. Periksa mengapa file cakupan .xml (file input) kosong atau tidak memiliki informasi.

  • Kegagalan Build: Jika build gagal, tab cakupan kode akan muncul dengan pesan yang tepat.

  • Konfigurasi tugas VSTest: Saat Anda menggunakan tugas VSTest, jika Anda tidak mengaktifkan pemeriksaan cakupan kode atau jika Anda menyebutkan DLL yang salah atau jalur yang salah untuk menguji file di bidang Filter pengujian, data cakupan tidak ditampilkan.

  • Masalah konfigurasi build: Terkadang ada beberapa nilai konfigurasi build dan Anda tidak mengatur semua nilai seperti BuildFlavour atau BuildPlatform. UI hanya menunjukkan nilai konfigurasi build tertentu, itulah sebabnya modul lain hilang.

  • File HTML besar: Jika .html file lebih besar dari 7 MB, laporan tidak tersedia di tab Cakupan Kode. Sebagai solusinya, unduh artefak "Cakupan Kode Report_*" dari artefak yang diterbitkan di Ringkasan.

  • Pesan kegagalan: Jika tab Cakupan Kode berisi pesan kegagalan yang terkait dengan kesalahan khusus pengguna, selidiki apa yang memicu pesan kesalahan tersebut.

Apa yang harus saya lakukan jika Pemeriksaan Status Cakupan Kode tidak pernah selesai atau gagal?

Untuk mengaktifkan pemeriksaan status cakupan kode, coba tambahkan azurepipelines-coverage.yml file di akar repositori. Pastikan nama file tetap sama persis. Berikut adalah sebuah contoh:

coverage: 
  status: 
    comments: on 
    diff: 
      target: 50% 

Jika pemeriksaan status cakupan gagal:

  1. Periksa persentase cakupan perbedaan. Jika lebih kecil dari target, coba tingkatkan persentase cakupan diff.
  2. Jika build gagal karena alasan apa pun, kegagalan ini juga dapat menyebabkan pemeriksaan status cakupan kode gagal.
  3. Periksa tugas mana yang menghasilkan file cakupan atau laporan dalam pipeline. Verifikasi apakah tugas mengunggah laporan atau file cakupan dengan benar.
  4. Kasus di mana komentar cakupan perbedaan menunjukkan "Tidak ada perubahan yang dapat dieksekusi" atau "Tidak ada data cakupan kode yang ditemukan" dapat terjadi karena baris dihapus, penambahan spasi kosong, atau penambahan komentar. Kasus-kasus ini adalah perubahan yang tidak dapat dieksekusi dan tidak signifikan, sehingga cakupan kode tidak melaporkannya.

Bagaimana cara mengecualikan beberapa DLL dari cakupan kode?

Untuk mengecualikan file dari penutup kode, gunakan class ExcludeFromCodeCoverageAttribute.

Bagaimana cara menerbitkan ringkasan cakupan kode dengan detail yang tepat dengan menggabungkan beberapa file ringkasan?

Tugas Publikasi Cakupan Kode V1 tidak mendukung beberapa file ringkasan sebagai input. Sebagai gantinya, gunakan tugas Terbitkan Cakupan Kode V2, yang mendukung beberapa format file.

Anda juga dapat menggunakan tugas Generator Laporan untuk menggabungkan semua .xml file lalu meneruskan jalur XML yang dihasilkan sebagai input ke tugas Terbitkan Cakupan Kode.

Bagaimana cara memicu pemeriksaan cakupan kode?

Untuk .html file, pemeriksaan status cakupan tidak didukung. Gunakan Build Quality Checks task untuk memeriksa hasil cakupan kode.

Laporan pada tab Cakupan Kode berisi angka yang tidak akurat

Data yang ditampilkan pada tab berasal dari file cakupan. Jika Anda menggunakan tugas kustom untuk menghasilkan file cakupan kode, periksa apakah file kehilangan DLL atau file apa pun.

Kebijakan cakupan kode macet—apa penyebabnya?

Beberapa faktor dapat menyebabkan masalah ini:

  • Format nama kebijakan cabang yang salah: Verifikasi nama alur cocok dengan nama kebijakan cabang dan tidak memiliki karakter tambahan.

    Cuplikan layar memperlihatkan tab Kebijakan dan nama kebijakan cabang yang disorot, untuk mengonfirmasinya cocok dengan nama alur.

  • Menggunakan PublishCodeCoverage V1: Kebijakan cakupan kode macet dan komentar tidak dihasilkan. Gunakan tugas PublishCodeCoverage V2 sebagai gantinya.

  • Terlalu banyak file dalam PR: Jika PR memiliki lebih dari 100 file, kebijakan cakupan akan terhenti.

  • Beberapa kebijakan cakupan: Jika Anda mengonfigurasi beberapa kebijakan cakupan, salah satunya macet. Konfigurasikan hanya satu kebijakan dan hapus kebijakan macet lainnya.

Saya melihat cakupan 0% berbeda untuk PR saya bahkan setelah menambahkan tes

Jika Anda menambahkan tes untuk mencakup baris kode yang dimodifikasi atau baru dalam PR dan melihat masih cakupan perbedaan 0%:

  1. Verifikasi bahwa pengujian yang baru ditambahkan dijalankan sebagai bagian dari proses build.
  2. Jika pengujian tidak berjalan, verifikasi dan perbarui konfigurasi untuk menyertakannya dalam build, karena cakupan tidak dapat dihitung jika pengujian tidak berjalan.

Saya tidak melihat komentar cakupan berbeda di PR meskipun saya melihat laporan cakupan yang diterbitkan

Beberapa faktor dapat menyebabkan masalah ini:

  • Versi tugas: Komentar cakupan berbeda hanya didukung dengan Cakupan Kode Publikasi V2.
  • Tidak ada perubahan yang dapat dieksekusi: Komentar cakupan diff dihasilkan untuk file dengan perubahan kode yang dapat dieksekusi. Jika PR hanya terdiri dari pembaruan konfigurasi, Azure DevOps mungkin menampilkan cakupan kode berdasarkan semua pengujian yang dijalankan selama build, tetapi mungkin tidak ada perbedaan cakupan untuk dihitung.
  • Format cakupan: Jika ada perubahan kode fungsi dan komentar tidak dihasilkan, verifikasi bahwa alur menghasilkan laporan cakupan dalam salah satu format yang didukung yang disebutkan di awal artikel ini.

Di tab Cakupan Kode, saya tidak melihat laporan HTML yang tepat

Ketika ada masalah saat menghasilkan .html laporan, sistem kembali ke tampilan yang disederhanakan.

Cuplikan layar memperlihatkan tab Cakupan Kode dan daftar modul dan indikator visual bagan cakupan, yang merupakan tampilan yang disederhanakan fallback.

Alat cakupan dan format hasil mana yang dapat digunakan untuk memvalidasi cakupan kode dalam permintaan pull?

Saat ini, Anda hanya dapat menggunakan format cakupan Visual Studio Code (.coverage) untuk memvalidasi cakupan kode untuk permintaan pull. Gunakan format ini jika Anda menerbitkan cakupan kode (code coverage) dengan menggunakan tugas Uji Visual Studio, perintah pengujian dari tugas .NET Core, dan opsi TRX dari tugas Menerbitkan Hasil Pengujian.

Jika beberapa pipa dipicu saat permintaan pull dibuat, apakah cakupan akan digabungkan antar pipa?

Jika beberapa pipeline dipicu saat permintaan pull dibuat, cakupan kode tidak bergabung. Kemampuan ini saat ini dirancang untuk satu pipeline yang mengumpulkan dan menerbitkan cakupan kode untuk pull request. Jika Anda perlu menggabungkan data cakupan di seluruh alur, kirimkan permintaan fitur di Komunitas Pengembang.