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 Account.java 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 junit.framework.TestCase • Untuk dapat menggunakan semua fungsi yang ada dalam package JUnit, kita harus meng-import junit.framework.* pada tiap test class yang akan kita tulis. import junit.framework.*; public class TestAccount extends TestCase { ... } Friday, October 17, 2008
Fixtures public void testTotalBelanja() { Pembayaran pmb = new Pembayaran(); assertEquals(3000,pmb.TotalBelanja(new int[] {1000,2000})); } public void testBelanjaNull() { Pembayaran pmb = new Pembayaran(); assertEquals(0,pmb.TotalBelanja(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(pmb.isCreated()); } public class testTotalBelanja() { assertEquals(3000,pmb.TotalBelanja(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”); dbConn.Connect(); } protected void tearDown() { dbConn.disconnect(); 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,lrg.largest(new int[] {-7,-8,9})); } public static Test suite() { TestSuite suite=new TestSuite(); suite.addTest(new TestLargest("testSimple")); suite.addTest(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], java.lang.Object 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 : • junit.textui.TestRunner Berbasis text • junit.awtui.TestRunner Menggunakan tampilan Abstract Window Toolkit (AWT) yang sederhana • junit.swingui.TestRunner Menggunakan tampilan berbasis SWING dengan fitur yang cukup lengkap Friday, October 17, 2008