Pelajari cara menulis unit test yang efektif menggunakan Qoder CN.
Apa itu unit testing?
Unit testing adalah metode pengujian perangkat lunak di mana developer menulis kode untuk memverifikasi kebenaran unit terkecil yang dapat diuji dalam sebuah aplikasi, seperti fungsi, metode, atau kelas. Developer menulis unit test selama atau setelah implementasi fitur untuk memastikan setiap unit berfungsi sesuai rancangan.
Nilai unit testing
Nilai unit testing terutama tercermin pada peningkatan kualitas dan keandalan perangkat lunak serta memastikan bahwa kode tetap berfungsi dengan baik setelah modifikasi atau refactoring. Keunggulan unit testing meliputi hal-hal berikut:
-
Kualitas kode yang lebih baik: Menemukan error dan kerentanan dalam kode sehingga meningkatkan kualitas dan keandalannya.
-
Efisiensi pengembangan yang lebih tinggi: Mengidentifikasi masalah secara cepat selama pengembangan, mengurangi siklus dan biaya pengembangan.
-
Refactoring dan maintenance yang lebih mudah: Memastikan bahwa kode tidak memperkenalkan error atau kerentanan baru selama refactoring dan maintenance.
-
Kolaborasi tim yang lebih baik: Berfungsi sebagai alat komunikasi dan kolaborasi antar anggota tim, meningkatkan efisiensi dan kualitas kolaborasi.
Selain itu, unit testing memungkinkan Anda mendeteksi kegagalan perangkat lunak sedini mungkin, sehingga mencegah kerugian akibat kesulitan mengidentifikasi dan memperbaiki bug di kemudian hari. Kemampuan regresi dari unit testing memberikan perlindungan bagi perangkat lunak dan proses refactoring selanjutnya. Unit testing juga menyediakan petunjuk dan contoh kode untuk menunjukkan cara menggunakan unit perangkat lunak.
Prinsip yang harus diikuti
Unit testing yang memadai bersifat tak terasa seperti udara dan harus menjamin kualitas pengujian perangkat lunak. Dari perspektif makro, unit testing yang memadai harus bersifat automatic (A), independent (I), dan repeatable (R).
-
A: Automatic: Unit test harus dieksekusi secara otomatis untuk dengan cepat memastikan bahwa kode yang baru ditambahkan tidak merusak fungsionalitas yang sudah ada saat terjadi perubahan kode. Biasanya, unit test diintegrasikan ke dalam continuous integration dan secara otomatis dipicu setiap kali kode berubah.
-
I: Independent: Setiap unit test harus independen dan tidak bergantung pada urutan eksekusi atau hasil test lain. Untuk memastikan kemandirian unit test, unit terkecil yang dapat diuji dalam aplikasi harus diuji.
-
R: Repeatable: Unit test yang baik harus menghasilkan hasil yang sama dalam kondisi yang sama setiap kali dijalankan. Test tidak boleh bergantung pada faktor eksternal, seperti jaringan, database, atau file system. Ketergantungan eksternal tersebut harus dimock dengan benar.
Selain itu, unit test yang baik juga harus memiliki assertion yang jelas, eksekusi yang cepat, pengujian batas yang menyeluruh, dan cakupan (coverage) yang tinggi. Unit test yang mengikuti prinsip-prinsip ini memenuhi syarat dan merupakan bagian penting dari jaminan kualitas kode.
Menulis unit test
Bagian ini menjelaskan cara menulis unit test dalam Java.
Pecah kasus uji secara detail
Pertimbangkan cabang (branches)
Saat menulis unit test, Anda harus mempertimbangkan semua cabang dalam kode Anda. Cabang mencakup pernyataan IF, IF ELSE, dan SWITCH. Setiap cabang harus diuji secara terpisah. Contohnya:
public String classifyNumber(int number) {
if (number < 0) {
return "negative";
} else if (number == 0) {
return "zero";
} else {
return "positive";
}
}
Dalam kode di atas, cabang-cabang berikut harus diuji:
-
number < 0.
-
number == 0.
-
number > 0.
Anda harus menulis satu kasus uji untuk setiap cabang.
Temukan kondisi batas (boundary conditions)
Selain cabang, Anda juga harus mempertimbangkan kondisi batas. Misalnya, untuk fungsi klasifikasi di atas, nilai batasnya adalah -1, 0, dan 1. Pengujian kondisi batas dapat mengidentifikasi potensi masalah dan memastikan bahwa kode berfungsi dengan baik dalam kondisi ekstrem.
Tetapkan standar uji yang terpadu
Konvensi penamaan
Kelas unit test diberi nama dengan format berikut: Nama kelas + Test. Misalnya, jika Anda ingin menguji kelas Calculator, kelas unit test-nya diberi nama CalculatorTest. Nama metode unit test harus menggambarkan konten spesifik yang akan diuji. Contohnya:
public class CalculatorTest {
@Test
public void testAddition() {
// Konten yang akan diuji.
}
@Test
public void testSubtraction() {
// Konten yang akan diuji.
}
}
Jalur penyimpanan
Secara umum, kelas unit test disimpan di bawah package yang sama dengan kelas yang diuji, tetapi dalam direktori yang berbeda. Misalnya, dalam struktur standar proyek Maven, kode sumber disimpan di direktori src/main/java, sedangkan kode unit test disimpan di direktori src/test/java.
src/main/java/com/example/Calculator.java
src/test/java/com/example/CalculatorTest.java
Pilih framework pengujian yang tepat
JUnit dan Mockito adalah framework unit testing umum dalam Java. Bagian ini menjelaskan cara menggunakan kedua framework tersebut untuk menulis unit test dasar:
JUnit
JUnit adalah framework unit testing paling terkenal dalam Java. Framework ini ringkas, mudah digunakan, dan menyediakan banyak anotasi serta assertion.
-
Tambahkan JUnit sebagai dependensi. Dalam contoh ini, digunakan dependensi Maven.
<dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.13.2</version> <scope>test</scope> </dependency> -
Tulis unit test:
import org.junit.Test; import static org.junit.Assert.*; public class CalculatorTest { @Test public void testAddition() { Calculator calculator = new Calculator(); assertEquals(5, calculator.add(2, 3)); } }
Mockito
Mockito adalah framework mocking yang kuat yang memungkinkan Anda membuat mock object dan menyederhanakan unit testing, terutama ketika dependensi yang diuji sulit dibuat.
-
Tambahkan Mockito sebagai dependensi:
<dependency> <groupId>org.mockito</groupId> <artifactId>mockito-core</artifactId> <version>3.11.2</version> <scope>test</scope> </dependency> -
Tulis unit test:
import static org.mockito.Mockito.*; import org.junit.Test; public class UserServiceTest { @Test public void testGetUser() { UserService userService = new UserService(); UserRepository mockRepo = mock(UserRepository.class); when(mockRepo.findUserById(1)).thenReturn(new User(1, "John Doe")); userService.setUserRepository(mockRepo); User user = userService.getUserById(1); assertNotNull(user); assertEquals("John Doe", user.getName()); } }
Cara menghasilkan unit test dengan cepat menggunakan Qoder CN
Sebagian besar developer menerapkan pendekatan test-later berdasarkan kebiasaan pemrograman mereka, yaitu menulis kode terlebih dahulu lalu menulis unit test setelahnya. Dalam konteks ini, penggunaan Qoder CN untuk menghasilkan unit test sangatlah praktis. Bagian berikut menjelaskan beberapa cara menghasilkan unit test menggunakan Qoder CN.
Hasilkan unit test dengan memilih kode
Di editor IDE, pilih sepotong kode dan gunakan /unittest untuk menghasilkan unit test yang sesuai dengan kode yang dipilih.
Saat menggunakan perintah /unit test, tambahkan konteks di kotak chat untuk menghasilkan kasus uji yang lebih sesuai dengan kebutuhan developer. Misalnya, jika Anda perlu mendukung JUnit5 atau menggunakan Mockito untuk mocking, Anda dapat menggunakan /unit test JUnit5 Mockito. Dua kata kunci setelah perintah tersebut merupakan parameter untuk perintah tersebut. Metode ini juga berlaku untuk perintah lainnya.
Hasilkan unit test menggunakan tombol pintasan
Klik ikon Qoder CN di atas signature setiap metode, lalu pilih UnitTest pada menu drop-down.
Anda juga dapat memilih blok kode untuk menghasilkan unit test. Klik kanan pada blok kode yang dipilih, lalu pilih Qoder CN > Unit Test.
Terapkan unit test
Setelah kode unit test dihasilkan, tiga ikon tersedia di pojok kanan atas blok kode di panel AI Chat:
-
Insert Code: memungkinkan Anda memasukkan kode unit test yang dihasilkan ke dalam file yang sedang dibuka.
-
Copy: memungkinkan Anda menyalin kode unit test yang dihasilkan dalam blok kode dan memilih file tujuan untuk menempelkan kode tersebut.
-
Create File: memungkinkan Anda menghasilkan file kelas unit test berdasarkan prinsip unit testing dalam Java di direktori test tempat metode unit test disimpan. Jika file kelas unit test dengan nama yang sama sudah ada, Anda harus menentukan apakah akan menimpa file yang sudah ada.
Ajukan pertanyaan tentang unit test yang dihasilkan
Jika Anda tidak puas dengan kode unit test yang dihasilkan, atau jika Anda perlu menggunakan framework unit test tertentu atau menghasilkan lebih banyak metode unit test, masukkan pertanyaan Anda di kotak chat atau klik tag pertanyaan unit test preset, seperti Retry, Use Mockito, Use Spring Test, dan Explain code, untuk mengajukan pertanyaan lebih lanjut hingga Anda puas dengan kode unit test yang dihasilkan.
Dalam kebanyakan kasus, Qoder CN akan menghasilkan kasus uji umum tetapi tidak mencakup semua skenario yang mungkin. Jika Anda merasa kasus uji yang dihasilkan tidak cukup, disarankan untuk: 1. Terlebih dahulu menerima kasus uji yang dihasilkan dan menambahkannya ke file uji Anda. 2. Lalu beralih ke file uji tersebut dan gunakan fitur penyelesaian kode. Qoder CN akan membantu Anda melanjutkan penulisan kasus uji baru.
Ringkasan
Unit testing merupakan praktik pemrograman penting untuk menjamin kualitas kode. Pendekatan test-first dalam test-driven development (TDD) secara signifikan mendorong desain kode yang lebih baik melalui iterasi. Qoder CN dapat membantu dengan mengurangi beban kerja dalam menyiapkan framework unit testing dan menulis kasus uji, sekaligus menjaga kasus uji tetap mutakhir dengan menyarankan skenario uji tambahan dan menyesuaikan uji terhadap perubahan kode.