Test Driven Development (TDD) Laravel Project using PHPunit & XDEBUG

Rachadian Novansyah
JDS Engineering
Published in
5 min readMar 27, 2021

Pada era digitalisasi ini, sering sekali kita mendengar istilah TDD atau Test Driven Development di setiap sebuah project. Lalu apa yang dimaksud dengan TDD? Sebegitu pentingkah untuk diimplementasikan? atau hanya menambah effort developer? 😁

Source Image by https://sekolahkoding.com

Intro

TDD merupakan pendekatan untuk pengembangan perangkat lunak yang baik dan modern, dimana developer harus melakukan proses pengujian dan pengembangan kode yang dibuatnya. Idealnya TDD dilakukan dengan cara developer membuat terlebih dahulu script scenario test nya, kemudian dilanjut melakukan coding fungsionalitasnya. Namun pada artikel yang saya tulis ini saya mencoba mengimplementasikan terhadap kode yang sudah ada.

Pada umumnya TDD sudah menjadi hal yang lumrah dilakukan oleh kalangan developer untuk memastikan kode yang dibuatnya berkualitas dan biasanya dengan adanya TDD pada suatu proses development dapat membuat ‘convident’ developer meningkat karna dengan kita melakukan TDD dapat meminimalisir bugs yang akan terjadi.

Itu untuk sisi fungsional untuk sisi teknis juga TDD memiliki manfaat untuk dapat membuat kode yang kita buat lebih efisien, karna setiap kita melakukan pengujian biasanya kita bakal menyentuh kembali kode-kode yang telah dibuat (Feedback Loop), dan tidak jarang kita akan menemukan kode-kode yang bisa bahkan perlu disederhanakan atau biasa disebut Refactoring Code.

Pembahasan

Pada artikel kali ini saya akan ber-eksperimen untuk menerapkan sebagian proses dari TDD terhadap Project Laravel menggunakan phpunit. Mengapa saya katakan sebagian proses dari TDD? karna pada artikel ini saya melakukan pengujian terhadap kode yang sudah ada, tanpa membuat skenario testingnya terlebih dahulu. Harapan dari eksperimen ini adalah kita menguji kembali kode yang kita buat tanpa menyentuh data asli project dan sebisa mungkin meng-isolate pengujian yang kita buat.

Apa itu phpunit? Phpunit merupakan salah satu program yang akan membantu developer untuk membuat automatic testing di aplikasi berbasis PHP. Kabar baiknya phpunit sudah ter-include pada setiap kali kita membuat project baru Laravel.

Untuk mempersingkat waktu saya akan menggunakan project yang sudah ada atau bisa dilihat disini, yang didalamnya berisi proses CRUD lalu setiap proses Create-Read-Update-Delete nya akan kita lakukan pengujian menggunakan phpunit.

Persiapan

Sebelum masuk ke bagian teknis alangkah baiknya menyiapkan beberapa kebutuhan untuk melakukan pengujian, seperti:
1. Code Editor (Visual Studio Code)
2. Laravel Project (yang didalamnya sudah ada fungsi CRUD)
3. Pastikan Xdebug sudah terinstall di PHP agar hasil dari pengujiannya dapat kita visualisasikan dan di generate ke dalam coverage. Cara mengeceknya cukup gunakan perintah php -v.

PHP & Xdebug version

Secara default Laravel sudah menyediakan kita 1 folder bernama tests untuk melakukan TDD ini, didalam nya terdapat sub directory yang berisikan Feature dan Unit.

Default testing folder

Direktori Feature digunakan untuk melakukan test terhadap fitur atau keseluruhan dari bagian fitur yang kita buat dan biasa nya dalam satu pengetesan fitur ini terdapat beberapa gabungan method yang dipakai dalam satu fitur ini, tergantung kompleksitas dari fitur yang dibuat.

Sedangkan direktori Unit digunakan untuk melakukan unit test yang biasanya di dalamnya terdapat test terhadap function atau method yang lebih kecil, jadi fokusnya hanya menguji unit-unit atau bagian-bagian kecil dari sebuah fungsi.

Pada kali ini saya akan fokus terhadap pengujian Feature dari proses sebuah CRUD saja.

Pertama-tama cari folder phpunit.xml pada project, lalu tambahkan script berikut:

Tambahkan script dibawah sesudah block <testsuites></testsuites>:

<filter>

<whitelist processUncoveredFilesFromWhitelist=”true”>

<directory suffix=”.php”>./app</directory>

</whitelist>

</filter>

Tambahkan script dibawah sesudah block <php></php>

<logging>

<log type=”coverage-html” target=”./report” charset=”UTF-8"

yui=”true” highlight=”true”

lowUpperBound=”50" highLowerBound=”80" />

</logging>

Script diatas berguna untuk generate coverage html pada folder ./report. Sehingga konfigurasi akhirnya akan seperti ini:

Setelah phpunit.xml berhasil diatur, untuk menjalankan test dan menggenerate coveragenya bisa menggunakan perintah:

XDEBUG_MODE=coverage vendor/bin/phpunit

Test result

Secara otomatis coverage akan ter-generate kedalam folder report/

Generate coverage

Lalu buka file index.html

Coverage

Kita bisa melihat score yang digenerate di coverage tersebut saat ini masih baru sekitar 10%an, karna kita belum menulis kode pengujian apapun pada project :D

Oke, kode yang sekarang akan kita coba uji adalah AuthorController yang sudah saya buat sebelumnya. Untuk kode nya kurang lebih seperti ini:

Selanjutnya generate file test baru untuk menguji AuthorController diatas menggunakan artisan command, gunakan perintah berikut:

php artisan make:test AuthorTest

Lalu masuk ke folder tests/Feature/AuthorTest buka dan tulis script berikut:

Penjelasan:

  • Pada script diatas saya menggunakan function setUp() untuk meng-inisiasi kebutuhan testing, seperti Mocking data agar tidak berulang ditulis disetiap test case.
  • As Far As I Know, Laravel 5.8 keatas perlu menambahkan :void setelah setUp() untuk menetapkan balikan dari fungsi tersebut.
  • Menggunakan factory untuk provide data mocking.
  • ActingAs berfungsi sebagai mock user yang mengakses api/feature.
  • Assertion yang digunakan menggunakan assertStatus(), sebetulnya banyak sekali metode assertion yang dapat digunakan namun pada script diatas saya hanya menggunakan assertStatus() untuk menguji balikan dari api/feature yang diuji.

Lalu run perintah berikut pada terminal.

XDEBUG_MODE=coverage vendor/bin/phpunit tests/Feature/AuthorTest.php

Maka hasilnya akan seperti ini.

Test result AuthorTest

Silahkan cek kembali file coverage di folder ./report , dan buka kembali index.html

Coverage result AuthorController

Maka jika dilihat dari hasil coverage diatas kita berhasil menguji dari setiap function yang kita buat pada AuthorController.

Update

Jika kalian pengguna windows (dan mengalami masalah) ketika melakukan running coverage (xdebug), coba ubah file php.ini dan tambahkan script dibawah ini.

php.ini

atau lebih lengkapnya kunjungi link SoF ini.

Conclusion

Pada eksperimen kali ini saya mencoba mengimplementasikan sebagian dari proses TDD pada Laravel menggunakan beberapa tools seperti phpunit, Xdebug, lalu mencoba menvisualisasikannya melalui coverage agar lebih mudah mengetahui test case mana yang sudah diuji dan yang belum diuji.

Lalu keuntungan apa yang kita dapat dari penerapan TDD ini? keuntungan yang kita dapat ialah Feedback Loop yang cepat, membantu kita melakukan Refactoring Code dan tentu kita akan dibuat semakin Convident terhadap kode yang kita buat.

Happy Coding :))

--

--

Rachadian Novansyah
JDS Engineering

Here's my story journey as Backend Engineer at Jabar Digital Service.