Saturday, July 23, 2011

Symfony 1.2 : Unit Testing

Unit Testing dapat di analogikan aktifitas berolahraga, Kita tahu kalau hal tersebut adalah baik dan akan terlihat hasilnya setelah dilakukan secara rutin dan beberapa lama kemudian, tetapi pada kenyataan kita sering malas melakukan hal tersebut.



Unit Testing untuk memeriksa bahwa kode program yang ditulis telah memberikan output yang benar berdasarkan Inputan yang diberikan.

Para developer memahami dalam membuat sebuah software yang kualitasnya terjaga diperlukan pengujian yang baik. Menulis Sekenario testing, menjalankan testing dan menganalisa hasilnya adalah perkerjaaan yang membosankan dalam proses development software.

Selain itu pengembangan sebuah software biasanya cenderung berubah terus menerus mengikuti spesifikasi kebutuhan dan ketika mengerjakan perubahan tersebut akan berpotensi untuk membuat error atau bug yang baru.

Karena persoalan tersebut maka sangat disarankan untuk membuat Unit Testing untuk menjamin bahwa aplikasi telah berjalan sesuai dengan yang diharapakan dengan segala perubahan yang terjadi.

Untuk menyingkat waktu dalam menjalankan Unit Testing pada proses development software maka perlu dilakukan oleh mesin secara otomatis atau yang bisa disebut dengan Automatic Testing.

Automatic Testing adalah pengujian yang biasa dilakukan oleh manusia secara manual yang kemudian diganti oleh mesin, Hal tersebut untuk menyingkat waktu dalam proses pengujian pada proses development software.

Beberapa Manfaat Automatic Testing adalah sebagai berikut.
  • Untuk melakukan pengujian secara otomatis bahwa seluruh bagian aplikasi tidak ada error ketikan dideploy/dipasang pada sebuah mesin/pc/komputer yang baru.
  • Untuk melakukan pengujian secara otomatis bahwa seluruh bagian aplikasi tidak ada error ketika terjadi perubahan kode program pada suatu bagian aplikasi yang lain.

Berikut ini adalah contoh dari konsep unit testing

*1*. Terdapat sebuah kelas yang memiliki tanggung jawab sebagai kelas perhitungan matematika dasar yang bernama kalkulator, yang didalam nya terdapat metod untuk melakukan operasi penambahan dan operasi pengurangan seperti yang ditunjukan pada script dibawah ini.
<?php
class kalkulator
{
    public function tambah($n1, $n2)
    {
        return $n1 + $n2;
    }

    public function kurang($n1, $n2)
    {
        return $n1 - $n2;
    }
}
?>
Sebagai contoh class tersebut disimpan dengan file bernama kalkulator.php

*2*. Kemudian dilakukan Unit Testing pada seluruh metod yang terdapat pada kelas kalkulator, dengan cara memberikan berbagai inputan pada metod tersebut dan melihat output yang diberikan oleh metod tersebut, apabila output yang dihasilkan metod sesuai dengan harapan maka metod tersebut telah berfungsi dengan baik.

Seperti yang di tunjukan dengan sekenario unit testing sederhana dibawah ini.
<?php
include 'kalkulator.php';

$r[0] = array('nama'=>'Metod Tambah : Skenario 1, ', 'hasil' => '');
$r[1] = array('nama'=>'Metod Tambah : Skenario 2, ', 'hasil' => '');
$r[2] = array('nama'=>'Metod Kurang : Skenario 1, ', 'hasil' => '');
$r[3] = array('nama'=>'Metod Kurang : Skenario 2, ', 'hasil' => '');

$o = new kalkulator();

$r[0]['hasil'] = ($o->tambah( 1,3) == 4 ) ? 'Berhasil' : 'Gagal';
$r[1]['hasil'] = ($o->tambah(-2,3) == 1 ) ? 'Berhasil' : 'Gagal';
$r[2]['hasil'] = ($o->kurang( 3,1) == 2 ) ? 'Berhasil' : 'Gagal';
$r[3]['hasil'] = ($o->kurang(-5,3) == -8) ? 'Berhasil' : 'Gagal';


foreach($r as $val) {
 echo $val['nama'].$val['hasil']."\n"; 
}

?>
Kemudian simpan kode program unit testing diatas dengan nama kalkulatorTest.php

*3*. Ketika skenario unit testing di atas dijalankan pada command line akan menampilkan hasil seperti dibawah ini.
php kalkulatorTest.php
Metod Tambah : Skenario 1, Berhasil
Metod Tambah : Skenario 2, Berhasil
Metod Kurang : Skenario 1, Berhasil
Metod Kurang : Skenario 2, Berhasil

Framework Symfony Versi 1.2 - Unit Testing

Pada Framework Symfony Versi 1.2 telah dilengkapi secara build up dengan fitur Unit Testing, Berikut ini adalah contoh melakukan unit testing pada Symfony Framework Versi 1.2. 

Sebelumnya diasumsikan telah mengenal cara instalasi dan membuat aplikasi serta module pada symfony framework 1.2 -> Symfony Instalasi

*1*. Sebagai contoh akan dibuat dua kelas yang memiliki tanggung jawab sebagai perhitungan matematika dasar dan untuk menghitung luas sebuah bangunan.

a. Membuat Kelas Hitung untuk melakukan perhitungan dasar matematika
<?php
class hitung
{
    public function tambah($n1, $n2)
    {
        return $n1 + $n2;
    }

    public function kurang($n1, $n2)
    {
        return $n1 - $n2;
    }
}
?>
Kemudian simpan class tersebut dengan file bernama hitung.php

b. Membuat Kelas Hitung Luas untuk menghitung luas bangunan
<?php
class hitungLuas
{
    public function luasPersegi($panjang, $lebar)
    {
        return $panjang * $lebar;
    }

    public function luasLingkaran($jari2)
    {
        return 3.14 * ($jari2 * $jari2);
    }
}
?>
Kemudian simpan class tersebut dengan file bernama hitungLuas.php

*2*. Sebagai contoh simpan kedua kelas tersebut di direktori lib, seperti yang ditunjukan pada gambar dibawah ini.














*3*. Membuat skenario testing menggunakan fitur unit testing Symfony 1.2.

Buatlah file testing untuk kelas hitung dengan nama hitungTest.php dan kelas hitungLuas dengan nama hitungLuasTest.php di direktori test/unit seperti yang ditunjukan pada gambar dibawah ini.














*4*. Pada file hitungTest.php tuliskan skenario testing untuk kelas hitung seperti yang ditunjukan dibawah ini.
<?php
include(dirname(__FILE__).'/../bootstrap/unit.php');
include(dirname(__FILE__).'/../../lib/hitung.php');

$o = new hitung();
$t = new lime_test(2, new lime_output_color());
$t->is($o->tambah(3,2),5,'Test Metod tambah - Apabila menghasilkan angka 5 artinya testing OK');
$t->is($o->kurang(3,2),1,'Test Metod kurang - Apabila menghasilkan angka 1 artinya testing OK');
?>
Berikut ini adalah penjelasan dari script diatas


* Mengartikan memanggil lib symfony untuk melakukan unit testing
include(dirname(__FILE__).'/../bootstrap/unit.php');
* Mengartikan memanggil kelas hitung yang tersimpan pada file bernama hitung.php
include(dirname(__FILE__).'/../../lib/hitung.php');
* Mengartikan membuat objek hitung dari kelas hitung
$o = new hitung();
* Mengartikan membuat objek testing yang merupakan engine untuk melakukan unit testing
$t = new lime_test(2, new lime_output_color());
* Mengartikan proses testing yang dilakukan pada metod tambah dan metod kurang dari class hitung
$t->is($o->tambah(3,2),5,'Test Metod tambah - Apabila menghasilkan angka 5 artinya testing OK'); $t->is($o->kurang(3,2),1,'Test Metod kurang - Apabila menghasilkan angka 1 artinya testing OK');

Berikut ini cara menjalankan unit testing di console
php symfony test:unit hitung
Maka akan menghasil informasi dilayar seperti ini
1..1
ok 1 - Test Metod tambah - Apabila menghasilkan angka 5 artinya testing OK
ok 2 - Test Metod kurang - Apabila menghasilkan angka 1 artinya testing OK

*5*. Pada file hitungLuasTest.php tuliskan skenario testing untuk kelas hitungLuas seperti yang ditunjukan dibawah ini.
<?php
include(dirname(__FILE__).'/../bootstrap/unit.php');
include(dirname(__FILE__).'/../../lib/hitungLuas.php');

$o = new hitungLuas(); 
$t = new lime_test(2, new lime_output_color());
$t->is($o->luasPersegi(4,5),20,'Test Metod luas persegi - Apabila menghasilkan angka 20 artinya testing OK');
$t->is($o->luasLingkaran(3),28.26,'Test Metod luas lingkaran - Apabila menghasilkan angka 28.26 artinya testing OK');
?>
Berikut ini cara menjalakan unit testing console
php symfony test:unit hitungLuas
Maka akan menghasil informasi dilayar seperti ini.
1..2
ok 1 - Test Metod luas persegi - Apabila menghasilkan angka 20 artinya testing OK
ok 2 - Test Metod luas lingkaran - Apabila menghasilkan angka 28.26 artinya testing OK

*6*. Untuk menjalankan seluruh testing dapat menggunakan cara seperti dibawah ini.
php symfony test:unit
hitungLuasTest.......................................................ok
hitungTest...........................................................ok
 All tests successful.                                                 
 Files=2, Tests=4

*7*. Apabila terjadi error dari proses unit testing maka akan tampil seperti ini.
hitungLuasTest.......................................................not ok
    Failed tests: 1
hitungTest...........................................................ok

Failed Test                     Stat  Total   Fail  List of Failed
------------------------------------------------------------------
hitungLuasTest                     0      2      1  1

Failed 1/2 test scripts, 50.00% okay. 1/4 subtests failed, 75.00% okay.
Report tersebut menunjukan terjadi error pada unit testing di hitungLuasTest.

Untuk mengetahui detail dari error tersebut dapat menggunakan cara seperti dibawah ini.
php symfony test:unit hitungLuas
Maka akan menghasilkan informasi seperti dibawah ini.
not ok 1 - Test Metod luas persegi - Apabila menghasilkan angka 20 artinya testing OK
#     Failed test (./test/unit/hitungLuasTest.php at line 8)
#            got: 0
#       expected: 20
Pada gambar di atas menunjukan bahwa output benar yang diharapkan adalah 20 berdasarkan inputan yang diberikan tetapi yang dapatkan adalah 0. 

Hal tersebut mengartikan tarjadi kesalahan pada kode program dari metod yang di testing.


*8*. Dalam sebuah testing yang berkaitan dengan proses database seperti input data, update data dan hapus data maka diperlukan sebuah enviroment testing agar database yang digunakan testing adalah khusus untuk aktivitas testing.

Berikut ini adalah contoh cara menambahkan enviroment dalam unit testing.
<?php
$configuration = ProjectConfiguration::getApplicationConfiguration('frontend', 'test', true);
sfContext::createInstance($configuration);
new sfContext($configuration);

include(dirname(__FILE__).'/../bootstrap/unit.php');
include(dirname(__FILE__).'/../../lib/hitungLuas.php');

$o = new hitungLuas(); 
$t = new lime_test(2, new lime_output_color());
$t->is($o->luasPersegi(4,5),20,'Test Metod luas persegi - Apabila menghasilkan angka 20 artinya testing OK');
$t->is($o->luasLingkaran(3),28.26,'Test Metod luas lingkaran - Apabila menghasilkan angka 28.26 artinya testing OK');
?>
Baris kode yang penting diatas adalah sebagai berikut
$configuration = ProjectConfiguration::getApplicationConfiguration('frontend', 'test', true);
sfContext::createInstance($configuration);
new sfContext($configuration);
Perintah diatas mengartikan mengartikan menggunakan aplikasi bernama frontend dengan enviroment test.


Berikut ini daftar method yang dapat digunakan dalam melakukan unit testing di symfony 1.2

Method Description
diag($msg)Outputs a comment but runs no test
ok($test, $msg)Tests a condition and passes if it is true
is($value1, $value2, $msg)Compares two values and passes if they are equal (==)
isnt($value1, $value2, $msg)Compares two values and passes if they are not equal
like($string, $regexp, $msg)Tests a string against a regular expression
unlike($string, $regexp, $msg)Checks that a string doesn't match a regular expression
cmp_ok($value1, $operator, $value2, $msg)Compares two arguments with an operator
isa_ok($variable, $type, $msg)Checks the type of an argument
isa_ok($object, $class, $msg)Checks the class of an object
can_ok($object, $method, $msg)Checks the availability of a method for an object or a class
is_deeply($array1, $array2, $msg)Checks that two arrays have the same values
include_ok($file, $msg)Validates that a file exists and that it is properly included
fail()Always fails--useful for testing exceptions
pass()Always passes--useful for testing exceptions
skip($msg, $nb_tests)Counts as $nb_tests tests--useful for conditional tests
todo()Counts as a test--useful for tests yet to be written

1 comment: