Apa cakupan kode dan bagaimana Anda mengukurnya?

275

Apa cakupan kode dan bagaimana Anda mengukurnya?

Saya ditanya pertanyaan ini tentang cakupan kode pengujian otomatis kami. Tampaknya, di luar alat otomatis, itu lebih seni daripada sains. Apakah ada contoh dunia nyata tentang cara menggunakan cakupan kode?

Brian G
sumber

Jawaban:

242

Cakupan kode adalah ukuran dari berapa banyak baris / blok / busur kode Anda dieksekusi saat tes otomatis berjalan.

Cakupan kode dikumpulkan dengan menggunakan alat khusus untuk memasukkan binari untuk menambahkan panggilan penelusuran dan menjalankan serangkaian uji otomatis terhadap produk yang diinstrumentasi. Alat yang bagus tidak hanya akan memberikan Anda persentase kode yang dieksekusi, tetapi juga akan memungkinkan Anda untuk menelusuri data dan melihat baris kode mana yang dieksekusi selama tes tertentu.

Tim kami menggunakan Magellan - seperangkat alat cakupan kode internal. Jika Anda seorang toko NET., Visual Studio memiliki alat terintegrasi untuk mengumpulkan cakupan kode. Anda juga dapat menggulung beberapa alat khusus, seperti yang dijelaskan artikel ini .

Jika Anda adalah toko C ++, Intel memiliki beberapa alat yang berjalan untuk Windows dan Linux, meskipun saya belum menggunakannya. Saya juga mendengar ada alat gcov untuk GCC, tapi saya tidak tahu apa-apa tentang itu dan tidak bisa memberi Anda tautan.

Mengenai cara kami menggunakannya - cakupan kode adalah salah satu kriteria keluar kami untuk setiap tonggak sejarah. Kami sebenarnya memiliki tiga metrik cakupan kode - cakupan dari tes unit (dari tim pengembangan), tes skenario (dari tim uji) dan cakupan gabungan.

BTW, sementara cakupan kode adalah metrik yang baik tentang seberapa banyak pengujian yang Anda lakukan, itu belum tentu metrik yang baik tentang seberapa baik Anda menguji produk Anda. Ada metrik lain yang harus Anda gunakan bersama dengan cakupan kode untuk memastikan kualitas.

Franci Penov
sumber
40
"Ada metrik lain yang harus Anda gunakan bersama dengan cakupan kode untuk memastikan kualitas." Bisakah Anda mengatakan apa saja metrik ini?
Pasukan
Anda juga dapat menggunakan Testwell CTC ++ , ini adalah alat cakupan kode yang cukup lengkap untuk C, C ++, C # dan Java
B_PRIEUR
1
@Abdul Ketika Anda mengukur cakupan kode, Anda harus menjalankan kedua jenis tes, dan mengukur cakupan kode untuk mereka secara terpisah. Adapun "busur kode" - itu adalah cabang eksekusi kode, seperti if / then.
Franci Penov
1
@Maverick kebanyakan orang menganggap pengujian unit ketika mereka berbicara tentang cakupan kode, namun di Microsoft kami mengukur cakupan kode dari pengujian unit dan pengujian integrasi.
Franci Penov
1
@darth_coder umumnya tidak ada. Aplikasi tidak akan secara otomatis diinstrumentasi juga, dan jika tidak ada yang mengumpulkan data instrumentasi, keberadaan aplikasi baru tidak relevan. Satu-satunya kasus di mana hal itu dapat mempengaruhi hal-hal adalah jika aplikasi berjalan pada saat yang sama dengan tes otomatis sedang berjalan dan menyebabkan kode OS terinstal untuk berjalan dalam proses yang sama dengan otomatisasi tes, sehingga berpotensi menampilkan beberapa kode OS yang sedang dijalankan yaitu tidak tersentuh oleh tes.
Franci Penov
189

Cakupan kode pada dasarnya menguji bahwa seberapa banyak kode Anda dicakup dalam pengujian. Jadi, jika Anda memiliki cakupan kode 90% dari itu berarti ada 10% kode yang tidak tercakup dalam tes. Saya tahu Anda mungkin berpikir bahwa 90% dari kode tertutup tetapi Anda harus melihat dari sudut yang berbeda. Apa yang menghentikan Anda untuk mendapatkan cakupan kode 100%?

Contoh yang baik adalah ini:

if(customer.IsOldCustomer()) 
{
}
else 
{
}

Sekarang, dalam kode di atas ada dua jalur / cabang. Jika Anda selalu menekan cabang "YA" maka Anda tidak menutupi bagian yang lain dan itu akan ditampilkan dalam hasil Cakupan Kode. Ini bagus karena sekarang Anda tahu bahwa apa yang tidak tercakup dan Anda dapat menulis tes untuk menutupi bagian yang lain. Jika tidak ada cakupan kode maka Anda hanya duduk di atas bom waktu untuk meledak.

NCover adalah alat yang bagus untuk mengukur cakupan kode.

azamsharp
sumber
5
Jawaban terbaik, hampir 10 tahun yang lalu! Sial! :)
Nikos
4
Jawaban sederhana dan bermakna :)
Parveen
Iya. Satu-satunya yang masuk akal. Meskipun aku bahkan tidak repot untuk terus menggulir ke bawah. Di sinilah saya berhenti. Ditandai.
TheRealChx101
64

Hanya ingat, memiliki "cakupan kode 100%" tidak berarti semuanya diuji sepenuhnya - walaupun itu berarti setiap baris kode diuji, itu tidak berarti mereka diuji dalam setiap situasi (umum) ..

Saya akan menggunakan kode-cakupan untuk menyoroti bit kode yang saya mungkin harus menulis tes untuk. Sebagai contoh, jika alat cakupan kode apa pun yang menunjukkan myImportantFunction () tidak dieksekusi saat menjalankan tes unit saya saat ini, mereka mungkin harus ditingkatkan.

Pada dasarnya, 100% cakupan kode tidak berarti kode Anda sempurna. Gunakan itu sebagai panduan untuk menulis tes yang lebih komprehensif (unit-).

dbr
sumber
1
- "100% cakupan kode" tidak berarti semuanya diuji sepenuhnya - walaupun artinya setiap baris kode diuji, itu tidak berarti semuanya diuji dalam setiap situasi (umum) ..- "di bawah setiap (umum) situasi "apakah ini berkaitan dengan input dan parameter data? Saya mengalami kesulitan memahami mengapa jika semuanya diuji, itu tidak sama dengan diuji sepenuhnya.
Abdul
20
Hanya karena setiap baris kode Anda dijalankan pada titik tertentu dalam pengujian Anda, itu tidak berarti Anda telah menguji setiap skenario yang mungkin bahwa kode tersebut dapat dijalankan. Jika Anda hanya memiliki fungsi yang mengambil xdan kembali x/xdan Anda menjalankan tes menggunakan my_func (2) Anda akan memiliki cakupan 100% (karena kode fungsi akan dijalankan) tetapi Anda telah melewatkan masalah besar ketika 0 adalah parameter. Yaitu, Anda belum menguji semua skenario yang diperlukan bahkan dengan cakupan 100%.
steve
dapatkah Anda melihat situasi ini ketika kasus uji Unit tidak ditulis untuk semua metode. Apakah cakupan kode masih 100%. stackoverflow.com/questions/43395968/…
Sachin Kumar
52

Melengkapi beberapa poin dari banyak jawaban sebelumnya:

Cakupan kode berarti, seberapa baik set tes Anda mencakup kode sumber Anda. yaitu sejauh mana kode sumber dicakup oleh set kasus uji.

Seperti disebutkan dalam jawaban di atas, ada berbagai kriteria cakupan, seperti jalur, kondisi, fungsi, pernyataan, dll. Tetapi kriteria tambahan yang akan dibahas adalah

  1. Cakupan kondisi: Semua ekspresi boolean harus dievaluasi benar dan salah.
  2. Cakupan keputusan: Bukan hanya ekspresi boolean yang akan dievaluasi benar dan salah satu kali, tetapi untuk mencakup semua badan if-elseif-else berikutnya.
  3. Loop Coverage: berarti, apakah setiap loop yang mungkin telah dieksekusi satu kali, lebih dari sekali dan nol kali. Juga, jika kita memiliki asumsi batas maksimum, maka, jika layak, uji batas waktu maksimum dan, satu lebih dari batas waktu maksimum.
  4. Entri dan Keluar Cakupan: Tes untuk semua panggilan yang mungkin dan nilai kembalinya.
  5. Parameter Nilai Cakupan (PVC). Untuk memeriksa apakah semua nilai yang mungkin untuk suatu parameter diuji. Sebagai contoh, sebuah string dapat berupa salah satu dari yang umumnya: a) null, b) kosong, c) spasi (spasi, tab, baris baru), d) string yang valid, e) string tidak valid, f) string byte tunggal, g ) string byte ganda. Kegagalan untuk menguji setiap nilai parameter yang mungkin dapat meninggalkan bug. Pengujian hanya satu di antaranya dapat menghasilkan 100% cakupan kode karena setiap baris dicakup, tetapi karena hanya satu dari tujuh opsi yang diuji, berarti, hanya 14,2% cakupan nilai parameter.
  6. Cakupan Warisan: Dalam hal sumber berorientasi objek, ketika mengembalikan objek turunan yang dirujuk oleh kelas dasar, cakupan untuk mengevaluasi, jika objek saudara dikembalikan, harus diuji.

Catatan: Analisis kode statis akan menemukan apakah ada kode yang tidak terjangkau atau kode gantung, yaitu kode yang tidak tercakup oleh panggilan fungsi lainnya. Dan juga cakupan statis lainnya. Bahkan jika analisis kode statis melaporkan bahwa kode 100% dicakup, itu tidak memberikan laporan tentang set pengujian Anda jika semua kemungkinan cakupan kode diuji.

Chand51
sumber
2
Tambahan yang bagus di sini untuk jawaban lain
HDave
15

Cakupan kode telah dijelaskan dengan baik dalam jawaban sebelumnya. Jadi ini lebih merupakan jawaban untuk bagian kedua dari pertanyaan.

Kami telah menggunakan tiga alat untuk menentukan cakupan kode.

  1. JTest - alat berpemilik yang dibangun di atas JUnit. (Ini menghasilkan unit test juga.)
  2. Cobertura - alat cakupan kode sumber terbuka yang dapat dengan mudah digabungkan dengan tes JUnit untuk menghasilkan laporan.
  3. Emma - yang lain - yang ini kami gunakan untuk tujuan yang sedikit berbeda dari pengujian unit. Ini telah digunakan untuk menghasilkan laporan cakupan ketika aplikasi web diakses oleh pengguna akhir. Ini ditambah dengan alat pengujian web (contoh: Canoo) dapat memberi Anda laporan cakupan yang sangat berguna yang memberi tahu Anda berapa banyak kode yang tercakup selama penggunaan khas pengguna akhir.

Kami menggunakan alat ini untuk

  • Tinjau bahwa pengembang telah menulis unit test yang baik
  • Pastikan bahwa semua kode dilewati selama pengujian kotak hitam
Vivek Kodira
sumber
6

Cakupan kode hanyalah ukuran dari kode yang diuji. Ada berbagai kriteria cakupan yang dapat diukur, tetapi biasanya berbagai jalur, kondisi, fungsi, dan pernyataan dalam suatu program yang membentuk cakupan total. Metrik cakupan kode adalah hanya persentase tes yang mengeksekusi masing-masing kriteria cakupan ini.

Sejauh cara saya melacak cakupan unit test pada proyek saya, saya menggunakan alat analisis kode statis untuk melacak.

Pengembang SaaS
sumber
5

Untuk Perl ada modul Devel :: Cover yang luar biasa yang saya gunakan pada modul saya.

Jika build dan instalasi dikelola oleh Module :: Build, Anda dapat menjalankannya ./Build testcoveruntuk mendapatkan situs HTML yang bagus yang memberi tahu Anda cakupan per sub, garis, dan kondisi, dengan warna-warna yang bagus sehingga mudah untuk melihat jalur kode mana yang belum dicakup.

moritz
sumber
1

Dalam jawaban sebelumnya, cakupan Kode telah dijelaskan dengan baik. Saya hanya menambahkan beberapa pengetahuan yang berhubungan dengan alat-alat jika Anda bekerja pada iOSdan OSXplatform, Xcode menyediakan fasilitas untuk cakupan tes dan memantau kode.

Tautan Referensi:

https://developer.apple.com/library/archive/documentation/DeveloperTools/Conceptual/testing_with_xcode/chapters/07-code_coverage.html

https://medium.com/zendesk-engineering/code-coverage-and-xcode-6b2fb8756a51

Keduanya merupakan tautan bermanfaat untuk mempelajari dan menjelajahi cakupan kode dengan Xcode.

taha027
sumber