Daftar Isi:
Video: Java - JUnit testing in Eclipse 2024
JUnit adalah kerangka standar untuk menguji unit Java (yaitu kelas Java). JUnit dapat diotomatisasi untuk melakukan beberapa pengujian di luar pengujian.
Bayangkan Anda telah menciptakan tipe enum dengan tiga nilai: GREEN, YELLOW, dan RED. Kode 1 berisi kode:
Listing 1
enum publik SignalColor {GREEN, YELLOW, RED}
Lampu lalu lintas memiliki status (yang merupakan nama keren untuk warna lampu lalu lintas).
kelas publik TrafficLight {SignalColor state = SignalColor. MERAH;
Jika Anda mengetahui kondisi arus lalu lintas, Anda dapat memutuskan keadaan lampu lalu lintas berikutnya.
public void nextState () {switch (state) {case RED: state = SignalColor. HIJAU; istirahat; kasus KUNING: negara = SignalColor. MERAH; istirahat; kasus GREEN: state = SignalColor. KUNING; istirahat; default: state = SignalColor. MERAH; break;}}
Anda juga dapat mengubah status lampu lalu lintas beberapa kali:
public void change (int numberOfTimes) {untuk (int i = 0; iMenempatkan semuanya, Anda memiliki kelas TrafficLight di Listing 2.
Listing 2
kelas publik TrafficLight {SignalColor state = SignalColor. MERAH; public void nextstate () {switch (state) {case RED: state = SignalColor. HIJAU; istirahat; kasus KUNING: negara = SignalColor. MERAH; istirahat; kasus GREEN: state = SignalColor. KUNING; istirahat; default: state = SignalColor. MERAH; break}} public void change (int numberOfTimes) {untuk (int i = 0; iDi masa lalu Anda mungkin terus menulis kode, membuat lebih banyak kelas, memanggil metode nextstate dan change di Listing 2. Kemudian, setelah beberapa bulan coding, Anda akan berhenti sejenak untuk menguji pekerjaan Anda.
Dan betapa terkejutnya! Tes Anda akan gagal total! Anda seharusnya tidak pernah menunda pengujian lebih dari satu atau dua hari. Uji awal dan uji sering!
Satu filosofi tentang pengujian mengatakan bahwa Anda harus menguji setiap potongan kode begitu Anda telah menulisnya. Tentu saja, ungkapan "potongan kode" tidak terdengar sangat ilmiah. Tidak akan ada gunanya pengembang berkeliling untuk berbicara tentang "pengujian potongan-kode" yang mereka lakukan siang ini. Lebih baik memanggil setiap potongan kode unit , dan minta pengembang untuk membicarakan unit testing .
Unit pengujian yang paling umum adalah kelas. Jadi, pengembang Java yang khas menguji setiap kelas begitu kode kelas ditulis.
Jadi bagaimana Anda menguji kelas? Seorang pemula mungkin menguji kelas TrafficLight dengan menulis kelas tambahan - kelas yang berisi metode utama. Metode utama menciptakan sebuah instance TrafficLight, memanggil metode nextstate dan change, dan menampilkan hasilnya.Pemula memeriksa hasil dan membandingkannya dengan beberapa nilai yang diharapkan.
Setelah menulis metode utama untuk puluhan, ratusan, atau bahkan ribuan kelas, pemula (sekarang pengembang penuh) menjadi lelah dengan rutinitas pengujian dan mencari cara untuk mengotomatisasi prosedur pengujian. Lelah atau tidak, satu pengembang mungkin mencoba untuk menguraikan tes kode tangan pengembang lainnya. Tanpa memiliki standar atau pedoman untuk membuat tes, membaca dan memahami tes pengembang lain bisa jadi sulit dan membosankan.
Jadi JUnit datang untuk menyelamatkannya!.
Untuk mengetahui bagaimana Eclipse mengotomatiskan penggunaan JUnit, lakukan hal berikut:
Buat proyek Eclipse yang berisi Listing 1 dan 2.
Pada Windows, klik kanan TrafficLight Package Explorer. cabang java Di Mac, klik kontrol TrafficLight Package Explorer. cabang java
Menu konteks muncul.
Pada menu konteks, pilih New → JUnit Test Case.
Akibatnya, kotak dialog New JUnit Test Case muncul.
Klik Next di bagian bawah kotak dialog New JUnit Test Case.
Sebagai hasilnya, Anda melihat halaman kedua kotak dialog Kasus JUnit Test Baru. Halaman kedua berisi daftar metode yang dimiliki (baik secara langsung atau tidak langsung) ke kelas TrafficLight.
Tempatkan tanda centang di kotak centang berlabel Lampu Lalu Lintas.
Akibatnya, Eclipse menempatkan tanda centang di kotak centang nextState () dan (int) .
Klik Finish di bagian bawah kotak dialog New JUnit Test Case.
JUnit bukan bagian Jawa secara formal. Sebagai gantinya datang dengan kumpulan kelas dan metode untuk membantu Anda membuat tes untuk kode Anda. Setelah Anda klik Finish, Eclipse bertanya kepada Anda apakah Anda ingin memasukkan kelas dan metode JUnit sebagai bagian dari proyek Anda.
Pilih Lakukan Tindakan Berikut dan Tambah JUnit 4 Library ke Build Path. Kemudian klik OK.
Eclipse menutup kotak dialog dan proyek Anda memiliki TrafficLightTest yang baru. file java Kode file ditunjukkan pada Listing 3.
Kode pada Listing 3 berisi dua tes, dan kedua tes tersebut berisi panggilan ke metode gagal yang tidak menyenangkan. Eclipse ingin Anda menambahkan kode untuk membuat tes ini lulus.
Hapus panggilan ke metode gagal. Di tempat pemanggilan metode gagal, ketik kode yang ditunjukkan dengan huruf tebal di Listing 4.
Di Package Explorer, klik kanan (di Windows) atau klik kontrol (di Mac) TrafficLightTest. cabang java Pada menu konteks yang dihasilkan, pilih Run As → JUnit Test.
Gerhana mungkin memiliki lebih dari satu jenis kerangka pengujian JUnit di lengan bajunya. Jika demikian, Anda mungkin melihat kotak dialog seperti di bawah ini. Jika Anda melakukannya, pilih Eclipse JUnit Launcher, lalu klik OK.
Akibatnya, Eclipse menjalankan TrafficLightTest Anda. program java Eclipse menampilkan hasil run di depan Package Explorer miliknya. Hasilnya tidak menunjukkan kesalahan dan tidak ada kegagalan. Wah!
Cantumkan 3
impor org statis. junit Menegaskan. *; impor org. junit Uji; public class TrafficLightTest {@Test public void testNextState () {fail ("belum diimplementasikan");} @Test public void testChange () {fail ("Not yet implement");}}Listing 4
import org statisjunit Menegaskan. *; impor org. junit Uji; kelas publik TrafficLightTest {@Test public void testNextState () { TrafficLight light = TrafficLight baru (); assertEquals (SignalColor, RED, light. State); cahaya nextState (); assertEquals (SignalColor GREEN, light. State); cahaya nextState (); assertEquals (SignalColor. KUNING, cahaya. Negara); cahaya nextState (); assertEquals (SignalColor, RED, light. State); } @Test public void testChange () { TrafficLight light = TrafficLight baru (); cahaya perubahan (5); assertEquals (SignalColor. KUNING, cahaya. Negara); }}Bila Anda memilih Run As → JUnit Test, Eclipse tidak mencari metode utama. Sebagai gantinya, Eclipse mencari metode yang dimulai dengan @Test dan hal-hal lainnya. Eclipse menjalankan masing-masing metode @Test.
Hal-hal seperti @Test adalah Java anotasi .
Listing 4 berisi dua metode @Test: testNextState dan testChange. Metode testNextState menempatkan metode TrafficLight nextstate untuk diuji. Demikian pula, metode testChange melenturkan otot metode TrafficLight change.
Pertimbangkan kode di metode testNextState. Metode testNextState berulang kali memanggil metode nextstate kelas TrafficLight dan metode assertEquals JUnit. Metode assertEquals mengambil dua parameter: nilai yang diharapkan dan nilai sebenarnya.
Pada panggilan assertEquals paling atas, nilai yang diharapkan adalah SignalColor. MERAH. Anda mengharapkan lampu lalu lintas menyala karena, pada Listing 2, Anda menginisialisasi keadaan cahaya dengan nilai SignalColor. MERAH.
Pada panggilan assertEquals paling atas, nilai sebenarnya ringan. negara (warna yang sebenarnya tersimpan dalam variabel keadaan lampu lalu lintas).
Jika nilai sebenarnya sama dengan nilai yang diharapkan, panggilan untuk memastikan lolos dan JUnit terus mengeksekusi pernyataan dalam metode testNextState.
Tetapi jika nilai sebenarnya berbeda dari nilai yang diharapkan, assertEquals gagal dan hasil run menampilkan kegagalan. Sebagai contoh, pertimbangkan apa yang terjadi bila Anda mengubah nilai yang diharapkan dalam assertEquals pertama di Listing 4:
@Test public void testNextState () {TrafficLight light = new TrafficLight (); assertEquals (SignalColor. KUNING, cahaya. negara);Segera setelah konstruksi, lampu lalu lintas menyala MERAH, bukan KUNING. Jadi metode testNextState berisi pernyataan palsu dan hasil menjalankan Run As → JUnit terlihat seperti kartu laporan buruk anak.
Setelah testNextState sebelum testChange di Listing 4 tidak menjamin bahwa JUnit akan mengeksekusi testNextState sebelum mengeksekusi testChange. Jika Anda memiliki tiga metode @Test, JUnit mungkin mengeksekusinya dari paling atas sampai ke titik paling bawah, dari jarak paling bawah sampai paling bawah, dari metode tengah sampai yang paling dekat ke bagian paling bawah, atau dalam urutan apapun sama sekali. JUnit bahkan mungkin berhenti sejenak di tengah satu tes untuk mengeksekusi bagian tes lain. Itulah mengapa Anda tidak boleh membuat asumsi tentang hasil dari satu tes saat Anda menulis tes lain.
Anda mungkin ingin pernyataan tertentu dieksekusi sebelum tes dimulai.Jika Anda melakukannya, letakkan pernyataan tersebut dalam metode yang bernama setUp, dan maklum metode itu dengan penjelasan @Sebelum anotasi. (Lihat kotak centang setUp () pada gambar di Langkah 3 di Listing 2 di atas.)
Ini berita: Tidak semua metode assertEquals dibuat sama! Bayangkan menambahkan kelas Driver ke kode proyek Anda. "Driver class" tidak berarti driver printer atau driver tumpukan. Artinya seseorang mengendarai mobil - mobil yang mendekati lampu lalu lintas Anda. Untuk detailnya, lihat Listing 5.
Listing 5
public class Driver {public double velocity (lampu TrafficLight) {switch (light. State) {case RED: return 0. 0; kasus KUNING: kembali 10. 0; kasus GREEN: return 30. 0; default: return 0. 0;}}}Bila lampu menyala merah, kecepatan pengemudi adalah 0. 0. Bila lampu berwarna kuning, mobil akan melambat ke posisi yang aman 10. 0. Bila lampu menyala hijau, kapal pesiar mobil dengan kecepatan 30. 0.
(Dalam contoh ini, satuan kecepatan tidak masalah, bisa mil per jam, kilometer per jam, atau apapun. Satu-satunya cara adalah jika mobil di Boston atau New York City. Dalam hal ini, kecepatan untuk KUNING harus jauh lebih tinggi daripada kecepatan GREEN, dan kecepatan untuk RED tidak boleh 0. 0.)
Untuk membuat tes JUnit untuk Driver class, ikuti langkah 1 sampai 9 yang tertera sebelumnya di artikel ini, tapi pastikan untuk melakukan perubahan berikut:
Pada Langkah 2, klik kanan atau kontrol-klik Driver. cabang java bukan TrafficLight. cabang java
Pada Langkah 5, beri tanda cek di bagian Driver.
Pada Langkah 8, hapus metode gagal untuk membuat kelas DriverTest yang ditunjukkan pada Listing 6. (Kode yang Anda ketikkan ditampilkan dalam huruf tebal.)
Listing 6
import static org. junit Menegaskan. *; impor org. junit Uji; kelas publik DriverTest {@Test public void testVelocity () { TrafficLight light = new TrafficLight (); cahaya perubahan (7); Driver driver = driver baru (); assertEquals (30.0, kecepatan pengemudi (cahaya), 0. 1); }}Jika semuanya berjalan lancar, tes JUnit lewat dengan warna terbang. (Untuk lebih tepatnya, JUnit lolos dengan warna hijau!) Jadi, jalannya DriverTest bukanlah hal baru atau menarik. Yang menarik adalah panggilan untuk memastikan Listing di Daftar 6.
Bila Anda membandingkan dua nilai ganda dalam program Java, Anda tidak berhak mengharapkan persamaan di-hidung. Artinya, salah satu dari nilai ganda mungkin 30. 000000000 sedangkan nilai ganda lainnya mendekati 30. 000000001. Komputer hanya memiliki 64 bit untuk menyimpan setiap nilai ganda, dan ketidakakuratan merayap di sana sini. Jadi di JUnit, metode assertEquals untuk membandingkan nilai ganda memiliki parameter ketiga. Parameter ketiga mewakili ruang gerak.
Pada Listing 6, pernyataan
assertEquals (30.0, kecepatan driver (lampu), 0. 1);mengatakan hal berikut: "Tegaskan bahwa nilai sebenarnya dari driver. kecepatan (cahaya) berada di dalam 0. 1 dari nilai yang diharapkan 30. 0. Jika demikian, asersi tersebut lewat. Jika tidak, pernyataan tersebut gagal. "
Bila Anda memanggil assertEquals untuk nilai ganda, memilih margin kesalahan yang baik bisa menjadi rumit.Angka-angka ini menggambarkan hal-hal yang bisa salah.
Di sini, margin of error Anda terlalu kecil.
Di sana, margin of error Anda terlalu besar.
Untungnya, dalam contoh DriverTest ini, margin 0. 1 adalah taruhan yang sangat aman. Inilah alasannya:
Saat tes assertEquals gagal, gagal lebih dari 0. 1.
Kegagalan berarti memiliki supir. nilai kecepatan (cahaya) seperti 0. 0 atau 10. 0.
Dalam contoh ini, saat uji coba assertEquals lolos, ini mungkin merupakan persamaan menyeluruh on-the-nose.
Nilai pengemudi. kecepatan (cahaya) datang langsung dari kode 30. 0 pada Listing 5. Tidak ada aritmatika yang terlibat. Jadi nilai pengemudi. kecepatan (cahaya) dan nilai 30. 0 yang diharapkan harus sama persis (atau hampir sama).