PHPUnit Untuk Pemula Bagian Pertama

Khairu Aqsara Sudirman

Khairu Aqsara Sudirman

Apr 24, 2020 — 9 mins read
Software Testing

Software Testing

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.

PHPUnit Version

PHPUnit Version

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.

Testing Fitur Dasar

Testing Fitur Dasar

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

Test Tambahan

Test Tambahan

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
laravel php
Read More

PHPUnit Untuk Pemula Bagian Kedua

Jika kita terjemahkan kedalam bahasa sederhana, kita bisa meng-anggapnya sebagai penyuplai data atau penyedia data atau pengatur data, pada unit testing jika kita menggunakan data provider kita bisa mempersingkat penulisan kode untuk test. penggunaan data provider ini menggunakan notasi atau annotation @dataProvider

Read More

PHP Fungsi Terbilang

merubah angka menjadi bentuk terbilang dalam bahasa indonsia dengan php