Coding4ever’s Blog

Just coding… coding… and coding… because coding should be fun :)

Coverage Testing Menggunakan NUnit, OpenCover Dan ReportGenerator

| Comments

Sudah menggunakan unit testing ? Klo belum mampir ke sini dulu ya :-)

Kali ini kita akan membahas tentang coverage testing yaitu pengetesan yang dilakukan untuk mengecek apakah unit testing yang dibuat telah meng-cover semua kode yang perlu dites. Jika unit testingnya terlalu sedikit atau waktu membuat unit testingnya asal-asalan biasanya coverage testingnya akan gagal.

Mengecek satu-persatu unit testing yang dibuat oleh programmer apakah sudah sesuai dengan kode yang perlu dites jelas tidak mungkin, untungnya sudah tersedia banyak tool yang bisa melakukkannya secara otomatis.

Berikut beberapa tool yang bisa digunakan untuk melakukan coverage testing di dunia .NET yaitu :

  1. NUnit
  2. OpenCover
  3. Report Generator

Duet maut ketiga tool di atas bisa kita gunakan untuk melakukan prosedur coverage testing. Untuk mendownloadnya Anda tinggal klik link di atas, khusus untuk OpenCover dan Report Generator sebaiknya disimpan di folder yang sama.

Proses Coverage Testing

Secara umum proses coverage testing menggunakan ke tiga tool di atas bisa di gambarkan seperti berikut

Keterangan gambar :

  1. NUnit tool menjalankan prosedur unit testing terhadap file library yang sudah ditentukan
  2. Dari proses poin 1 akan digunakan OpenCover untuk mengenerate file hasil coverage test dalam format xml. Karena file hasil generatenya dalam format xml, tentu akan menyulitkan kita untuk membacanya, makanya kita butuh tool terakhir yaitu Report Generator
  3. Report Generator digunakan untuk membuat laporan format HTML yang lebih manusiawi sehingga mudah dibaca berdasarkan file coverage.xml

Berdasarkan keterangan di atas kita bisa menuliskan batch command untuk prosedur coverage testing seperti berikut :

Tahapan poin 1 dan 2

1
2
3
'1. menjalankan OpenCover untuk mengenerate file CodeCoverageResult.xml

OpenCover.Console.exe -target:nunit-console.exe -targetargs:"/nologo /noshadow ""Library.NUnitTest.dll""" -filter:+[*]* -register:user -output: CodeCoverageResult.xml

Tahapan poin 3

1
2
3
'2. menjalankan ReportGenerator untuk mengenerate laporan format HTML yang lebih mudah dibaca berdasarkan file CodeCoverageResult.xml

ReportGenerator.exe -reports CodeCoverageResult.xml -targetdir: _CodeCoverageReport

Persiapan Coverage Testing

Sama seperti pembahasan unit testing kita juga membutuhkan dua project yaitu project target dan project unit testing. Untuk contoh disini kita sudah punya dua project yaitu KRSoftwareLib dan KRSoftwareLibUnitTest.

Project KRSoftwareLib mempunyai sebuah class yaitu DayHelper dan mempunyai dua method GetIndonesianDay dan Weekday yang akan kita buatkan unit testingnya.

Nah ini unit testing dari method GetIndonesianDay.

Setelah project KRSoftwareLibUnitTest-nya selesai, kemudian dilanjutkan dengan proses build project, baru kita jalankan prosedur coverage testing :

1
2
3
'1. menjalankan OpenCover untuk mengenerate file CodeCoverageResult.xml

"C:\CoverageTesting\opencover.4.6.519"\OpenCover.Console.exe -target:"C:\Program Files (x86)\NUnit 2.6.4\bin"\nunit-console.exe -targetargs:"/nologo /noshadow ""C:\CoverageTesting\KRSoftwareLibUnitTest\bin\Debug\KRSoftwareLibUnitTest.dll""" -filter:"+["KRSoftwareLib"]*" -register:user -output:"CodeCoverageResult.xml"

1
2
3
'2. echo menjalankan ReportGenerator untuk mengenerate laporan format HTML yang lebih mudah dibaca berdasarkan file CodeCoverageResult.xml

"C:\CoverageTesting\ReportGenerator_2.4.5.0\bin"\ReportGenerator.exe -reports:"CodeCoverageResult.xml" -targetdir:"_CodeCoverageReport"

Dari proses coverage test di atas akan menghasilkan coverage test yang bagus, karena semua kondisi sudah dites. Berikut adalah hasil coverage testnya:

Coba perhatikan kolom Line coverage dan Branch coverage nilainya 100% (warna hijaunya penuh).

Kita juga bisa melihat detail coverage test dari class DayHelper.cs :

Nah sekarang kita coba menonaktifkan beberapa baris kode tesnya untuk melihat perbedaan nilai kolom Line coverage dan Branch coverage seperti ini :

Hasil coverage testingnya jadi jelek alias gagal karena hanya dua kondisi yang di tes yaitu hari Senin dan Selasa.

Dari detail coverage testnya class DayHelper.cs juga kelihatan baris/kondisi yang belum di tes:

Gampang bukan ? Dengan coverage testing ini, kita jadi mudah untuk mendeteksi tingkat keseriusan programmer dalam membuat unit testing.

Build Events

Sebenarnya pembahasan coverage testingnya sudah selesai, tapi berhubungan prosedur coverage testing di atas masih dijalankan secara manual via command prompt tentu akan menyulitkan kita untuk mengecek unit testingnya setiap ada perubahan. Salah satu solusinya adalah dengan memanfaatkan fasilitas Build Events yang sudah disediakan oleh Visual Studio .NET.

Nah berikut skrip Build Events yang harus kita buat untuk menjalankan prosedur coverage testing di atas secara otomatis, setiap kali project unit testingnya di build.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
echo "set lokasi tool coverage testing"
set OpenCoverDir="C:\CoverageTesting\opencover.4.6.519"
set NUnitRunnerDir="C:\Program Files (x86)\NUnit 2.6.4\bin"
set ReportGeneratorDir="C:\CoverageTesting\ReportGenerator_2.4.5.0\bin"

echo "set coverage xml"
set CodeCoverageResult="CodeCoverageResult.xml"

echo "set target library yang mau dites, misal KRSoftwareLib"
set TargetLib="KRSoftwareLib"

echo "generate coverage result xml format"
call %OpenCoverDir%\OpenCover.Console.exe -target:%NUnitRunnerDir%\nunit-console.exe -targetargs:"/nologo /noshadow $(TargetFileName)" -filter:"+[%TargetLib%]*" -register:user -output:%CodeCoverageResult%

echo "generate coverage result html format"
call %ReportGeneratorDir%\ReportGenerator.exe -reports:%CodeCoverageResult% -targetdir:_CodeCoverageReport

Jadi setiap kita melakukan build project, prosedur coverage testing otomatis akan dijalankan.

Selamat MENCOBA :-)

Referensi :

software testing

Tentang Penulis

Software developer yang fokus mengembangkan aplikasi di atas platform .NET (Desktop, ASP.NET MVC, Web Service) dan Android. Senang mempelajari teknologi baru terutama di bidang OOP, Design Pattern, ORM, Database dan Continuous Integration & Deployment.
Saat ini bekerja sebagai staf IT di salah satu PTS di Yogyakarta sebagai senior software developer. Di waktu luang insya Alloh akan terus berbagi pengalaman di blog ini :)

« Unit Testing Menggunakan NUnit Integration Testing Menggunakan NUnit »

Comments