Chapter sebelumnya sudah menjelaskan mengapa test otomatis layak menjadi bagian rutin dari alur kerja pengembangan. Sekarang kita menyiapkan perkakasnya: PHPUnit, kerangka pengujian (testing framework) de-facto untuk PHP yang dipakai hampir di seluruh proyek modern. Pada chapter ini kita akan menginstal PHPUnit melalui dua jalur resmi — berkas PHAR mandiri dan paket Composer — lalu membedah berkas konfigurasi phpunit.xml dan memverifikasi bahwa instalasi benar-benar siap dipakai.

Memeriksa Prasyarat Instalasi #

PHPUnit berjalan di lingkungan CLI, jadi langkah pertama adalah memastikan PHP terpasang dan dapat dipanggil dari terminal. PHPUnit 12 membutuhkan versi PHP yang masih aktif didukung; jika perintah berikut menampilkan PHP 8.3 atau lebih baru, Anda sudah aman. Berikut cara memeriksanya:

bash
php -v

Output yang Dihasilkan:

text
PHP 8.4.23 (cli) (built: Jul  7 2026 05:22:53) (NTS gcc 14.2.0)
Copyright (c) The PHP Group
Built by static-php-cli 2.8.6
Zend Engine v4.4.23, Copyright (c) Zend Technologies

PHPUnit juga bergantung pada beberapa ekstensi standar seperti dom, filter, json, libxml, mbstring, dan xmlwriter. Ekstensi-ekstensi tersebut sudah terpasang secara bawaan pada hampir semua build PHP normal, termasuk lingkungan yang dipakai course ini, sehingga biasanya tidak perlu langkah tambahan. Jika Anda ingin memastikannya, perintah php -m menampilkan daftar ekstensi yang aktif.

Jalur Instalasi Pertama: Berkas PHAR #

Cara instalasi paling ringkas adalah mengunduh berkas PHAR (PHP Archive) — satu berkas tunggal yang berisi seluruh kode PHPUnit dan bisa dijalankan langsung oleh interpreter PHP, mirip seperti berkas .jar pada dunia Java. Jalur ini tidak membutuhkan Composer sama sekali, sehingga cocok untuk mencoba PHPUnit, berbagi skrip uji, atau menjalankan pengujian di server CI yang sederhana. Semua berkas PHAR resmi PHPUnit didistribusikan dari domain phar.phpunit.de.

bash
curl -sL -o phpunit-12.phar https://phar.phpunit.de/phpunit-12.phar
chmod +x phpunit-12.phar
php phpunit-12.phar --version

Output yang Dihasilkan:

text
PHPUnit 12.5.39 by Sebastian Bergmann and contributors.

Mari kita bedah tiap baris perintah di atas:

  1. curl -sL -o phpunit-12.phar ...: mengunduh berkas PHAR dari server resmi PHPUnit. Opsi -s membuat curl bekerja tanpa progres bar, -L memerintahkan curl mengikuti pengalihan (redirect) alamat, dan -o menentukan nama berkas hasil unduhan (ukurannya sekitar 6 MB).
  2. chmod +x phpunit-12.phar: menandai berkas sebagai dapat dieksekusi. Setelah langkah ini Anda bisa menjalankannya langsung sebagai ./phpunit-12.phar --version karena berkas PHAR memiliki shebang yang mencari php di PATH.
  3. php phpunit-12.phar --version: meminta PHPUnit melaporkan versinya. Baris PHPUnit 12.5.39 di atas adalah bukti bahwa berkas terunduh utuh dan siap dipakai.

Perhatikan bahwa kita sengaja mengunduh phpunit-12.phar, bukan phpunit.phar. Alamat tanpa nomor versi selalu mengarah ke rilis stabil terbaru, sedangkan alamat bernomor mengunci kita pada satu jalur versi mayor. Tabel berikut merangkumannya:

Alamat unduhanIsi yang diperoleh
https://phar.phpunit.de/phpunit.pharRilis stabil terbaru — saat chapter ini ditulis, pengalihan menuju PHPUnit 13.4.2
https://phar.phpunit.de/phpunit-12.pharRilis terbaru jalur 12.x — 12.5.39, versi yang dipakai course ini
https://phar.phpunit.de/phpunit-11.pharRilis terbaru jalur 11.x untuk PHP yang lebih lama

Jalur Instalasi Kedua: Composer #

Untuk proyek nyata, jalur yang lebih lazim adalah memasang PHPUnit sebagai dependensi Composer. Dengan cara ini, versi PHPUnit tercatat di composer.json, pembaruannya terkendali lewat composer.lock, dan seluruh tim mendapatkan versi yang persis sama saat menjalankan composer install. Jika Anda belum familier dengan Composer, baca dulu chapter Apa itu Composer .

Berikut sesi nyata memasang PHPUnit pada proyek kecil baru bernama tokobuku:

bash
mkdir tokobuku && cd tokobuku
composer require "phpunit/phpunit:^12.5" --dev
vendor/bin/phpunit --version

Output yang Dihasilkan:

text
./composer.json has been created
Running composer update phpunit/phpunit
Loading composer repositories with package information
Updating dependencies
Lock file operations: 25 installs, 0 updates, 0 removals
...
  - Installing phpunit/phpunit (12.5.39): Extracting archive
...
Generating autoload files
...
PHPUnit 12.5.39 by Sebastian Bergmann and contributors.

Beberapa hal penting terjadi di sesi tersebut. Pertama, Composer membuat composer.json baru karena folder proyek masih kosong, lalu menyelesaikan dependensi dan memasang 25 paket — PHPUnit datang bersama komponen pendukung seperti phpunit/php-code-coverage dan sebastian/diff. Baris terakhir membuktikan bahwa berkas vendor/bin/phpunit yang dibuat Composer benar-benar berfungsi. Hasil akhirnya, composer.json proyek kini berisi:

json
{
    "require-dev": {
        "phpunit/phpunit": "^12.5"
    }
}

Bendera --dev menempatkan paket pada bagian require-dev, artinya PHPUnit hanya terpasang saat pengembangan dan tidak ikut ketika aplikasi dideploy ke production dengan composer install --no-dev. Constraint ^12.5 berarti “versi 12.5 atau lebih tinggi, tetapi tetap di bawah 13.0” — pola ini yang menjaga kita tetap di jalur 12.x. Detail aturan penulisan versi seperti ini sudah dibahas pada chapter Version Constraints .

Anatomi Berkas Konfigurasi phpunit.xml #

Setelah instalasi, langkah berikutnya adalah berkas konfigurasi phpunit.xml di akar proyek. Berkas ini bersifat opsional, tetapi sangat disarankan karena menyimpan pengaturan baku: di mana test dicari, autoloader mana yang dimuat, dan bagaimana output diwarnai. Berikut bentuk tipikal untuk proyek yang memakai Composer:

xml
<?xml version="1.0" encoding="UTF-8"?>
<phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="https://schema.phpunit.de/12.5/phpunit.xsd"
         bootstrap="vendor/autoload.php"
         colors="true">
    <testsuites>
        <testsuite name="Unit">
            <directory>tests</directory>
        </testsuite>
    </testsuites>
</phpunit>

Mari kita bedah elemen-elemennya satu per satu:

  1. Atribut bootstrap="vendor/autoload.php": berkas yang dimuat sekali sebelum test berjalan — di proyek Composer, autoload inilah yang membuat kelas src/ bisa di-use langsung di dalam test tanpa require_once manual.
  2. Elemen <testsuites>: wadah untuk satu atau lebih testsuite, yaitu kelompok test yang bisa dijalankan terpisah.
  3. Elemen <testsuite name="Unit">: mendefinisikan satu suite bernama Unit; Anda bisa menambahkan suite lain seperti Integration dengan folder berbeda.
  4. Elemen <directory>tests</directory>: memberi tahu PHPUnit bahwa seluruh berkas *Test.php di dalam folder tests (beserta subfoldernya) adalah test yang harus dijalankan.
  5. Atribut colors="true": mengaktifkan warna hijau/merah pada output terminal agar hasil lebih mudah dipindai.
  6. Atribut xsi:noNamespaceSchemaLocation: menunjuk skema XML resmi sehingga editor dapat melengkapi dan memvalidasi penulisan konfigurasi.

PHPUnit otomatis membaca phpunit.xml dari direktori kerja saat dijalankan tanpa argumen, jadi Anda cukup mengetik vendor/bin/phpunit saja. Jika ingin dibuatkan kerangka konfigurasi secara interaktif, perintah --generate-configuration akan menanyai Anda beberapa pertanyaan lalu menuliskan berkasnya.

Memilih Antara PHAR dan Composer #

KriteriaBerkas PHARPaket Composer
Cara instalasiUnduh satu berkascomposer require phpunit/phpunit --dev
Cara pembaruanUnduh ulang berkascomposer update phpunit/phpunit
Jejak pada proyekTidak ada catatan di proyekTercatat di composer.json dan composer.lock
Integrasi autoloadTidak terikatMemakai vendor/autoload.php proyek
Cocok untukEksperimen, skrip uji cepat, CI minimalisProyek aplikasi dan library jangka panjang

Aturan praktisnya sederhana: jika proyek Anda sudah memakai Composer — yang hampir pasti terjadi pada aplikasi modern — pasang PHPUnit lewat Composer agar versinya terkunci bersama dependensi lain. Berkas PHAR unggul saat Anda butuh PHPUnit tanpa menyentuh struktur proyek, misalnya untuk mencoba framework ini di folder kosong. Lingkungan latihan course ini sendiri menyediakan PHPUnit 12.5.39 sebagai berkas PHAR, persis seperti hasil unduhan phpunit-12.phar di atas.

Verifikasi Instalasi dengan Test Pertama #

Instalasi baru layak disebut berhasil jika PHPUnit benar-benar menjalankan sebuah test. Buat folder tests lalu isi dengan berkas InstalasiTest.php berikut:

php
<?php

use PHPUnit\Framework\TestCase;

final class InstalasiTest extends TestCase
{
    public function testPHPUnitBerjalanSesuaiHarapan(): void
    {
        $hasil = 1 + 1;

        $this->assertSame(2, $hasil);
    }
}

Struktur di atas adalah bentuk minimal sebuah test PHPUnit: kelas bernama InstalasiTest (berakhir dengan sufiks Test) yang mewarisi PHPUnit\Framework\TestCase, berisi method publik berawalan test yang melakukan satu assertion assertSame(2, $hasil). Eksekusi assertion itulah yang membandingkan nilai harapan dengan nilai nyata — konsep ini akan kita dalami pada dua chapter berikutnya. Sekarang jalankan PHPUnit pada folder tests:

bash
php phpunit-12.phar tests

Output yang Dihasilkan:

text
PHPUnit 12.5.39 by Sebastian Bergmann and contributors.

Runtime:       PHP 8.4.23

.                                                                   1 / 1 (100%)

Time: 00:00.001, Memory: 28.05 MB

OK (1 test, 1 assertion)

Baris OK (1 test, 1 assertion) adalah sinyal sukses: satu method test dijalankan dan satu assertion lolos. Perhatikan juga bahwa PHPUnit mengakhiri prosesnya dengan exit code 0 — inilah yang nantinya dipakai tools CI untuk menentukan langkah lanjutan. Titik pada baris progres mewakili satu test yang lulus; jika ada kegagalan, titik itu diganti huruf F beserta laporan rinci.

Ringkasan #

PHPUnit bisa hadir dalam proyek Anda melalui berkas PHAR tunggal dari phar.phpunit.de atau sebagai paket Composer dengan constraint seperti ^12.5; keduanya menghasilkan binary yang dilaporkan lewat --version. Berkas phpunit.xml melengkapi instalasi dengan konfigurasi testsuite dan bootstrap yang terdokumentasi di dalam proyek. Dengan test pertama yang sudah berjalan hijau, kita siap menyusun kelas test yang sesungguhnya — mulai dari konvensi penamaan, siklus hidup setUp/tearDown, hingga cara menjalankan test tunggal — pada chapter Menulis PHPUnit Tests .

Referensi #