Junit - Part 1
Pendahuluan
JUnit secara de facto merupakan platform yang paling banyak dipakai untuk testing di Java.
Penggunaannya juga bukan dari sisi Software Engineer saja, akan tetapi juga biasanya sudah terintegrasi dengan IDE seperti Eclipse, Spring Boot Tools Suite, Intellij IDEA, dll.
Bisa dalam bentuk plugin atau extension dari IDE nya sendiri.
Biasanya kita kenal versi dari JUnit itu adalah JUnit 3, JUnit 4, dan JUnit 5.
Bagi yang biasa membuat Unit test untuk code nya, maka JUnit merupakan tools yang sangat berguna untuk mengecek robustness dari code kita.
Pengenalan mengenai unit test bisa dilihat di sini
Kenapa perlu unit test ? bisa dilihat di sini
Intinya, membuat unit test merupakan proses yang sangat dianjurkan.
Dan JUnit merupakan salah satu toolsnya.
Sejarah
JUnit sendiri berawal dari framework testing yang dibuat oleh Kent Beck dan Erich Gamma. pada tahun 1997.
Kent Beck sendiri merupakan Software Engineer yang cukup terkenal di bidang Software Engineering, Extreme Programming, dan Test Driven Development.
Dan dia juga sebagai salah satu dari 17 orang penandatangan Agile Manifesto
Sementara Erich Gamma juga merupakan Software Engineer yang ahli juga di bidang Software Pattern.
Erich Gamma bersama 3 orang lainnya dikenal sebagai Gang Of Four menerbitkan buku yang menjadi patokan Software Engineer di seluruh dunia.
Yaitu Design Pattern : Element of Reusable Object Oriented Software
Mengenai Design Pattern , bisa dilihat di sini
Jadi memang JUnit sendiri diinisiasi oleh Software Engineer yang berkecimpung lama di dunia per Software Engineer-an.
JUnit 4
Dengan berlalunya waktu, maka JUnit pun berkembang sesuai kebutuhan dan versi nya juga berubah.
Sepertinya kebanyakan unit testing sampai saat sekarang masih dibuat dalam JUnit 4.
Biasanya kalau kita menggunakan Java dan maven, maka kita akan include library JUnit 4 di pom.xml seperti berikut :
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
Kemudian tentunya kita bisa membuat sebuah unit tes dengan memanfaatkan fitur dari JUnit, seperti @Test, @BeforeClass, @AfterClass, @Before, @After, dll.
Apa permasalahan di JUnit 4 ?
Sebenarnya selama ini menjalankan Unit Test memakai JUnit 4 juga tidak masalah sih.
So far, aman-aman saja sih. Semua test bisa dijalankan dengan baik dan benar.
Code coverage juga aman dengan bantuan JUnit ini.
Tetapi sebenarnya secara internal librarynya JUnit 4 sendiri mempunyai permasalahan.
Yaitu..
- Tidak jelasnya separation of concern, yaitu semua library dan fitur dari JUnit 4 ditaruh di dalam satu library saja. Spesifikasi, implementasi dan engine nya JUnit 4 ditaruh di satu library yang sama.
- berhubungan dengan hal diatas, maka pengembangan JUnit menjadi lebih susah, karena harus mempertimbangkan level implementasinya juga, kompatibilitas dengan tools lainnya juga. Yang tidak mudah ketika tidak ada pemisahan separation of concern. Disinilah letak abstraksi coding menjadi penting.
- dari sisi pengembang IDE, dengan tidak ada separation of concern, maka pengembang IDE juga mempunyai kesulitan dalam melakukan integrasi plugin dan membuat fitur baru yang mungkin saja tidak disediakan oleh JUnit 4, tetapi dibutuhkan untuk kasus tertentu.
Menggabungkan modul unit test, test engine, spesifikasi, dan implementasi dalam sebuah paket JUnit 4 memiliki kelebihan juga, misalnya :
- kita hanya perlu mengimpor satu library saja. Semua hal yang terkait sudah dihandle di level implementasinya.
- kita bisa fokus terhadap satu implementasi testing framework saja, yaitu JUnit itu sendiri. Kita tidak peduli dengan testing framework yang lain, seperti TestNg, Spock, dll.
- JUnit bisa kita anggap sebagai sebuah platform tersendiri, yang kita cuma perlu upgrade versinya saja kalau mau membutuhkan fitur yang baru.
Tapi tunggu, bisa lebih detil lagi ?
Ok..ok..
Kita coba lihat kebutuhan dari beberapa pihak terhadap sebuah testing framework :
- Software Engineer butuh testing enginenya, untuk misalnya membuat testing dengan banyak Test Runner.
- Software Engineer lebih suka memakai framework testing yang lain misalnya TestNg atau Spock, tetapi tetap ingin mendapatkan fasilitas yang sudah ada di JUnit.
- IDE seperti Eclipse butuh mengetahui librarynya sampai dalamnya, agar bisa melakukan integrasi dengan lancara, tidak cukup hanya dengan mengetahui interfacenya. Akibatnya IDE ini mesti tergantung dari implementasinya JUnit.
- Pihak ketiga atau testing framework yang baru dibuat ingin melakukan integrasi dengan JUnit, maka mereka harus mengotak-atik code internal didalam JUnit dan menyesuaikannya di code mereka, karena terlalu masuk jauh ke implementasi.
Lalu, bagaimana ?
Permasalahan diatas menjadi alasan Software Engineer di JUnit berupaya membuat JUnit 5.
JUnit 5 adalah library baru yang dilakukan dengan cara menulis ulang atau merefactor class-class di dalam JUnit 4 agar bisa memenuhi separation of concern.
Ok.. kita lanjut ke JUnit 5