Tanggal :29 September 2020
TDD Laravel Menulis Test Pertama, Belajar Test Driven Development

Belajar TDD Laravel : Menulis Test Pertama

Artikel ini bagian ke 1 dari 1 seri dalam artikel berseri "Belajar Automated Testing Laravel"

Assalamualaikum Warohmatulloh Wabarokatuh, setelah kita sedikit kenalan dengan Automated Testing sekarang kita akan lanjutkan dengan menulis test pertama kita. Ohya kita akan menggunakan metode Test Driven Development (TDD).

Apa itu Test Driven Development (TDD)

Secara singkat, Test Driven Development adalah sebuah metode pengembangan perangkat lunak yang dikendalikan oleh pengujian atau test. Jadi, lebih mudahnya adalah kita diwajibkan menulis kode untuk testing terlebih dulu sebelum menulis kode untuk aplikasi. Kurang lebih alur kerjanya seperti ini :

  • Menulis skrip pengujian / test, usahakan menulikan semua kemungkinan atau ekspektasi yang bisa terjadi dalam kasus tersebut.
  • Jalankan test, pasti akan menemukan kegagalan, tentu saja karena kita belum menulis kode implementasinya.
  • Tulis kode sesuai ekspektasi dari skrip pengujian / test, tujuannya agar bisa memenuhi skrip pengujian.
  • Jalankan ulang test, jika masih terdapat test yang gagal, maka perbaiki lagi kodenya hingga memenuhi semua skrip pengujian / test.
  • Jika merasa kode yang ditulis berantakan, kurang optimal, lakukan refactor. Jika test dijalankan kembali dan hasilnya tetap memenuhi test, maka tidak ada masalah dari hasil refactoring kita.

Memahami Struktur File & Konfigurasi Test di Laravel

Untuk konfigurasi testing di Laravel dapat dikonfigurasikan pada file phpunit.xml yang terdapat pada direktori utama proyek Laravel. Kita bisa juga membuat file .env.testing pada direktori utama proyek, file tersebut akan mengoverride file .env ketikan kita menjalankan test PHPUnit.

Laravel memiliki class TestCase sendiri yang extends dari class TestCase milik PHPUnit dengan banyak penyesuaian dari Laravel. Mari kita lihat pada file ExampleTest pada direktori tests/Feature atau test/Unit mereka sama-sama mengextends class Tests\TestCase. Dimana class Tests\TestCase extends ke BaseTestCase yang merupakan alias dari Illuminate\Foundation\Testing\TestCase dalam class tersebut terdapat banyak sekali fungsi fungsi yang tidak akan kita bahas dalam artikel ini, hanya supaya kita agak mengerti tentang asal muasal class test dari Laravel.

Sebelum menulis test pertama kita, ada baiknya kita melihat contoh test yang ada di class ExampleTest.

<?php

namespace Tests\Feature;

use Illuminate\Foundation\Testing\RefreshDatabase;
use Tests\TestCase;

class ExampleTest extends TestCase
{
    /**
     * A basic test example.
     *
     * @return void
     */
    public function testBasicTest()
    {
        $response = $this->get('/');

        $response->assertStatus(200);
    }
}

Jika kita perhatikan, dalam penulisan method test diawali dengan test atau biasa disebut prefix. Hal tersebut adalah wajib hukumnya ketika menulis method untuk testing agar method teersebut dianggap sebagai mehod yang berisi test.

Menjalankan Test Contoh

Untuk menjalankan test kita gunakan perintah pada CLI (Command Line Interface) atau Terminal. Perintah yang dijalankan sebagai berikut :

vendor/bin/phpunit

Setelah kita jalankan perintah tersebut, kita akan menjumpai tampilan kurang lebih seperti ini pada terminal kita.

Belajar Automated Testing Laravel : Menulis Test Pertama
Hasil menjalankan PHPUnit

Oke, kita bisa baca terdapat 2 test dan 2 assertion. 2 test ini berasal dari 2 file ExampleTest yang ada dalam direktori Feature dan Unit. Sementara itu 2 assertion (tuntutan) juga berasal dari masing-masing file tersebut. Untuk assertiion dalam 1 method test bisa terdapat beberapa assertion.

Membuat & Menulis Test Pertama

Seperti biasa, dengan Laravel kehidupan kita dipermudah dengan perintah Artisan. Begitu juga untuk membuat file test kita bisa memanfaatkan perintah Artisan yang tersedia. Oke, ayo kita buat file test pertama kita dengan Artisan, misalnya kita akan membuat sebuah test sederhana untuk CRUD Artikel.

php artisan make:test ArticleTest

Secara default file test akan dibuat di dalam direktori Feature. Jika ingin membuat testing unit kita bisa menambahkan flag --unit.

php artisan make:test ArticleTest --unit

Kurang lebih file / class yang dibuat akan berisi seperti ini.

<?php

namespace Tests\Feature;

use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Foundation\Testing\WithFaker;
use Tests\TestCase;

class ArticleTest extends TestCase
{
    /**
     * A basic feature test example.
     *
     * @return void
     */
    public function testExample()
    {
        $response = $this->get('/');

        $response->assertStatus(200);
    }
}


Pertama, kita akan mengubah nama method terlebih dahulu agar sesuai dengan test yang akan kita buat. Pertama kita akan membuat test untuk memastikan pada halaman artikel, pengguna bisa melihat semua artikel. Untuk nama method akan kita buat testUserCanSeeAllArticles(), oke nama test sudah kita tentukan, tapi cukup susah membaca nama seperti ini. Untungnya PHPUnit memberikan alternatif untuk menulis test, yaitu dengan annotation, dan kita bisa menggunakan snake_case untuk nama methodnya. Jadi kurang lebih seperti ini.

/**
 * @test
 */
public function user_can_see_all_articles()
{
    $response = $this->get('/');

    $response->assertStatus(200);
}

Sekarang mari kita coba untuk jalankan testnya, tapi kali ini dengan Artisan aja ya, lebih enak nulis perintahnya. Ohya perlu dicatat, perintah ini tersedia mulai Laravel 7 ya.

php artisan test
Testing di Laravel
Tampilan artisan test

Test yamg kita tulis tidak memberikan error, Mantap. Selain mempermudah untuk menjalankan test, dengan Artisan, tampilan hasil test juga lebih rapi dan lebih enak dibaca.

Baiklah, mari kita coba buat sebuah skenario untuk menampilkan halaman artikel kita, kurang lebih seperti ini skenario sederhananya.

  • Halaman artikel akan diakses pada url /articles.
  • Halaman artikel akan menampilkan judul artikel
  • Untuk tambahan, kita bisa mendefinisikan secara spesifik untuk file view yang ingin digunakan untuk halaman ini.
/**
 * @test
 */
public function user_can_see_all_articles()
{
    $response = $this->get('/articles');

    $response->assertStatus(200);
    $response->assertSee('Judul Blog');
    $response->assertViewIs('article.index');
}

Ketika kita jalankan, akan menghasilkan pesan error yang menandakan bahwa aplikasi kita belum memenuhi test yang kita tulis.

Belajar TDD Laravel
Test Gagal

Menulis Kode untuk Memenuhi Test

Seperti kita ketahui di atas bahwa ketika dijalankan testnya, kita menemui hasil yang gagal. Kita ketahui bahwa 404 adalah kode untuk halaman yang tidak ditemukan artinya tidak ada route /articles yang kita harapkan. Untuk menyelesaikan, mari kita tulis sebuah route di web.php.

Route::get('/articles', function () {
    //
});

Setelah itu, coba jalankan testnya kembali. Kita akan menemui error yang berbeda kali ini. Kita mengharapkan ada tulisan “Judul Blog” pada test tapi kita tidak memberikan respon yang diharapkan.

TDD Laravel
Error mengharapkan repson yang sesuai.

Setelah itu kita coba berikan response yang diinginkan

Route::get('/articles', function () {
    return 'Judul Blog';
});

Mari kita jalankan lagi testnya. Masih ada error, kali ini karena pada test kita mengharapkan responnya adalah sebuah view.

Error karena harusnya respon berupa view.

Mari kita sesuaikan lagi kodenya & buat file view article/index.blade.php sesuai yang kita harapkan pada test dan isi dengan kata “Judul Blog”.

Judul Blog

Lalu, route juga perlu kita sesuaikan agar memberikan respon view.

Route::get('/articles', function () {
    return view('article.index');
});

Lalu kita coba jalankan lagi testnya, kali ini kita akan menemui pesan “PASS” yang artinya kode kita sudah lolos pengujian.

Test Sukses

Nah, sekarang kita coba untuk refactor pada file web.php.

Route::view('articles', 'article.index');

Kemudian kita bisa jalankan test untuk memastikan bahwa refactor yang kita lakukan tetap sesuai test. Dan inilah salah satu keuntungan kita menulis sebuah test, kita bisa melakukan perubahan dengan lebih percaya diri karena kita bisa menjalankan test secara otomatis dan mendapatkan feedback dari perubahan kita.

Wassalamualaikum Warohmatulloh Wabarokatuh.

Hi Saya Amirul, Saya mengajarkan koding melalui screencast di Kawan Koding, saya juga menulis Artikel di Kawan Koding.

Tinggalkan Balasan

Alamat email Anda tidak akan dipublikasikan. Ruas yang wajib ditandai *