Nafies Luthfi

Life will always feel wonderful if we always think positively.

Testing Laravel: Setup Project Baru dengan Testing

Bismillahirrahmanirrahim

Alhamdulillah akhirnya bisa mulai menulis lagi. Sekitar dua bulan sebelumnya (terakhir) kita membahas Testing Laravel, tentang Test-Driven Development (TDD), yaitu menulis script testing terlebih dahulu sebelum menulis kode untuk aplikasinya. Sekarang kita lanjutkan untuk melakukan setup/konfigurasi awal project Laravel untuk memulai alur kerja TDD.

Awalnya saya memang menunda untuk menulis artikel ini karena menunggu rilis Laravel 5.5. Niatnya biar sekalian belajar Laravel 5.5. Setelah rilis, ternyata banyak kegiatan yang membuat penulisan artikel ini semakin tertunda. Tapi sekali lagi, alhamdulillah akhirnya bisa mulai menulis lagi.

Setup Local Development

Sebelum memulai, saya ingin menginformasikan development environment yang saya gunakan saat menulis artikel ini :

  • Sistem Operasi: Ubuntu 16.04.3 LTS
  • Web server : Apache/2.4.18
  • Versi PHP : 7.0.22
  • Terminal : GNOME Terminal
  • Database : MariaDB 10.0.31 (Local) & SQLite3 (Testing)
  • Versi Laravel : 5.5.14
  • Direktori Project : ~/www/lv/riset/laravel-tdd

Baik, pada artikel kali ini asumsinya kita sudah menginstall sebuah project Laravel yang baru (fresh install). Kita mulai dengan membuka terminal dan cd ke direktori project Laravel tersebut.

$ cd ~/www/lv/riset/laravel-tdd

Pastikan project Laravel terinstall dengan benar jika kita berhasil melihat versinya.

$ php artisan -V
Laravel Framework 5.5.14

Karena setiap installasi Laravel sudah termasuk dengan paket software testing PHPUnit (sebagai dependensinya), maka kita dapat mencobanya dengan perintah :

$ vendor/bin/phpunit

Mestinya kita akan mendapatkan tampilan seperti ini : First Project Testing

Sip, kalau sudah dapat warna “Hijau”, artinya Laravel terinstall dengan benar dan PHPUnit berjalan dengan baik.

Perhatikan: jika teman-teman belum menghasilkan tampilan yang sama, kemungkinan Laravel belum terintsall dengan benar.

Baik, sampai di sini sebenarnya kita sudah bisa mulai ngoding testingnya, tetapi untuk menyesuaikan dengan testing setup yang biasa saya lakukan (setiap memulai project Laravel), perlu dilakukan beberapa pengaturan/konfigurasi lagi.

Install paket Laravel Browser Kit Testing

Pertama kita akan install sebuah paket tambahan, yaitu Laravel Browser Kit Testing. Dengan paket ini, kita dapat menulis script testing agar PHPUnit dapat interaksi dengan browser. Misal : untuk mengisi form, menekan tombol/submit form, mengecek keberadaan element html, mengunjungi halaman dengan klik link, dan beberapa fitur testing lainnya untuk mempermudah alur kerja TDD kita.

Silakan menginstall dengan cara :

$ composer require laravel/browser-kit-testing dev-master --dev

Sebenarnya paket Browser Kit Testing ini berisi fitur-fitur testing yang ada pada Laravel 5.2 dan 5.3, tetapi pada versi 5.4 dan seterusnya, fitur ini dihilangkan, diganti dengan Laravel Dusk untuk interaksi dengan browser (afaik).

Oke setelah selesai, kita lanjutkan dengan meng-edit file tests/TestCase.php untuk mendapatkan fitur dari paket laravel/browser-kit-testing yang barusan kita install tadi.

Mengubah file BaseTest.php

File tests/TestCase.php adalah kelas Base Test yaitu kelas abstract yang di-extends oleh seluruh kelas-kelas testing yang akan kita buat di project Laravel (ibarat sebagai induknya testing kita). Nah, kelas/file ini harus kita ubah/sesuaikan agar kita dapat menggunakan fitur-fitur dari paket Browser Kit Testing.

Buka file tests/TestCase.php dengan text editor, akan kita dapatkan seperti berikut :

<?php
// tests/TestCase.php

namespace Tests;

use Illuminate\Foundation\Testing\TestCase as BaseTestCase;

abstract class TestCase extends BaseTestCase
{
    use CreatesApplication;
}

Sekarang kita ubah isinya menjadi seperti di bawah:

<?php
// tests/TestCase.php

namespace Tests;

use Laravel\BrowserKitTesting\TestCase as BaseTestCase;

abstract class TestCase extends BaseTestCase
{
    use CreatesApplication;

    public $baseUrl = 'http://localhost';
}

Perhatikan kita mengubah 1 baris Laravel\BrowserKitTesting\TestCase, dan menambahkan baris public $baseUrl = 'http://localhost';. Simpan, kemudian kembali ke terminal dan jalankan perintah :

$ vendor/bin/phpunit

Testing Error Browser Kit Testing

Ups, dapat “Merah” ya? Artinya ada yang mesti kita perbaiki dulu setelah perubahan yang kita lakukan tadi.

Oke kita buka file yang error, yaitu tests/Feature/ExampleTest.php, lihat pada baris ke 20 : $response->assertStatus(200). Script ini adalah method assertion bawaan Laravel sejak versi 5.4 (Illuminate\Foundation\Testing\TestCase), sedangkan kita sudah menentukan pada file tests/TestCase.php bahwa kita menggunakan paket Browser Kit Testing sebagai Base Test atau induk kelas-kelas testingnya. Maka script yang error itu harus diperbaik/diganti :

<?php
// tests/Feature/ExampleTest.php

public function testBasicTest()
{
    // $response = $this->get('/');

    // $response->assertStatus(200); // Tidak ada pada paket Browser Kit Test
    
    // Kedua baris kode di atas digantikan dengan yang ini
    $this->visit('/');
}

Kode $this->visit('/'); adalah salah satu method testing dari Browser Kit Testing.

Setelah itu kita jalankan kembali vendor/bin/phpunit, seharusnya kita akan mendapatkan hasil warna “Hijau” seperti sebelumnya, artinya sudah tidak ada masalah lagi dengan perubahan file tests/TestCase.php tadi.

Testing Success Browser Kit Testing

Oke, karena sudah tidak ada masalah, kita rapikan file test tests/Feature/ExampleTest.php, seperti ini :

<?php
// tests/Feature/ExampleTest.php

public function testBasicTest()
{
    $this->visit('/');
}

Sip, setup untuk konfigurasi paket BrowserKitTesting selesai.

Mengubah file phpunit.xml

Sekarang kita lanjutkan untuk konfigurasi database yang digunakan untuk testing. Kita akan (dan harus) membuat database yang terpisah antara database local development (yang kita gunakan untuk uji coba manual) dengan database untuk Automated Testing. Mengapa? Agar database yang digunakan oleh Automated Testing tidak “mengganggu” database yang kita gunakan saat uji coba manual. Mengganggu? Oke, nanti temen-temen bisa lihat kenapa database ini mesti kita pisahkan, kita lanjutkan dulu.

Seperti yang saya informasikan di awal artikel ini, database untuk local development (pengujian manual) kita menggunakan MariaDB atau MySQL, sedangkan untuk Testing kita gunakan SQLite. Kenapa SQLite? Samakah SQLite dengan MySQL? Beda, tapi mirip. Karena yang akan kita buat adalah fitur CRUD biasa, SQLite sangat cukup dan sepadan dengan MySQL untuk tujuan ini. SQLite juga dapat diatur menggunakan in-memory database, ini menjadikan proses testing lebih cepat.

Untuk dapat menggunakan SQLite pada testing, kita mengkonfigurasinya dengan cara mengubah file phpunit.xml. Atur agar environment variable database testing menggunakan in-memory database SQLite.

Kita buka file phpunit.xml. Tambahkan dua baris kode berikut pada bagian env :

<phpunit>
    <!-- ..... -->
    <php>
        <env name="APP_ENV" value="testing"/>
        <env name="CACHE_DRIVER" value="array"/>
        <env name="SESSION_DRIVER" value="array"/>
        <env name="QUEUE_DRIVER" value="sync"/>
        <!-- Tambahkan dua baris di bawah ini untuk pengaturan database -->
        <env name="DB_CONNECTION" value="sqlite"/>
        <env name="DB_DATABASE" value=":memory:"/>
    </php>
</phpunit>

Untuk dapat menggunakan SQLite, kita pastikan pada PC kita sudah terinstall sqlite3 dan extension php7.0-sqlite3.

Oke sekarang kita jalankan lagi php unit untuk mengecek apakah perubahan pada file ini berdampak masalah/error.

Testing Success After phpunit/.xml

Sip, selama testing dapat “Hijau”, artinya tidak ada masalah. Sampai di sini proses konfigurasi awal testing di Project Laravel kita selesai. Pada artikel selanjutnya insyaallah kita akan membuat script testing pertama kita. Tahapannya, mendefinisikan fitur yang akan dibuat kemudian menterjemahkan fitur-fitur tersebut menjadi method-method testing.

Jika ada pertanyaan tentang artikel ini, silakan teman-teman tulis di komentar. Terima kasih atas waktunya sudah berkenan membaca.