Menggunakan JUnit di Netbeans

Intinya, JUnit merupakan framework buat nge-tes sebuah kode. Gitu… Ada banyak definisi testing yang di-handle sama framework ini, dan itu gak gw tulisin di mari coz ini jugak tulisan repost… hihihihi :p

Okeh, langsung mulai… Buat sebuah kelas kayak gini:

public class Kalkulator {
    public int bagi(int x, int y){
        return 0;
    }
    public void tampil(String x){
        int hasil = Integer.valueOf(x) + 5;
        System.out.println("Hasil: "+hasil);
    }
}

Sekarang… yang kita lakukan adalah bertanya2… gimana cara nge-tes aplikasi itu udah jalan benar atau enggak… Yooo-a! Cara gampang, tinggal bikin Main kayak yang di bawan ini… Kalo hasilnya benar, berarti benar… kalo salah yaaa.. salah!

public class Main {
    public static void main(String[] args) {
        Kalkulator k = new Kalkulator();
        int x = k.bagi(4, 2);
        System.out.println("4 /2 = "+x);
    }
}

Dan ternyataaaa…

1. Hasil Salah

HASILNYA SALAH!!!

Dan, salahnya dimana??? Tinggal liat ajah fungsi di kelas lain… fungsi “bagi” itu. Ternyata kesalahannya, yang di-return tetap ajah angka 0. Gak ngaruh input atau output. Dan kayaknya, kalo nyoba beberapa kemungkinan lain, bisa jadi ada salah jugak… contohnya kalo Main-nya gini:

public class Main {
    public static void main(String[] args) {
        Kalkulator k = new Kalkulator();
        int x = k.bagi(4, 0);
        System.out.println("4 /0 = "+x);
    }
}

Dan gw udah ubah class-nya jadi gini:

public class Kalkulator {
    public int bagi(int x, int y){
        return x/y;
    }
    public void tampil(String x){
        int hasil = Integer.valueOf(x) + 5;
        System.out.println("Hasil: "+hasil);
    }
}

Hasilnya….

2. Exception

EXCEPTION!!

Yah, gak ngaruh c ya… itu error exception… beda penangan emang.

Intinya, kita butuh semua scenario pengujian dari pembagian. Itu masih pembagian, belum masalah casting kayak yang di method lain. Gimana coba kalo ternyata dia harus casting huruf yang non-angka?!

Itulah gunanya JUnit… sebuah framework untuk menangani setiap kasus dari sebuah class… Kira2 gitu… tapi gw jugak gak tau ding. Gw kan repost ceritanya… :p Tapi kalo yang gw tangkep c, kalo mau testing, gak usah jalanin keseluruhan aplikasi… cukup dengan jalanin kasus unit-nya ajah… Dan ingat, ini entah benar entah enggak… coz dari gw c… 😀

Jadi, untuk JUnit, bisa dibikin class kayak gini:

import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import static org.junit.Assert.*;

public class KalkulatorTest {
    
    public KalkulatorTest() {
    }
    
    @BeforeClass
    public static void setUpClass() {
    }
    
    @AfterClass
    public static void tearDownClass() {
    }
    
    @Before
    public void setUp() {
    }
    
    @After
    public void tearDown() {
    }

    /**
     * Test of bagi method, of class Kalkulator.
     */
    @Test
    public void testBagi() {
        System.out.println("bagi");
        int x = 0;
        int y = 0;
        Kalkulator instance = new Kalkulator();
        int expResult = x/y;
        int result = instance.bagi(x, y);
        assertEquals(expResult, result); 
    }

    /**
     * Test of tampil method, of class Kalkulator.
     */
    @Test
    public void testTampil() {
        System.out.println("tampil");
        String x = "";
        Kalkulator instance = new Kalkulator();
        instance.tampil(x);
    }
    
}

Penjelasan dari beberapa hal di atas:

  • @Test: anotasi buat mengidentifikasi test method
  • @Before: menyatakan method yang dieksekusi sebelum test dilakukan. Jadi kayak tahap preparation gitu…
  • @After: ini kebalikan dari @Before… method yang dieksekusi seabis test. Gunanya biasanya buat cleanup the test environment (contoh, hapus temporary data, restore defaults dll).
  • @BeforeClass: method ini dieksekusi sekali, sebelum test dimulai. Contoh kegunaannya yaitu buat konekin database.
  • @AfterClass: method kebalikan dari @BeforeClass, contoh kegunaan… buat diskonek!

Apapun yang gw tulis di atas, hasil translate dari situs ini… Hihihi… :p

Balik lagi, Kelas “KalkulatorTest” di atas, bisa di-run jugak layaknya class biasa. Dan, hasilnya adalah performa dari kelas awal yang gw bikin, class “Kalkulator”. Gini nih hasilnya:

3. JUnit

Dan kalo di-breakdown, hasilnya ternyata ada 2 method yang berkemungkinan error:

4. JUnit Break

Dengan kata lain, gak ada 1 method pun yang bener yang gw bikin… keduanya berkemungkinan error (dari kasus 0 dan string kosong)…  Dan ini terkait sama Jadi gimana cara gw harus nanganin ini?! Bisa ngasi trycatch c yah…

public class Kalkulator {
    public int bagi(int x, int y){
        int hasil = 0;
        try {
            hasil = x/y;
        } catch (ArithmeticException e) {
            System.out.println(e.getMessage());
        }
        return hasil;
    }
    public void tampil(String x){
        int hasil = Integer.valueOf(x) + 5;
        System.out.println("Hasil: "+hasil);
    }
}

Dan ini, gak bakal ngaruh ke apapun… coz kasus uji gw masih pake angka 0… ketika gw run lagi (class KalkulatorTest-nya… dan ini gak gw ubah), hasilnya gak berubah:

5. Error JUnit

Gitu…. Tapi at least, udah tau bakal ada kemungkinan error.

Jadi walo secara compile berhasil, tapi kasus pengujian bisa jadi ada error. Dan, kalo mau lebih spesifik lagi… gw bisa ubah kode-nya per-kasus yang gw punya…

Jadi gw ubah kasus uji-nya:

package coba.uji;

import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import static org.junit.Assert.*;

public class KalkulatorTest {
    
    public KalkulatorTest() {
    }
    
    @BeforeClass
    public static void setUpClass() {
    }
    
    @AfterClass
    public static void tearDownClass() {
    }
    
    @Before
    public void setUp() {
    }
    
    @After
    public void tearDown() {
    }

    /**
     * Test of bagi method, of class Kalkulator.
     */
    @Test
    public void testBagi() {
        System.out.println("bagi");
        int x = 4;
        int y = 2;
        Kalkulator instance = new Kalkulator();
        int expResult = x/y;
        int result = instance.bagi(x, y);
        assertEquals(expResult, result);
        
    }

    /**
     * Test of tampil method, of class Kalkulator.
     */
    @Test
    public void testTampil() {
        System.out.println("tampil");
        String x = "6";
        Kalkulator instance = new Kalkulator();
        instance.tampil(x);
        
    }
    
}

Hasilnya:

6. JUnit Success

Dan sekarang… kasusnya, gw salah kode… Contohnya, gw punya “Kalkulator” gini:

public class Kalkulator {
    public int bagi(int x, int y){
        int hasil = 0;
        try {
            hasil = x*y;
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
        return hasil;
    }
    public void tampil(String x){
        int hasil = Integer.valueOf(x) + 5;
        System.out.println("Hasil: "+hasil);
    }
}

Dan diuji pake kasus yang sama, hasilnya:

7. JUnit Warning

Lihat kan yah… ada yang salah di sana… Ada warning-nya… hasilnya gak sesuai! Harapannya hasil yang jadi output itu, 2… tapi malah keluar 8… itu kan gak sesuai… Jadi pasti ada yang salah ama kodenya.

Begitulah… itulah gunanya JUnit Testing… menge-tes suatu system dari unit2-nya… Jadi gak perlu jalanin setiap test-case dengan ngejalanin system secara keseluruhan. Dan satu lagi, kelebihan JUnit, test-nya punya file yang berbeda. Jadi kita nge-test tanpa ngotak-ngatik file yang kita tes. Kita bikin scenario dari test case kita sendiri…

O iya, kalo mau gampang, test case ini bisa di-generate kalo pake IDE semacam Netbeans (Eclipse gw gak tau)… Caranya, di kelas yang kita mau bikin JUnit-nya, pilih “Tools” –> “Create/Update Test”.

8. Create Tst

Nanti muncul pop-up, bisa kamu atur apa yang kamu mau di sana. Kalo udah, tinggal OK trus apusin method “failed()” atau kalo gak mau apus, bisa kasi komentar… Dan hasil yang kamu dapatin tinggal kamu sesuaiin ama kasus uji yang kamu mau.

Selesai…

PS: buat kamu yang make XP (eXtreme Programming), test case ini dibikin dulu baru dikodein… Jadi tipe generate dari netbeans mungkin gak cocok buat kamu… Coz gw gak tau ada mekanisme generate class dari test class. Yang nemu, kasi tau yak…

Sumber:

http://agung-setiawan.com/java-testing-aplikasi-menggunakan-junit/
http://www.vogella.com/tutorials/JUnit/article.html
http://kikiahmadi.com/2008/08/27/simple-unit-test-with-netbeans-61-and-junit/

Leave a comment