Penggunaan fungsi ASSERTIONS pada PHP

PHPUnit adalah tools yang populer untuk melakukan unit testing di PHP. Library yang ada cukup lengkap mulai dari assertion dan mocking. Setupnya sendiri cukup mudah dengan menggunakan tools composer.

Persiapan: Buat Project

Direktori project

Direktori project yang akan dibuat adalah php-test-example.

~$ mkdir -p php-test-example
~$ cd php-test-example

Generate composer.json

Akan muncul wizard di command line yang akan memandu pembuatan file composer.json.

Penggunaan fungsi ASSERTIONS pada PHP

Install PHPUnit menggunakan composer

~$ composer require --dev phpunit/phpunit

Parameter --dev digunakan untuk memberi tahu composer bahwa package ini diinstall untuk keperluan development saja (require-dev). Secara default, executable PHPUnit akan terinstall di folder vendor/bin/phpunit.

Direktori source code dan namespace

Source code program akan kita letakkan di sub-direktori src.

Root namespace untuk program kita tentukan App, di mapping ke semua source code di sub-direktori src, kita tuliskan konfigurasi ini di composer.json.

    "autoload": {
        "psr-4": {
            "App\\": "src/"
        }
    }

Cukup tambahkan autoload di composer.json. Dan jangan lupa untuk generate autoload dengan menggunakan perintah:

Development

Buat project dan kelas yang akan di-test

Di dalam direktori src buatlah kelas Employee sebagai berikut:

<?php
namespace App;

class Employee
{
    private $id;
    private $name;
    private $basicSalary;

    public function __construct($id, $name, $basicSalary)
    {
        $this->id = $id;
        $this->name = $name;
        $this->basicSalary = $basicSalary;
    }

    public function getId()
    {
        return $this->id;
    }

    public function getName()
    {
        return $this->name;
    }

    public function getBasicSalary()
    {
        return $this->basicSalary;
    }
}

Untuk kelas ini akan kita buat test untuk semua public methodnya.

Buat file test

Untuk memudahkan eksekusi test nantinya, buat direktori khusus tests untuk semua test file yang akan dibuat.

Di dalam direktori tests buatlah kelas EmployeeTest sebagai berikut:

<?php

use App\Employee;

class EmployeeTest extends PHPUnit\Framework\TestCase
{
    /** @test */
    public function shouldCreateObject()
    {
        $id = 1;
        $name = 'John Smith';
        $basicSalary = 1000000;

        $obj = new Employee(
            $id,
            $name,
            $basicSalary
        );

        $this->assertEquals($id, $obj->getId());
        $this->assertEquals($name, $obj->getName());
        $this->assertEquals($basicSalary, $obj->getBasicSalary());
    }
}

Pada test ini kita menggunakan assertion assertEquals yang membandingkan antara nilai ekspektasi dengan nilai aktual. Nilai ekspektasi dapat diambil dari variabel langsung, karena pada kasus ini kita hanya mengetes fungsio getter yang fungsinya mengambil atribut yang ada di dalam objek. Dokumentasi apa saja assertion yang dapat digunakan bisa dilihat lebih lengkap di situs PHPUnit.

Menjalankan Test

Menjalankan test dengan PHPUnit sebelumnya harus mengkonfigurasi file mana yang akan di-_execute_ ketika akan menjalankan test. Cara paling basic adalah menjalankan test di dalam struktur direktori, atau jika dibutuhkan konfigurasi yang lebih lengkap bisa dengan menggunakan f ile konfigurasi phpunit.xml.

Menggunakan struktur direktori

Untuk menjalankan test di dalam direktori tertentu, gunakan perintah:

~$ vendor/bin/phpunit tests

Penggunaan fungsi ASSERTIONS pada PHP

Atau jika membutuhkan file bootstrap/autoload bisa menambahkan parameter --bootstrap.

~$ vendor/bin/phpunit --bootstrap vendor/autoload.php tests

Menggunakan phpunit.xml

PHPUnit bisa menggunakan file phpunit.xml sebagai konfigurasi test. File standar phpunit.xml berisi kurang lebih seperti ini:

<?xml version="1.0" encoding="UTF-8"?>
<phpunit backupGlobals="false"
         backupStaticAttributes="false"
         bootstrap="vendor/autoload.php"
         colors="true"
         convertErrorsToExceptions="true"
         convertNoticesToExceptions="true"
         convertWarningsToExceptions="true"
         processIsolation="false"
         stopOnFailure="false"
         verbose="true"
         syntaxCheck="false">
    <testsuites>
        <testsuite name="Unit Test">
            <directory suffix="Test.php">./tests/</directory>
        </testsuite>
    </testsuites>
</phpunit>

Perhatikan parameter bootstrap di file xml di atas, fungsinya sama dengan parameter --bootstrap apabila menggunakan metode test di dalam direktori.

Di dalam file xml ini terdapat elemen <testsuites> yang berfungsi menunjukkan detail konfigurasi per test-suite. Di dalam testsuites terdapat beberapa testsuite yang independen. Di dalamnya memuat direktori yang akan dijalankan ketika test, serta terdapat atribut suffix untuk mem-_filter_ file dengan akhiran tertentu saja yang akan dijalankan sebagai test.

Konfigurasi dengan phpunit.xml lebih disarankan ketika dibutuhkan konfigurasi testing yang lebih kompleks dari sekedar struktur direktori saja. Serta memudahkan untuk kolaborasi/sharing karena cara untuk menjalankan test menjadi tidak perlu tambahan lagi, cukup jalankan:

Test suite bisa didefinisikan lebih dari satu, jika tidak diberi parameter ketika menjalankan, maka semua test suite akan dijalankan. Untuk menjalankan satu test suite saja, gunakan perintah:

~$ vendor/bin/phpunit --testsuite "Unit Test"

Kesimpulan

Dengan menggunakan unit test kita dapat melakukan testing logika aplikasi tanpa harus menjalankan program secara keseluruhan (misal http server). PHPUnit sudah menyediakan library yang lumayan lengkap untuk melakukan unit test ini. Source code lengkap bisa didapat di sini.

Semoga bermanfaat, Happy Coding!