Belajar Membuat Test Driven Development Di Laravel - CRUDPRO

Belajar Membuat Test Driven Development Di Laravel

Belajar Membuat Test Driven Development Di Laravel

Apakah itu Test Driven Development (TDD)

Dengan singkat, Test Driven Development ialah sebuah sistem pengembangan perangkat lunak yang dikontrol oleh pengetesan atau tes . Maka, lebih simpelnya ialah kita diharuskan menulis code untuk testing lebih dahulu saat sebelum menulis code untuk program. Kurang lebih jalur kerjanya semacam ini :

  • Menulis skrip pengetesan / tes, upayakan menulikan semua peluang atau harapan yang dapat terjadi dalam kasus itu.
  • Lakukan tes, pasti menemukan kegagalan, sudah pasti karena kita belum menulis code implementasinya.
  • Catat code sama sesuai harapan dari skrip pengetesan / tes, maksudnya supaya bisa memenuhi skrip pengetesan.
  • Lakukan ulangi tes, jika ada tes yang tidak berhasil, karena itu perbaiki kembali kodenya sampai penuhi semua skrip pengetesan / tes.
  • Bila berasa code yang dicatat berantakan, kurang maksimal, kerjakan refactor. Bila tes dijalankan kembali dan hasilnya masih tetap penuhi tes, jadi tidak ada permasalahan hasil dari refactoring kita.

Memahami Susunan File dan Komposisi Tes di Laravel

Untuk komposisi testing di Laravel bisa dikonfigurasikan pada file phpunit.xml yang ada pada directory khusus project Laravel. Kita juga bisa membuat file .env.testing pada directory khusus project, file itu akan mengoverride file.env tuliskan kita jalankan tes PHPUnit.

Laravel mempunyai class TestCase sendiri yang extends dari class TestCase punya PHPUnit dengan beberapa penyesuaian dari Laravel. Mari kita lihat pada file ExampleTest pada directory tests/Fitur atau tes/Unit mereka sama mengextends class TestsTestCase. Di mana class TestsTestCase extends ke BaseTestCase yang disebut alias dari IlluminateFoundationTestingTestCase dalam class itu ada banyak beberapa fungsi yang tidak kita ulas dalam artikel ini, hanya agar kita cukup memahami mengenai asal mula class tes dari Laravel.

Saat sebelum menulis tes pertama kita, sebaiknya kita melihat contoh tes yang berada 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);
    }
}

Bila kita lihat, dalam penulisan metode tes diawali dengan tes atau umum disebutkan prefix. Hal itu ialah harus hukumnya saat menulis metode untuk testing supaya metode teersebut dipandang seperti mehod yang berisi tes.

Menjalankan Tes Contoh

Untuk menjalankan tes kita pakai perintah pada CLI (Command Line Interface) atau Terminal. Perintah yang dijalankan seperti berikut :

vendor/bin/phpunit

Sesudah kita jalankan perintah itu, kita akan menemui penampilan kurang lebih seperti ini pada terminal kita.

Belajar Membuat Test Driven Development Di Laravel

Hasil menjalankan PHPUnit

Oke, kita dapat membaca ada 2 tes dan 2 assertion. 2 tes ini datang dari 2 file ExampleTest yang ada pada directory Fitur dan Unit. Dalam pada itu 2 assertion (tuntutan) berasal dari tiap-tiap file itu. Untuk assertiion di dalam 1 metode tes dapat ada banyak assertion.

Membuat dan Menulis Tes Pertama

Seperti umumnya, dengan Laravel kehidupan kita dipermudahkan dengan perintah Artisan. Begitupun untuk membuat file tes kita dapat manfaatkan perintah Artisan yang ada. Oke, mari kita buat file tes pertama kita dengan Artisan, misalkan kita akan membuat suatu tes simpel untuk CRUD Artikel.

php artisan make:test ArticleTest

Secara default file tes akan dibuat di dalam direktori Fitur. 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 mengganti nama metode lebih dulu supaya sesuai tes yang akan kita buat. Pertama kita akan membuat tes untuk pastikan pada halaman artikel, pemakai dapat melihat semua artikel. Untuk nama metode akan kita buat testUserCanSeeAllArticles(), oke nama tes telah kita tetapkan, tetapi cukup sulit membaca nama semacam ini. Untungnya PHPUnit memberi alternative untuk menulis tes, yakni dengan annotation, dan kita dapat memakai snake_case untuk nama metodenya. Maka lebih kurang semacam ini.

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

    $response->assertStatus(200);
}

Saat ini silahkan kita coba untuk jalankan tesnya, tetapi ini kali dengan Artisan saja ya, lebih enak menulis perintahnya. Ohya perlu dicatat, perintah ini ada mulai Laravel 7 ya.

php artisan test
Belajar Membuat Test Driven Development Di Laravel

Tampilan artisan test

Tes yamg kita tulis tidak memberi error, Oke. Selainnya memudahkan untuk jalankan tes, dengan Artisan, penampilan hasil tes lebih rapi serta lebih nyaman dibaca.

Baik, silahkan kita coba buat sebuah scenario untuk tampilkan halaman artikel kita, lebih kurang semacam ini scenario sederhananya.

  • Halaman artikel akan diakses pada url /articles.
  • Halaman artikel akan tampilkan judul artikel
  • Untuk tambahan, kita dapat mendefinisikan secara detail 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 menjalankan, akan menghasilkan pesan error yang menandakan bahwa aplikasi kita belum memenuhi test yang kita tulis.

Belajar Membuat Test Driven Development Di Laravel

Test Gagal

Menulis Code untuk Memenuhi Test

Seperti kita ketahui di atas jika saat dijalankan tesnya, kita menemui hasil yang tidak berhasil. Kita kenali jika 404 ialah code untuk halaman yang tidak diketemukan maknanya tidak ada route /articles yang kita harap. Untuk menuntaskan, mari kita catat sebuah route di web.php.

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

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

Belajar Membuat Test Driven Development Di Laravel

Error mengharapkan repson yang sesuai.

Setelah itu kita coba berikan response yang diinginkan

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

Mari kita lakukan lagi tesnya. Masih tetap ada error, ini kali karena pada tes kita menginginkan responnya ialah sebuah view.

Belajar Membuat Test Driven Development Di Laravel

Error karena semestinya tanggapan berbentuk view.

Silahkan kita samakan kembali kodenya dan buat file view article/index.blade.php seperti yang kita harap pada tes dan isi dalam kata "Judul Website".

Judul Blog

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

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

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

Belajar Membuat Test Driven Development Di Laravel

Test Sukses

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

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

Selanjutnya kita dapat jalankan tes untuk memastikan jika refactor yang kita kerjakan masih tetap sama sesuai tes. Dan berikut salah satunya keuntungan kita menulis sebuah tes, kita dapat lakukan perubahan lebih optimis karena kita dapat jalankan tes secara automatis dan memperoleh masukan dari perubahan kita.