Nafies Luthfi

Life will always feel wonderful if we always think positively.

Testing Laravel: Menggunakan Fitur Data Provider PHPUnit

Bismillahirrahmaanirrahiim.

Dari artikel sebelumnya yang membahas tentang testing laravel, kita membuat beberapa test method untuk menguji validasi form register user. Ini kita lakukan karena ingin menguji apakah nilai yang kita berikan sudah sesuai dengan validasi form yang kita tentukan.

Nah, ternyata untuk melakukan hal seperti ini, kita bisa menggunakan fitur Data Provider dari PHPUnit. Saya bisa mencoba fitur Data Provider ini setelah membaca artikel ini: Tidying Up Your PHPUnit Tests with Data Providers.

Dengan menggunakan Data Provider, kita cukup membuat dua method, yaitu:

  1. Satu test method,
  2. Satu method untuk menyediakan data yang diujikan.

Kedua method ini membuat phpunit menjalankan satu method test beberapa kali dengan nilai yang berbeda.

Persiapan Praktek

Baik, seperti artikel-artikel testing laravel sebelumnya, kita sambung project yang sudah ada di repo ini : Laravel TDD, tepatnya di commit ini.

Bagi teman-teman yang ingin ikut praktek silakan clone repository tersebut, install dan jalankan vendor/bin/phpunit. Pastikan teman-teman dapat hijau dulu pada testingnya.

Before Data Provider

Hasilnya: OK (21 tests, 86 assertions).

Langsung Praktek

Baik, sekarang kita buka file tests/Feature/Auth/RegisterTest.php kita tambahkan dua method ini:

<?php
// Class RegisterTest.php

// ... getRegisterFields()

// ... user_can_register()

/**
 * @test
 * @dataProvider registrationDataProvider
 */
public function validate_user_register_form($errorField, $formFields)
{
    $this->post('/register', $this->getRegisterFields($formFields));

    $this->assertSessionHasErrors([$errorField]);
}

public function registrationDataProvider()
{
    return [
        // error pada field name, jika name kosong
        ['name', ['name' => '']],
        // error pada field name, jika name panjang 260 karakter
        ['name', ['name' => str_repeat('John Thor ', 26)]],

        // error pada field email, jika email kosong
        ['email', ['email' => '']],
        // error pada field email, jika mengisi email yang tidak valid
        ['email', ['email' => 'username.example.net']],
        // error pada field email, jika mengisi email yang terlalu panjang
        ['email', ['email' => str_repeat('username@example.net', 13)]],

        // error pada field password, jika password kosong
        ['password', ['password' => '']],
        // error pada field password, jika password kurang dari 6 karakter
        ['password', ['password' => 'ecret']],
        // error pada field password, jika konfirmasi password tidak sama
        ['password', ['password' => 'secret', 'password_confirmation' => 'escret']],
    ];
}

// ... user_email_must_be_unique_on_users_table()

Nah kedua method tersebut dapat menggantikan delapan test method lainnya:

1. user_name_is_required
2. user_name_maximum_is_255_characters
3. user_email_is_required
4. user_email_must_be_a_valid_email
5. user_email_maximum_is_255_characters
6. user_password_is_required
7. user_password_minimum_is_6_characters
8. user_password_must_be_same_with_password_confirmation_field

Sekarang kedelapan method di atas bisa dihapus. Lalu kita jalankan vendor/bin/phpunit lagi:

After Data Provider

Seharusnya hasilnya tetap sama OK (21 tests, 86 assertions).

Penjelasan Penggunaan Data Provider

Data Provider adalah fitur PHPUnit yang memungkinkan kita menjalankan beberapa test dengan hanya menggunakan satu test method.

Pada method yang dijadikan Data Provider, seperti registrationDataProvider(), di sana kita me-return numeric array yang terdiri dari 8 value. Analoginya:

public function dataProviderMethod()
{
    return [
        [$var1, $var2], // value loop 1,
        [$var3, $var4], // value loop 2,
        [$var5, $var6], // value loop 3,
        ...
    ];
}

Ketika phpunit dijalankan pada test method yang memiliki @dataProvider dataProviderMethod, maka phpunit akan menjalankan test berulang-ulang (loop) sebanyak jumlah value yang berasal dari dataProviderMethod. Jika ada 3 value, maka test method tersebut diulang 3 kali.

Setiap perulangan test method, phpunit menggunakan value dari masing-masing loop tadi pada test method yang bersangkutan. Jadi :

  1. $var1 dan $var2 digunakan pada loop pertama.
  2. $var3 dan $var4 digunakan pada loop kedua.
  3. $var5 dan $var6 digunakan pada loop ketiga.
  4. Dan seterusnya …

Seperti yang sudah kita kerjakan di atas, satu test method yang mendapatkan bantuan dari data provider berisi 8 value, maka test method akan diulang 8 kali, sehingga dapat menggantikan 8 test method lainnya.

Kesimpulan

Fitur data provider dapat mempermudah kita dalam:

  1. Menguji satu helper function dengan beberapa kondisi nilai (parameter dan nilai return nya).
  2. Menguji fitur validasi form dalam framework laravel.

Baik, sampai di situ contoh penggunaan data provider pada phpunit. Penjelasan detailnya dapat teman-teman lihat di dokumentasi PHPUnit-nya.

Perubahan script yang dikerjakan pada artikel ini, dapat teman-teman lihat di commit ini. Terima kasih atas waktunya. Semoga bermanfaat.