Testing PHPUnit
Testing PHPUnit
PENJUALAN
(WHITE BOX TESTING MENGGUNAKAN PHPUNIT)
TUGAS TESTING DAN IMPLEMENTASI SISTEM
Oleh:
1.
PHPUnit
PHPUnit adalah sebuah programmer-oriented testing framework untuk bahasa
pemrograman php, merupakan bagian dari xUnit untuk unit testing framework di
buat oleh Sebastian Bergmann5 , official web untuk PHPUnit adalah
http://phpunit.de/, versi terbaru adalah phpunit 5.1.3 untuk versi stable dan phpunit
5.2 untuk versi beta
Untuk installasi PHPUnit cukup mudah, ada banyak cara yang bisa dilakukan,
bisa melalui phar, pear atau composer. Disini hanya akan di jelaskan bagaimana
instalasi PHPunit di lwindows menggunakan composer
1.1
Installasi PHPUnit
Download dan install composer di https://getcomposer.org/Composer-
Setup.exe , lalu jalankan. Installer ototmasi merupakan versi composer yang paling
terbaru dan setelah kita selesei install secara otomastis pula sudah men-set PATH ,
sehingga bisa memanggil composer dari setiap direktori komputer menggunakan
command line .
Setelah selesei install , jalankan command seperti gambar di bawah ini untuk
memastikan phpunit sudah bisa kita gunakan. Apabila keluaran dari command yang
diketikan tidak seperti gambar di bawah ini , tutup command line , lalu buka lagi
command line yang baru dan ketikan command yang sama
2.
Menjalankan Testing
Di sini kita akan menjalankan testing dari fungsi validasi untuk inputan
sebuah form barang , dimana inputannya tidak boleh minus(-) dan harus merupakan
angka.
2.1
Di class ini diletakkan juga skenario yang akan di pakai, sebagai berikut :
Inputan angka (lebih dari 0) -> getStok() (diharapkan:ok)
Inputan minus (kurang dari 0) -> getPesan() (diharapkan:ok)
Inputan huruf
A. Skenario :
Inputan angka (lebih dari 0) -> getStok() (diharapkan:ok)
Inputan minus (kurang dari 0) -> getStok() (diharapkan:nok)
Inputan huruf
<?php
include 'stok.php';
class stoktes extends PHPUnit_Framework_TestCase{
}
public function testStokHuruf(){
$this->objStok->inputStok('Lima');
$stok = $this->objStok->getStok();
$this->assertEquals('Lima',$stok);
}
}
?>
B. Skenario :
Inputan angka (lebih dari 0) -> getPesan() (diharapkan:nok)
Inputan minus (kurang dari 0) -> getPesan() (diharapkan:ok)
Inputan huruf
<?php
include 'stok.php';
class stoktes extends PHPUnit_Framework_TestCase{
}
?>
C. Skenario :
Inputan angka (lebih dari 0) -> getStok() (diharapkan:ok)
Inputan minus (kurang dari 0) -> getPesan() (diharapkan:ok)
Inputan huruf
<?php
include 'stok.php';
class stoktes extends PHPUnit_Framework_TestCase{
public function setUp(){
$this->objStok = new stok();
}
public function testBerhasilInputStok(){
$this->objStok->inputStok(5);
$stok = $this->objStok->getStok();
$this->assertEquals(5,$stok);
}
public function testStokMinus(){
$this->objStok->inputStok(-5);
$pesan = $this->objStok->getPesan();
$this->assertEquals('Inputan Stok Salah',$pesan);
}
public function testStokHuruf(){
$this->objStok->inputStok('Lima');
$pesan = $this->objStok->getPesan();
$this->assertEquals('Inputan Stok Salah',$pesan);
}
}
?>
Kita kita simpan dengan nama stoktes.php dan harus satu direktori dengan file
stok.php yang sudah kita buat sebelumnya tadi.
2.2
B. Skenario :
Inputan angka (lebih dari 0) -> getPesan (diharapkan:nok)
Inputan minus (kurang dari 0) -> getPesan (diharapkan:ok)
Inputan huruf
C. Skenario :
Inputan angka (lebih dari 0) -> getStok (diharapkan:ok)
Inputan minus (kurang dari 0) -> getPesan (diharapkan:ok)
Inputan huruf
2.3
A.
Class Barang
<?php
class Barang {
/**
* Nama barang
*
* @var string
*/
public $nama;
/**
* Harga barang
*
* @var double
*/
public $harga;
/**
*
* @param string $nama
* @param double $harga
*/
public function __construct($nama, $harga) {
$this->nama = $nama;
$this->harga = $harga;
}
}
?>
B.
Class Item
<?php
class Item {
/**
* Merujuk pada `Barang` yang diperdagangkan.
*
* @var Barang
*/
public $barang;
/**
* Jumlah yang diperdagangkan untuk `Barang` ini.
*
* @var int
*/
public $jumlah;
/**
* Harga yang disepakati untuk transaksi `Barang` ini.
*
* @var double
*/
public $harga;
/**
* Diskon untuk item ini.
*
* @var Diskon
*/
public $diskon;
/**
*
* @param Barang $barang
* @param int $jumlah
* @param double $harga
*/
public function __construct($barang, $jumlah, $harga = NULL, $diskon = NULL)
{
$this->barang = $barang;
$this->jumlah = $jumlah;
$this->harga = $harga?: $barang->harga;
$this->diskon = $diskon?: new Diskon();
}
/**
* Mengembalikan total harga untuk Item ini. Perhitungan dilakukan
* berdasarkan jumlah item * harga, kemudian dikurangi diskon.
*
* @return double
*/
public function getTotal() {
return $this->diskon->setelahDiskon($this->harga * $this->jumlah);
}
}
?>
C.
Class Diskon
<?php
class Diskon {
/**
* Sebuah array yang berisi nilai diskon untuk item ini.
* Sebuah item dapat memiliki lebih dari satu diskon, misalnya
* diskon member dan diskon promosi natal.
*
* Diskon dalam bentuk angka, misalnya 25 untuk 25%,
* 10 untuk 10% dan sebagainya.
*
* @var int[]
*/
public $arrDiskon;
/**
*
* @param int[] $arrDiskon
*/
public function __construct($arrDiskon = NULL) {
if ($arrDiskon == NULL) {
$this->arrDiskon = [];
} else if (is_array($arrDiskon)) {
$this->arrDiskon = $arrDiskon;
} else {
$this->arrDiskon = [$arrDiskon];
}
}
/**
* Menambah nilai diskon baru, misalnya 10 untuk 10% dan 25 untuk 25%.
*
* Bila nilai `diskon` berupa array, maka lebih dari satu nilai akan
* ditambahkan ke nilai diskon saat ini.
*
* @param mixed $diskon
*/
public function tambahDiskon($diskon) {
$this->arrDiskon[] = $diskon;
}
/**
* Menghitung jumlah diskon untuk sebuah harga. Sebagai contoh,
* diskon 10% untuk 100.000 akan mengembalikan nilai 10.000.
*
* @param double $harga
*/
public function jumlahDiskon($harga) {
$total = 0;
}
return $total;
}
}
?>
D.
Class Penjualan
<?php
class Penjualan {
/**
* Nomor untuk faktur penjualan ini.
*
* @var string
*/
public $nomor;
/**
* Tanggal yang terterak di faktur.
*
* @var string
*/
public $tanggal;
/**
* Array yang berisi satu atau lebih `Item` untuk faktur ini.
*
* @var Item[]
*/
public $arrItem;
/**
* Diskon untuk penjualan ini.
*
* @var Diskon
*/
public $diskon;
/**
*
* @param string $nomor
* @param date $tanggal
*/
public function __construct($nomor, $tanggal, $diskon = NULL) {
$this->nomor = $nomor;
$this->tanggal = $tanggal;
$this->arrItem = [];
$this->diskon = $diskon?: new Diskon();
}
/**
* Menambah `Item` baru untuk penjualan ini.
*
* @param Item $item
*/
public function tambahItem($item) {
$this->arrItem[] = $item;
}
/**
* Mengembalikan total untuk transaksi ini.
*
* @return double
*/
$this->assertCount(2, $penjualan->arrItem);
$this->assertEquals($barang1, $penjualan->arrItem[0]->barang);
$this->assertEquals(5, $penjualan->arrItem[0]->jumlah);
$this->assertEquals($barang2, $penjualan->arrItem[1]->barang);
$this->assertEquals(5, $penjualan->arrItem[1]->jumlah);
}
Skema 2:
2 inputan barang (barang1 = 100000 , qty = 10) , (barang2 = 200000 , qty = 20)
Total harga dengan diskon 10% , expect : 4500000 , di coba matches : 5000000
Source code :
<?php
include 'barang.php';
include 'item.php';
include 'diskon.php';
include 'penjualan.php';
class PenjualanTest extends PHPUnit_Framework_TestCase {
protected function setUp() {
parent::setUp ();
}
protected function tearDown() {
parent::tearDown ();
}
$this->assertCount(2, $penjualan->arrItem);
$this->assertEquals($barang1, $penjualan->arrItem[0]->barang);
$this->assertEquals(5, $penjualan->arrItem[0]->jumlah);
$this->assertEquals($barang2, $penjualan->arrItem[1]->barang);
$this->assertEquals(5, $penjualan->arrItem[1]->jumlah);
}
Skema 3:
2 inputan barang (barang1 = 100000 , qty = 10) , (barang2 = 200000 , qty = 20)
Di inputkan tanpa harga barang, expect : arg missing
Source code :
<?php
include 'barang.php';
include 'item.php';
include 'diskon.php';
include 'penjualan.php';
class PenjualanTest extends PHPUnit_Framework_TestCase {
protected function setUp() {
parent::setUp ();
}
protected function tearDown() {
parent::tearDown ();
}
$this->assertCount(2, $penjualan->arrItem);
$this->assertEquals($barang1, $penjualan->arrItem[0]->barang);
$this->assertEquals(5, $penjualan->arrItem[0]->jumlah);
$this->assertEquals($barang2, $penjualan->arrItem[1]->barang);
$this->assertEquals(5, $penjualan->arrItem[1]->jumlah);
}
$this->assertCount(2, $penjualan->arrItem);
$this->assertEquals($barang1, $penjualan->arrItem[0]->barang);
$this->assertEquals(5, $penjualan->arrItem[0]->jumlah);
$this->assertEquals($barang2, $penjualan->arrItem[1]->barang);
$this->assertEquals(5, $penjualan->arrItem[1]->jumlah);
}
}
}
?>
2.4
Pengujian Penjualan
Selanjutnya adalah menguji class yang sudah kita buat tadi dengan
Skema 2:
2 inputan barang (barang1 = 100000 , qty = 10) , (barang2 = 200000 , qty = 20)
Total harga dengan diskon 10% , matches : 4500000 , di coba expect : 5000000
Hasil testing :
Skema 3:
2 inputan barang (barang1 = 100000 , qty = 10) , (barang2 = 200000 , qty = 20)
Di inputkan tanpa harga barang, expect : arg missing
Hasil testing :
Skema 4:
All true excpectation
Hasil testing :
3. Kesimpulan
1)
Untuk assertions ada beberapa tipe sesuai dengan apa yang digunakan,
semisal untuk nilai yang sama maka menggunakan assertEquals, untuk cek hanya tipe
data tertentu menggunakan assertContainsOnly, untuk cek jumlah data menggunakan
assertCount, dan masih banyak jenis assertions lainnya.
3)
Data yang tidak mempunyai assertions tetap dapat dilakukan proses testing,
tetapi akan muncuk peringatan tidak ada test yang dapat dilakukan.
4)
PHPUnit menghitung waktu untuk load data yang di test dan juga memory
yang digunakan saat syntax tersebut berjalan. Jika muncul kesalahan, maka muncul
juga apa yang membuat file tersebut melakukan kesalahan. Jika benar, maka tidak
muncul satupun peringatan atau pesan kesalahan.
5)
software sudah melewati fase testing di awal, maka problem-problem yang mungkin
terjadi pasca produksi bisa di ketahui sejak awal, dan ketika terjadi perubahan maka
dapat di deteksi efffect dari perubahan tersebut sehingga tidak menimbulkan riffle
effect, keretakan software (fragile), hard code yang membuat proses development,
maintenance software menjadi rumit dan memakan waktu , karena satu persatu setiap
fungsi , class dapat dites menggunakan method yang berbeda beda untuk setiap 1
fungsi / class.