Membuat Feature Test


Pada bagian ini, kita sudah mulai untuk menulis skrip di aplikasi. Hanya saja, skrip yang ditulis bukan untuk menampilkan respons data sesuai dengan bahasan tulisan sebelumnya. Namun, menulis skrip untuk mempersiapkan test (pengujian) aplikasi.

Lumen sudah menyediakan fitur test yang berbasis PHPUnit dalam paket instalasinya. Tentunya, ada beberapa perubahan agar test dapat beradaptasi dengan aplikasi berbasis Lumen.

Adapun fungsi pembuatan test adalah bertujuan untuk:

  1. Memastikan bahwa URL CRUD dapat diakses secara publik.
  2. Memastikan format data respons sudah sesuai dengan spesifikasi yang telah ditentukan di awal.

Dengan membuat test, juga memudahkan pemrogram untuk melakukan debug aplikasi ke depannya. Apabila test gagal dijalankan, sudah dipastikan ada kesalahan dalam aplikasi, baik berupa kesalahan fatal, maupun kesalahan minor seperti format data yang tidak sesuai.

Untuk menjalankan test, kita dapat menjalankan perintah di bawah melalui terminal. Pastikan kalau posisi direktori berada pada root aplikasi.

$ ./vendor/bin/phpunit

Gambar di bawah menunjukkan kalau sema test lolos uji coba. Test yang diuji merupakan contoh yang sudah ada dalam Lumen.

Test dengan PHPUnit

Test dengan PHPUnit

File test disimpan dalam direktori tests. Untuk permulaan, kalian dapat menghapus test contoh yang bernama ExampleTest.php dalam direktori tersebut. Langkah ini dilanjutkan dengan membuat test baru untuk menguji API CRUD user. Adapun nama berkasnya adalah UserTest.php.

Dalam berkas UserTest.php, kita menambahkan kelas baru dengan nama UserTest dan merupakan kelas turunan dari TestCase yang berada pada direktori yang sama. Perhatikan bawah class test harus menggunakan akhiran (suffix) dengan nama Test.

<?php

use App\User;

class UserTest extends TestCase
{

}

Dalam class di atas, kita akan menambahkan empat buah method yang masing-masing berperan untuk pengujian CRUD.

Dimulai dari uji coba untuk menampilkan data user lengkap dengan data pagination-nya. Nama method yang akan digunakan adalah testIndex(). Jika nama class harus menggunakan akhiran Test, maka nama method harus menggunakan awalan (prefix) berupa test.

public function testIndex()
{
    $test = $this->get('/user');

    $test->assertResponseOk();
    $test->seeJsonStructure([
        'data',
        'per_page',
        'next_page_url',
        'prev_page_url',
    ]);
}

Dalam method, saya membuat test untuk mengakses URI /user dari aplikasi. Kemudian mengujinya dengan method assertResponseOK() yang mengecek status HTTP harus 200 (OK). Kemudian menggunakan method seeJsonStructure() untuk memeriksa format data sudah benar.

{
    "current_page": 1,
    "data": [
        {
            "id": 1,
            "name": "Ms. Anais Green",
            "email": "swisozk@hotmail.com",
            "created_at": "2017-11-22 13:52:21",
            "updated_at": "2017-11-22 13:52:21"
        }
    ],
    "from": 1,
    "last_page": 21,
    "next_page_url": "http:\/\/localhost:8001\/user?page=2",
    "path": "http:\/\/localhost:8001\/user",
    "per_page": 5,
    "prev_page_url": null,
    "to": 5,
    "total": 102
}

Kenapa hanya strukturnya saja yang harus dicek? Bukan pengecekan bersamaan dengan datanya?

Karena, datanya bersifat dinamis, dan sebagai pemrogram kita akan kesulitan sekali menentukan data yang akan dikembalikan, khususnya berhubungan dengan sisipan data ke pangkalan data (database).

Jika kamu ingin menguji format data sekaligus isi datanya, maka dapat menggunakan method seeJson().

$test->seeJson([
    'status' => true,
    'message' => 'OK'
]):

Untuk menguji detail user, skrip yang digunakan kurang lebih pada testIndex(). Yang membedakan di antara keduanya adalah pengecekan format data dan URI yang diakses.

public function testShow()
{
    $user = factory(User::class)->create();

    $test = $user->get('/user/' . $user->id);

    $test->assertResponseOk();
    $test->seeJsonStructure([
        'data' => [
            'id',
            'name',
        ]
    ]);
}

Pada contoh testShow() di atas, saya membuat data user terlebih dahulu menggunakan factory model untuk memastikan data user sudah tersimpan dalam pangkalan data.

Yang perlu perhatian lebih adalah uji coba membuat user baru, karena di API butuh parameter yang harus diisi dari sisi klien, seperti name, email, dan password.

public function testCreate()
{
    $test = $this->post('/user', [
        'name' => 'Laravel Indonesia',
        'email' => 'laravel.id@gmail.com',
        'password' => 'secret'
    ]);

    $test->assertResponseStatus(201);
    $test->seeJsonStructure([
        'data' => [
            'id',
            'name'
        ]
    ]);
}

Pada testCreate(), kita menggunakan assertResponseStatus() dibanding assertResponseOK(). Dengan menggunakan assertResponseStatus(), kita dapat menentukan kode status yang diinginkan dalam aplikasi. Dalam contoh, aplikasi diharuskan mengembalikan kode HTTP 201 (Created).

Untuk test pembaruan dan hapus data user, skripnya kurang lebih sama seperti di atas. Beberapa hal mungkin perlu diubah, seperti method request untuk pembaruan yang menggunakan put() dan hapus user yang menggunakan delete().

Skrip lengkapnya dapat dilihat dan disalin pada media di bawah.

<?php

use App\User;

class UserTest extends TestCase
{
    public function testIndex()
    {
        $test = $this->get('/user');

        $test->assertResponseOk();
        $test->seeJsonStructure([
            'data',
            'per_page',
            'next_page_url',
            'prev_page_url',
        ]);
    }

    public function testShow()
    {
        $user = factory(User::class)->create();

        $test = $user->get('/user/' . $user->id);

        $test->assertResponseOk();
        $test->seeJsonStructure([
            'data' => [
                'id',
                'name',
            ]
        ]);
    }

    public function testCreate()
    {
        $test = $this->post('/user', [
            'name' => 'Laravel Indonesia',
            'email' => 'laravelwebidsss@gmail.com',
            'password' => 'secret'
        ]);

        $test->assertResponseStatus(201);
        $test->seeJsonStructure([
            'data' => [
                'id',
                'name',
            ]
        ]);
    }

    public function testUpdate()
    {
        $user = factory(User::class)->create();

        $test = $this->put('/user/' . $user->id, [
            'name' => $user->name . ' (UPDATED)'
        ]);

        $test->assertResponseOk();
        $test->seeJsonStructure([
            'data' => [
                'id',
                'name',
            ]
        ]);
    }

    public function testDelete()
    {
        $user = factory(User::class)->create();

        $test = $this->delete('/user/' . $user->id);

        $test->assertResponseOk();
        
        $test->seeJsonStructure([
            'data' => [
                'id',
                'name',
            ]
        ]);
    }
}

Terakhir, jika kita menjalankan test, sudah dipastikan hasil akhirnya gagal semua. Wajar, karena memang controller dan route untuk memroses data user belum dibuat sebelumnya. Komponen ini tersebut akan dibahas pada tulisan selanjutnya.

PHPUnit

Tak Berkategori

Yugo Purwanto

Pemrogram PHP dan JavaScript yang sedang sibuk mengembangkan aplikasi Glosarium Bahasa Indonesia.

Tinggalkan Balasan