sebelum melanjutkan, saya ucapkan Selamat berpuasa buat teman-teman yang menjalankanya :)
, semoga puasanya lancar. Ok dikesempatan ini saya mengajak teman-teman untuk mengenal PHPUnit
, Unit Testing dan kenapa harus.
Rencananya tulisan ini saya bagi menjadi beberapa bagian, tetapi kita lihat saja nanti sambil berjalan, jika memang dibutuhkan sampai beberapa bagian ya kita bagi saja, yang pada tujuan akhirnya nanti teman-teman bisa membuat unit test yang sederhana dan memahami cara kerja dan manfaatnya.
Tipe Test
Sebelum kita belajar lebih jauh tentang PHPUnit
, mari kita fahami dulu perbedaan dari jenis test
atau Types of Test
itu sendiri, tergantung dari cara teman-teman mengkategorikan nya bedasarkan pengalaman dalam pengembangan software.
Menurut Wikipedia, kita bisa mengkategorikan Test berdasarkan level dari spesifikasi dari test itu sendiri, misalnya seperti:
Unit Testing
test ini biasanya datang dari pada pengembang software (Developer's poit of view), unit test melakukan pengujian dari bagian terkecil dari sebuah fungsi besar untuk memastikan fungsi tersebut berjalan dengan semestinya.
Integration Testing
sebenarnya tidak jauh berbeda dengan unit testing, hanya saja integration testing lebih kepada test yang dilakukan untuk melihat korelasi atau hubungan dari setiap bagian program berjalan dengan semestinya.
System Testing
testing ini dibuat untuk men-simulasikan sebuah skenario dalam ruang lingkup yang sebenarnya, system testing memastikan sebuah aplikasi akan berjalan dengan semestinya pada lingkungan yang sebenernya.
Acceptance Testing
Unit testing, Integrations Testing, System Testing merupakan test yang dilakukan pada saat perangkat lunak dikembangkan, sedangkan Acceptance Test adalah test yang dilakukan oleh pemilik perangkat lunak, dimana user ini biasanya tidak paham detail internal dari perangkat lunak, dan hanya perduli bagaiaman perangkat lunak bekerja.
Apaitu Unit Testing
kita bisa menyimpulkan unit testing merupakan pondasi dari semua testing, ketika kita membangun sebuah perangkat lunak yang besar unit testing sangat membantu dalam menjaga dan memastikan fungsi dari masing-masing bagian program berjalan dengan semestinya.
mungkin teman-teman tidak sadar, bahwa selama ini dalam mengembangkan sebuah perangkat lunak sudah melakukan testing, bahkan kalo saya bilangnya everyday is testing, kenapa ? coba ya pas kita sedang koding terus pengen ngecek bener ga hasilnya kita ngetestnya pake var_dump()
, atau dd()
atau console.log()
dan sejenisnya, tentunya beda bahasa beda cara.kemudian pada saat pembuatan form, setelah jadi kita test formnya untuk memastikan validasi dan proses simpan berjalan dengan semstinya, itu juga testing, hanya saja testing yang dilakukan secara manual oleh yang ngoding.
Nah sekarang kita bekerja dengan tim, setiap anggota tim mengerjakan modulnya masing-masing, pada saatnya nanti semua modul akan digabungkan menjadi satu kesatuan aplikasi, ada yang bisa menjamin jika penggabungan itu tidak menimbulkan masalah baru ? atau modul si A tidak mengganggu modul yang dibuat sama si B ? tentu saja masalah ini bisa saja muncul, bahkan sering.
nah untuk itulah unit testing hadir, dengan adanya unit testing setelah si A mengerjakan bagianya dan membuat testing bagianya dia bisa memastikan bahwa perubahan yang dilakukannya tidak mengganggu modul atau fungsi-fungsi si B dengan menjalankan test yang dibuat oleh si B, begitu juga dengan si B, akan memastikan bahwa perubahan yang dikerjakan tidak mengganggu fungsi-fungsi yang sudah dikerjakan oleh si A.
unit testing hadir untuk memastikan bagian-bagian terkecil dari sebuah fungsi bisa berjalan dengan semestinya, ketika banyak unit testing digabungkan (dalam satu aplikasi) maka ini bisa kita sebut sebagai integration testing, karena sudah mencakup korelasi banyak fungsi, ketika aplikasi dipindahkan ke environment yang sebenarnya dan unit testing dijalankan secara keseluruhan (integration testing) kemudian ini bisa kita anggap sebagai system testing.
nah kebayangkan teman-teman semua penting tidaknya unit testing ? yang perlu diingat dan dijadikan patokan adalah
ketika kita memperbaiki suatu bug bisa jadi kita membuat bug baru, melakukan testing dan memeriksa setiap input dan output akan meminimalisir terjadinya bug yang tidak diketahui.
Apa itu PHPUnit
Ketika kita mengerjakan aplikasi yang besar dan bersama tim, membuat tes dan menyeragamkanya juga merupakan tantangan tersendiri, PHPUnit
hadir untuk itu, PHPUnit
merupakan salah satu PHP
testing Framework
yang paling populer saat ini, PHPUnit
menyediakan fitur Mocking Object
, Coverage Analysis
, Logging
dan banyak fitur lainya, untuk bisa menggunakanya seperti halnya package php
lainya, kita bisa menggunakan composer
atau install manual, yang perlu diingat beda cara installasi beda pula cara ekeskuisnya.
untuk mempermudah, sebaiknya kita menggunakan Composer
, saya rasa teman-teman cukup familiar dengan tools yang satu ini, sebelum kita beranjak lebih jauh mari kita susun skenario mini project kita untuk mengimplementasikan PHPUnit
testing dan Menerapkan Unit Testing.
Skenario Super Mini Project.
kali ini kita akan membangun sebuah aplikasi kecil berbasis PHP
dengan nama Kalkulator
yang menggunakan Composer
sebagai Depedency Manager, pada aplikasi ini juga kita menggunakan PSR-4
untuk mempermudah aoutload
dengan menggunakan namespace
.
selanjutnya, dari nama teman-teman sudah bisa membayangkan seperti apa cara kerjanya bukan?, yap namanya juga aplikasi kecil bahkan super kecil, Kalkulator
nantinya akan memiliki beberapa fitur sederhan seperti tambah
, kurang
, perkalian
, dan pembagian
, dimana kesemua fitur itu nanti akan kita buatkan unit testing nya menggunakan PHPUnit.
Persiapan dan Instalasi
Untuk memulainya, kita akan membuat sebuah direktori dengan nama kalulator
, atau namanya terserah teman-teman dengan susunan direktori seperti berikut
kalkulator
---src
---tests
------unit
---composer.json
untuk sementara, file composer.json
cukup diisikan dengan {}
saja, jika sudah, buka terminal/cmd dan arahakn pada root folder projek, dan jalankan perintah
composer require phpunit/phpunit --dev
perintah tersebut akan menginstall phpunit
dan library pendukung lainya, arguman --dev
artinya phpunit hanya kita gunakan pada saat development
, setalah instalasi selesai, seharunya isi dari file composer.json
akan menjadi mirip seperti berikut
{
"require-dev": {
"phpunit/phpunit": "^9.1"
}
}
kemudian kita perlu menambah beberapa baris pada file composer.json
untuk menggunakan fitur PSR-4
sebagai autoloader
, dengan begitu kita bisa menggunakan namespace
nantinya, sehingga isi dari file composer.json
akan menjadi mirip seperti berikut.
{
"require-dev": {
"phpunit/phpunit": "^9.1"
},
"autoload": {
"psr-4": {
"Ezadev\\Contoh\\":"src/"
}
}
}
Ezadev\\Contoh
merupakan nama namespace
yang saya deklarasikan, teman-teman bisa memilih nama lain, sedangkan src/
merupakan tempat source
dari aplikasinya, sehingga nantinya jika kita menggunakan namespace Ezadev\Contoh\Sample
secara otomatis file/Class Sample.php
akan dicari dalam folder src
, ini adalah mekanisme kerja dari PSR-4 Autoloader
, kemudian jalankan perintah
composer dump-autoload -o
perintah diatas untuk meregistrasikan namespace
yang baru kita buat ke autoloader
, sekarang mari kita coba menjalankan phpunit dengan perintah vendor/bin/phpunit
jika pada terminal muncul keterangan versi dari PHPunit
dan Versi PHP
maka PHPunit
sudah tersintall dan siap untuk kita gunakan.
sampai pada saat ini persiapan kita sudah cukup, sekarang kita akan mencoba membuat fitur-fitur dari aplikasi Kalkulator
yang sudah kita rencanakan.
Koding Fitur
pada bagian ini, tidak ada yang istimewa, kita hanya melakukan koding biasa dengan fitur yang sudah direncanakan, mari kita buat satu file baru pada folder src
dengan nama Kalkulator.php
dengan isi sebagai berikut:
<?php
namespace Ezadev\Contoh;
class Kalkulator
{
public function tambah($a,$b)
{
if(is_numeric($a) && is_numeric($b)){
return $a+$b;
}else{
return "Error";
}
}
}
cukup sangat sederhana ya, untuk fitur lainya bisa nyusul, sekarang kita punya fitur dasar yang harus kita test, sebelum itu kita harus memahami dulu bagian apa saja yang harus kita test, pada kasus diatas ada bebera bagian yang harus kita test misalnya saja.
test validasi jika $a dan $b bukan bertipe angka harusnya muncul pesan Error
test fungsi tambah 1+2 harusnya nilainya adalah 3
test fungsi tambah jika 0+0 harusnya nilainya adalah 0
test fungsi tambah untuk bilangan negatif (-1)+(-1) harusnya nilainya -2
test fungsi tambah bilangan negatif dengan positif (-1) + 1 = 0
itu adalah beberapa kasus yang akan kita test, teman-teman bisa mengembangkan kasus-kasus yang lainya, semakin banyak akan semakin baik, itu mengindikasikan jika fitur yang kita buat semakin teruji dalam berbagai kondisi.
Testing
Sebelum kita membuat script
untuk Automatic testing nya, ada baiknya kita mempersiapkan pengaturan awal untuk phpunit
agar phpunit
secara default menggunakan konfigurasi yang sudah kita tetapkan, dengan begitu kita tidak harus menggunakan argumen yang panjang setiap kali menjalankan phpunit
nantinya. untuk itu kita buat sebuah file degan nama phpunit.xml
dan kita isi dengan konfigurasi berikut.
<?xml version="1.0" encoding="UTF-8"?>
<phpunit
bootstrap="vendor/autoload.php"
colors="true"
verbose="true"
stopOnFailure="true">
<testsuites>
<testsuite name="unit">
<directory>tests</directory>
</testsuite>
</testsuites>
<filter>
<whitelist processUncoveredFilesFromWhitelist="true">
<directory suffix=".php">./src</directory>
</whitelist>
</filter>
</phpunit>
sedikit penjelasan pada bagian phpunit.xml
yang perlu diperhatikan adalah boostrap="vendor/autoload.php"
dengan begitu phpunit menjadi tau jika harus menggunakan autoload.php
jika ingin mencari file nantinya, kemudin ada colors="true"
tampilkan warna pada hasil testing, verbose="true"
tampilkan informasi lainnya sedangkan stopOnFailure="true"
merupakan konfigurasi dimana PHPUnit
akan berhenti jika terdapat test yang gagal, dengan begitu kita bisa memperbaiki kesalahan dan melakukan test
kembali nantinya.
kemudian pada bagian <testsuites>
menunjukan konfigurasi dimana phpunit
akan mencari file untuk dijalankan. dan pada bagian filter
kita menggunakan Code Coverage
pada folder src
, ini menunjukan phpunit
akan memeriksa sejauh mana kode kita ditest, apakah semua baris kode hingga ke bagain terkecil dilakukan test atau tidak, sehingga nantinya diharapkan 100%
Code Coverage atau 100%
semua baris kode di sudah periksa, kondisi Code Coverage ini tidak wajib tetapi sebaiknya ada, walaupun tidak sampai 100%
, 80%
merupkan nilai yang sangat bagus menurut saya.
kemudian saatnya kita membuat script test
untuk fitur Kalkulator
yang sudah kita buat sebelumnya, buat satu file dengan nama KalkulatorTest.php
pada folder tests/unit
, semua file harus memiliki akhiran (*)Test.php
dengan begitu phpunit
tau jika file tesebut merupakan test case
yang harus ditest. Kemudian kita buat seperti kode berikut:
<?php
use PHPUnit\Framework\TestCase;
use Ezadev\Contoh\Kalkulator;
class KalkulatorTest extends TestCase
{
private $kalkulator;
protected function setUp():void
{
$this->kalkulator = new Kalkulator;
}
protected function tearDown():void
{
$this->kalkulator = null;
}
public function test_fungsi_tambah()
{
$hasil = $this->kalkulator->tambah(1,2);
$this->assertEquals(3, $hasil);
}
}
jika kita terjemahkan use PHPUnit\Framework\TestCase
dan use Ezadev\Contoh\Kalkulator
merupakan 2 class
yang akan kita gunakan, TestCase
merupakan Class
induk bagi Test
case
kita, sedangkan Kalkulator
merupakan Class
yang akan kita test fiturnya, method setUp():void
akan secara otomatis dipanggil sebelum setiap test dijalankan, sedangakn tearDown():void
akan secara otomatis dipanggil setiap test selesai dijalankan, test yang dimaksudkan disini adalah fungsi dengan awalan test_
yang ada dalam Class KalkulatorTest
misalnya seperti fungsi test_fungsi_tambah()
sebelum test ini dijalankan secara otomatis setUp():void
akan dijalankan, begitu juga dengan tearDown():void
akan dijalankan secara otomatis ketika test_fungsi_tambah
selesai, sedangkan test_fungsi_tambah()
sendiri merupakan fungsi untuk melakukan test pada fungsi tambah
yang ada pada class Kalkulator
,terlihat pada kode $hasil = $this->kalkulator->tambah(1,2);
kemudian $hasil
akan kita assertEquals()
artinya $hasil
akan kita bandingkan dengan nilai yang seharusnya dari 1+2
jika $hasil == 3
maka assertEquals()
akan bernilai true
dimana dinyatakan sebagai test pass
atau testnya berhasil.
jika kita perhatikan lagi kodenya kita mengimplementasikan skenario untuk test fungsi tambah 1+2 harusnya nilainya adalah 3
yang sudah kita rencanakan sebelumnya. sekarang mari kita coba menjalankan dengan phpunit.
nah terlihat kan hasilnya, sekarang kita mengimplementasikan semua skenario yang sudah kita susun sebelumnya
<?php
use PHPUnit\Framework\TestCase;
use Ezadev\Contoh\Kalkulator;
class KalkulatorTest extends TestCase
{
private $kalkulator;
protected function setUp():void
{
$this->kalkulator = new Kalkulator;
}
protected function tearDown():void
{
$this->kalkulator = null;
}
public function test_jika_bukan_angka()
{
$hasil = $this->kalkulator->tambah('a', 'b');
$this->assertIsString('Error');
}
public function test_fungsi_tambah()
{
$hasil = $this->kalkulator->tambah(1,2);
$this->assertEquals(3, $hasil);
}
public function test_jika_tambah_nol()
{
$hasil = $this->kalkulator->tambah(0,0);
$this->assertEquals(0, $hasil);
}
public function test_tambah_bilangan_negatif()
{
$hasil = $this->kalkulator->tambah(-1,-1);
$this->assertEquals(-2, $hasil);
}
public function test_jika_tambah_bilangan_positif_negatif()
{
$hasil = $this->kalkulator->tambah(-1,1);
$this->assertEquals(0, $hasil);
}
}
jika kita jalankan hasilnya akan seperti berikut
assertEquals()
dan assertIsString()
merupakan fungsi yang bisa kita gunakan untuk membandingkan hasil dari sebuah proses dengan hasil yang seharusnya, masih banyak assert
yang bisa kita gunakan, teman-teman bisa langsung melihatnya di website dokumentasi phpunit
sejauh ini kita sudah mencoba sedikit fitur phpunit
untuk melakukan pengujian pada aplikasi yang sangat super sederhana juga, dan ternyata memang tidak cukup hanya satu bagian, bagian lainya akan menyusul, pada bagian berikutnya kita akan mencoba menggunakan fitur data Provider
dan Mocking Class
serta Code Coverage
pada phpunit
.
Selamat Menunaikan Ibadah Puasa, Stay Healty, Stay Safe and Please StayAtHome