Bagaimana cara membaca Laporan Cakupan Istanbul?

131

Saya selalu menggunakan Jasmine untuk pengujian unit saya, tetapi baru-baru ini saya mulai menggunakan Istanbul untuk memberi saya laporan cakupan kode. Maksud saya, saya mendapatkan intisari dari apa yang mereka coba sampaikan kepada saya, tetapi saya tidak benar-benar tahu apa yang mewakili masing-masing persentase ini (Stmts, Branches, Funcs, Lines). Sejauh ini Googling saya tidak dapat menemukan penjelasan / sumber daya yang kuat.

Pertanyaan : Seperti yang saya katakan, saya mendapatkan intinya, tetapi bisakah seseorang mengirim penjelasan yang tepat atau tautan ke penjelasan yang tepat?

Pertanyaan Tersier : Apakah ada cara untuk mengidentifikasi bagian spesifik dari kode Anda yang tidak dicakup? Sejauh ini tanpa benar-benar membaca laporan ini, pada dasarnya saya menebak.

-------------------|-----------|-----------|-----------|-----------|
File               |   % Stmts |% Branches |   % Funcs |   % Lines |
-------------------|-----------|-----------|-----------|-----------|
   controllers/    |      88.1 |     77.78 |     78.57 |      88.1 |
      dashboard.js |      88.1 |     77.78 |     78.57 |      88.1 |
-------------------|-----------|-----------|-----------|-----------|
All files          |      88.1 |     77.78 |     78.57 |      88.1 |
-------------------|-----------|-----------|-----------|-----------|
Scott Sword
sumber
3
Menjalankan istanbul juga harus menghasilkan file HTML untuk laporan (harus dalam folder cakupan). HTML ini akan memberi Anda informasi yang lebih mudah ketika Anda mengklik file / folder
Yaron Schwimmer
Terima kasih @yarons. Itu jelas membantu menelusuri cakupan dan mengidentifikasi apa yang tidak dicakup secara khusus. Saya masih tidak benar-benar mengerti secara mendalam apa artinya persentase = /.
Scott Sword

Jawaban:

217

Ada sejumlah kriteria cakupan, yang utama adalah:

  • Cakupan fungsi Apakah setiap fungsi (atau subrutin) dalam program dipanggil?
  • Pernyataan cakupan Apakah setiap pernyataan dalam program telah dieksekusi?
  • Cakupan Cabang Apakah setiap cabang (juga disebut jalur-DD) dari setiap struktur kontrol (seperti dalam pernyataan if dan case) telah dijalankan? Misalnya, diberi pernyataan if, apakah cabang yang benar dan yang salah telah dieksekusi? Cara lain untuk mengatakan ini adalah, sudahkah setiap sisi dalam program dijalankan?
  • Cakupan baris apakah setiap baris yang dapat dieksekusi dalam file sumber telah dieksekusi?

Untuk setiap kasus, persentase mewakili kode yang dieksekusi vs kode yang tidak dieksekusi , yang sama dengan setiap fraksi dalam format persen (mis: 50% cabang, 1/2).

Dalam laporan file:

  • 'E' singkatan dari 'else path not taken', yang berarti bahwa untuk pernyataan if / else yang ditandai, path 'if' telah diuji tetapi tidak untuk 'else'.
  • 'I' singkatan 'jika jalan tidak diambil', yang merupakan kasus sebaliknya: 'jika' belum diuji.
  • Kolom xNdi sebelah kiri adalah jumlah kali garis itu dieksekusi.
  • Baris yang tidak dieksekusi, atau potongan kode, akan disorot dengan warna merah.

Ini telah diverifikasi untuk Istanbul v0.4.0, saya tidak yakin apakah ini masih berlaku untuk versi berikutnya, tetapi karena perpustakaan didasarkan pada prinsip-prinsip teori yang solid, perilaku seharusnya tidak terlalu banyak berubah untuk versi yang lebih baru.

Ini juga menyediakan beberapa kode warna -

Merah muda : pernyataan tidak tercakup.

Oranye : fungsi tidak tercakup.

Kuning : cabang tidak tercakup.

Dokumentasi Istanbul selengkapnya di sini:

https://istanbul.js.org

Untuk teori yang lebih mendalam tentang cakupan kode:

https://en.wikipedia.org/wiki/Code_coverage

Semoga ini bisa membantu!

Amy Pellegrini
sumber
8

Menjalankan istanbul juga harus menghasilkan file HTML untuk laporan (harus dalam folder cakupan). HTML ini akan memberi Anda informasi pencarian ketika Anda mengklik file / folder.

Persentase fungsi yang tercakup dihitung oleh jumlah fungsi yang dipanggil selama tes, dibagi dengan jumlah total fungsi. Hal yang sama berlaku untuk baris dan pernyataan (yang biasanya akan saling berdekatan kecuali Anda memiliki pernyataan yang sangat panjang). Cabang berarti titik keputusan seperti if-elseblok. Misalnya, kode Anda hanya berisi satu if-elsepernyataan, dan tes Anda hanya melewati ifbagian tetapi bukan elsebagian, maka persentase cabang Anda harus 50%.

Harapan yang membuat segalanya lebih jelas.

Yaron Schwimmer
sumber
Saya menjalankan istanbul dengan menentukan "test" : "nyc mocha"dalam package.json. Folder jangkauan saya kosong. Pikiran?
TheCrazyProgrammer
1
Saya menambahkan reporter html. Ini berfungsi sekarang. "test" : "nyc --reporter=html mocha"
TheCrazyProgrammer
Sebagai contoh: jika Anda memiliki cabang if-besar dan kecil-cabang lain, dan hanya jika-cabang dijalankan, cakupan garis akan tampak hebat tetapi cakupan cabang akan tetap hanya 50%. Selain itu, Anda dapat memiliki beberapa pernyataan per baris jika pernyataan dipisahkan dengan titik koma atau jika baris menyertakan definisi fungsi (yang berisi pernyataannya sendiri). Anda dapat memiliki beberapa baris per pernyataan jika pernyataan memiliki jeda baris sebelum titik koma akhir.
Hew Wolff
0

Menambah jawaban sebelumnya

% Pernyataan dihitung dengan mengambil persentase dari jumlah pernyataan yang dicakup oleh tes Anda misalnya 12/18 * 100 = 66,67%. Ini berarti bahwa tes Anda hanya mencakup 66,67%.

Cabang% juga dihitung dengan cara yang sama. Sama untuk% Fungsi dan% baris Anda.

Di direktori root proyek Anda, ada folder cakupan yang berisi hasil HTML pengujian Anda. Klik dan lihat di browser. Anda harus melihat sesuatu seperti ini

Gambar yang menunjukkan output dari hasil pengujian Anda

Saya harap ini membantu Anda memahaminya dengan lebih baik.

Samuel Pinheiro
sumber