Unit Testing
Introduction
Friday, October 17, 2008
What is Unit Testing?
• Unit Testing adalah sebuah kode yang
ditulis oleh developer, yang digunakan
untuk menguji bagian kecil/area
spesifik dari suatu fungsionalitas dari
kode yang akan ditest.
• Unit testing dilakukan untuk
membuktikan apakah kode yang telah
ditulis berfungsi sesuai dengan
kehendak programmer.
Friday, October 17, 2008
Why Unit Testing?
Secara implisit, unit testing akan
membuat hidup seorang programmer
menjadi lebih “mudah”.
Kenapa?
Friday, October 17, 2008
Why Unit
Testing?(continued)
• Unit testing akan memperbaiki design code dan
mengurangi waktu yang digunakan untuk debugging
secara drastis.
• Building house of cards, adalah perumpamaan yang
tepat untuk menggambarkan proses coding tanpa
testing. Karena bila pondasi/dasar dari bangunan
tersebut labil, maka bagian-bagian yang dibangun
diatasnya juga akan terpengaruh dan akhirnya runtuh.
• Perubahan kecil pada suatu modul/unit akan
merambat hingga ke level yang lebih tinggi, yang
tentunya juga membutuhkan perbaikan. Oleh karena
itu, perubahan pada level dasar harus ditest sebelum
mempengaruhi level yg lebih tinggi.
Friday, October 17, 2008
Who performs Unit
Testing?
• Unit testing dilakukan oleh programmer
yang menuliskan suatu modul/unit
tertentu.
• Test code tidak akan dikirimkan ke
user, jadi hanya production code (kode
yang digunakan dalam program utama)
yang di-deliver ke user.
Friday, October 17, 2008
When to test a unit?
• Unit testing dilakukan setelah
programmer selesai menuliskan suatu
kode/fungsi/method yang ada dalam
suatu class.
• Dapat juga dilakukan setelah
menambahkan sebuah fungsionalitas
baru atau setelah melakukan
refactoring.
Friday, October 17, 2008
How?
Unit testing membutuhkan suatu tools yang spesifik
untuk tiap-tiap bahasa pemrograman. Dan tools
tersebut terpisah dengan bahasa pemrograman.
Beberapa contoh tools yang digunakan pada unit
testing :
• CUnit : digunakan untuk bahasa C
• JUnit : digunakan untuk bahasa Java
• VBUnit : digunakan untuk bahasa Basic
• NUnit : digunakan untuk bahasa C# (baca: c-sharp)
• PHPUnit : digunakan untuk bahasa PHP
Friday, October 17, 2008
Unit Testing with JUnit
Friday, October 17, 2008
Unit Testing with JUnit
• Seperti yang telah disebutkan sebelumnya,
unit testing menggunakan sebuah kelas (test
class) yang akan menguji kelas lain.
• Sebuah test class hanya akan menguji satu
class saja.
• Dalam sebuah test class terdapat beberapa
test method yang digunakan untuk menguji
method-method pada kelas lain. Sebuah
method dapat diuji oleh lebih dari satu test
method.
Friday, October 17, 2008
Unit Testing with JUnit
• Pada contoh diatas, sebuah method createAccount() pada class
[Link] diuji oleh 3 buah test method.
• Perlu diperhatikan, diantara ketiga test method menguji
beberapa kemungkinan yang akan menyebabkan method
createAccount() melakukan kesalahan. Sebagai contoh, method
testCreateAcctDup() akan menguji apakah yang akan terjadi
bila method createAccount() menemui error bila terjadi
duplikasi dalam membuat account.
Friday, October 17, 2008
Naming convention
Dalam unit testing, terdapat beberapa aturan penamaan
yang harus diikuti. Sebuah test class harus memiliki
nama yang sama dengan class yang akan di-test dan
diberi prefix “test”.
Contoh:
Sebuah class Account akan memiliki sebuah test class
dengan nama TestAccount.
Penamaan tersebut dimaksudkan untuk mempermudah
dalam mengorganisasi unit testing.
Friday, October 17, 2008
Naming convention
• Berbeda dengan penamaan test class, sebuah test
method “harus” didahului dengan prefix “test”,
kemudian diikuti oleh classname, sesuai dengan
nama class yang akan di-test
• Bila test method tidak menggunakan prefix test,
maka method tersebut tidak akan dieksekusi oleh
JUnit.
• Cara lainnya adalah dengan menggunakan test suite
dan memasukkan test method tersebut ke dalam test
suite. Dengan demikian, JUnit akan tetap
mengeksekusi method tersebut meskipun nama
method tersebut tidak menggandung kata “test”.
Friday, October 17, 2008
Test Class
• sebuah test class harus merupakan turunan
(extends) dari class [Link]
• Untuk dapat menggunakan semua fungsi
yang ada dalam package JUnit, kita harus
meng-import [Link].* pada tiap test
class yang akan kita tulis.
import [Link].*;
public class TestAccount extends TestCase {
...
}
Friday, October 17, 2008
Fixtures
public void testTotalBelanja() {
Pembayaran pmb = new Pembayaran();
assertEquals(3000,[Link](new int[]
{1000,2000})); }
public void testBelanjaNull() {
Pembayaran pmb = new Pembayaran();
assertEquals(0,[Link](new int[] {}));
}
• Pada contoh diatas terlihat duplikasi code instansiasi objek. Baris
tersebut akan kita gunakan bila kita akan membuat test method yang
akan melakukan test terhadap class, pada kasus ini class Pembayaran.
Dan pada umumnya baris tersebut (fixture) merupakan starting point
dari tiap test method.
• JUnit menyediakan fasilitas untuk meng-ekstrak fixture tersebut ke
dalam sebuah method yang bernama setUp()
Friday, October 17, 2008
Fixtures (cont)
private Pembayaran pmb;
protected void setUp() {
Pembayaran pmb = new Pembayaran();
}
public class testUseCredit() {
assertEquals([Link]());
}
public class testTotalBelanja() {
assertEquals(3000,[Link](new int[] {1000,2000}));
}
• Dengan menggunakan method setUp(), kita tidak perlu lagi
melakukan instansiasi objek di setiap test method.
• Penggunaan method setUp() ini memastikan bahwa perubahan
terhadap objek yang terdapat dalam fixture yang disebabkan
oleh salah satu test case tidak mempengaruhi test case lainnya
Friday, October 17, 2008
Fixtures (cont)
JUnit juga menyediakan method tearDown( ),
yang berfungsi untuk membersihkan test
environment setelah melakukan sebuah test.
Perhatikan contoh dibawah ini.
protected void setUp() {
dbConn = new
Connection(“oracle”,1521,”fred”,”foobar”);
[Link]();
}
protected void tearDown() {
[Link]();
dbConn = null;
}
Friday, October 17, 2008
Test Suite
• Test Runner yang digunakan mempunyai
fitur untuk mencari sekumpulan test case
dalam suatu test class. Agar fitur tersebut
dapat berfungsi, kita harus mendefinisikan
method TestSuite( ), yang mengembalikan
instance TestCase atau TestSuite. Keduanya
merupakan implementasi dari interface class
Test
• Test Suite juga dapat digunakan untuk
mengeksekusi test method, dimana nama test
method tersebut tidak menggunakan kata
“test”
Friday, October 17, 2008
Test Suite
...
public void Negative(){
assertEquals(-7,[Link](new int[] {-7,-8,-
9})); }
public static Test suite() {
TestSuite suite=new TestSuite();
[Link](new TestLargest("testSimple"));
[Link](new TestLargest("Negative"));
return suite;
}
...
Friday, October 17, 2008
Method Assert
Method assert adalah suatu method yang
akan membantu dalam menentukan
sebuah method yang sedang ditest/diuji
berjalan dengan baik atau tidak. Bila
sebuah method mengalami kegagalan,
eksekusi dari test method tersebut akan
dibatalkan sedangkan test untuk method
yang lainnya akan tetap berjalan.
Friday, October 17, 2008
Method Assert
assertEquals
assertEquals([String message], expected, actual)
assertNull
assertNull([String message], [Link]
object)
assertTrue
assertTrue([String message], boolean condition)
Friday, October 17, 2008
Method Assert
• Perlu diingat bahwa method assert
dapat langsung mengeksekusi method
dengan nilai balikan (fungsi)
• Sedangkan untuk menguji sebuah
prosedur (void), kita harus melakukan
perubahan dalam baris yang ada dalam
test method tersebut.
Friday, October 17, 2008
Test Runner
JUnit menyediakan 3 buah class user interface yang
dapat digunakan untuk melakukan unit testing, yaitu :
• [Link]
Berbasis text
• [Link]
Menggunakan tampilan Abstract Window Toolkit
(AWT) yang sederhana
• [Link]
Menggunakan tampilan berbasis SWING dengan fitur
yang cukup lengkap
Friday, October 17, 2008