Testing Laravel: Login Feature Test

Bismillahirrahmanirrahim.

Sekian lama kita tidak membahas testing laravel di blog ini (terakhir tips TDD Laravel), sekarang kita coba bahas tentang testing fitur Login di laravel.

Login di framework laravel sudah disediakan “out of the box” melalui satu perintah artisan. Artinya sebenarnya sudah tidak perlu dibuatkan test lagi (karena sudah fitur resmi laravel), tetapi ada kalanya kita perlu memodifikasi fitur login ini, sesuai dengan kebutuhan sistem kita di masa datang. Jadi akan lebih baik jika kita memiliki feature test untuk ini.

Di artikel kita menggunakan repository github Laravel-TDD yang awal ya, yaitu pada commit c2feb56. Jika ingin mengikuti sama persis, silakan teman-teman clone repo itu ke localhost.

Pada project itu kita sudah memiliki fitur login, yang kita generate dengan perintah php artisan make:auth pada artikel ini. Jadi kita tinggal buat feature testnya saja.

Jalakan Testing Sebelum Mulai

Baik, seperti biasa, kita mulai kerja dengan menjalankan testing dulu.

# 1
$ vendor/bin/phpunit

OK (9 tests, 49 assertions)

Membuat Feature Test Login

$ php artisan make:test Auth/LoginTest

Kita akan mendapatkan testcase class baru di : tests/Feature/Auth/LoginTest.php. Sekarang edit untuk menyesuaikan fitur login kita. Buat test method baru registered_user_can_login, kemudian kita buat PHP comment line yang menjadi panduan kita.

<?php

namespace Tests\Feature\Auth;

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

class LoginTest extends TestCase
{
    /** @test */
    public function registered_user_can_login()
    {
        // Kita memiliki 1 user terdaftar

        // Kunjungi halaman '/login'

        // Submit form login dengan email dan password yang tepat

        // Lihat halaman ter-redirect ke url '/home' (login sukses).

        // Kita melihat halaman tulisan "Dashboard" pada halaman itu.
    }
}

Btw, langkah ini hanya sebagai panduan, jika teman-teman sudah fasih dengan testing, maka tidak perlu lagi membuat comment line seperti ini, boleh langsung testing scriptnya.

Baik, sekarang kita terjemahkan ke dalam bentuk script testing.

<?php

namespace Tests\Feature\Auth;

use App\User; // Tambahkan use model App\User
use Tests\TestCase;
use Illuminate\Foundation\Testing\RefreshDatabase;

class LoginTest extends TestCase
{
    // Trait refresh database agar migration dijalankan
    use RefreshDatabase;

    /** @test */
    public function registered_user_can_login()
    {
        // Kita memiliki 1 user terdaftar
        $user = factory(User::class)->create([
            'email'    => 'username@example.net',
            'password' => bcrypt('secret'),
        ]);

        // Kunjungi halaman '/login'
        $this->visit('/login');

        // Submit form login dengan email dan password yang tepat
        $this->submitForm('Login', [
            'email'    => 'username@example.net',
            'password' => 'secret',
        ]);

        // Lihat halaman ter-redirect ke url '/home' (login sukses).
        $this->seePageIs('/home');

        // Kita melihat halaman tulisan "Dashboard" pada halaman itu.
        $this->seeText('Dashboard');
    }
}

Kita tambahkan penggunaan trait RefreshDatabase agar testing menjalankan artisan migrate, seperti yang pernah kita lakukan waktu mendapatan passed test pertama.

Sekarang kita jalankan PHPUnitnya:

# 2
$ vendor/bin/phpunit
Hasil: Passed

Login Test Passed

Langsung hijau? Betul, fitur loginnya sudah ada, kita hanya membuat testingnya saja.

Membuat Test Method Logout

Sekarang kita buat testing fitur logout. Kita edit lagi file tests/Feature/Auth/LoginTest.php tambahkan test method baru: logged_in_user_can_logout.

<?php

// ...

class LoginTest extends TestCase
{
    // ... registered_user_can_login()
    
    /** @test */
    public function logged_in_user_can_logout()
    {
        // Kita memiliki 1 user terdaftar

        // Login sebagai user tersebut

        // Kunjungi halaman '/home'

        // Buat post request ke url '/logout'

        // Kunjungi (lagi) halaman '/home'

        // User ter-redirect ke halaman '/login'
    }
}

Lanjut, kita buat testing scriptnya.

<?php

// ...

class LoginTest extends TestCase
{
    // ... registered_user_can_login()
    
    /** @test */
    public function logged_in_user_can_logout()
    {
        // Kita memiliki 1 user terdaftar
        $user = factory(User::class)->create([
            'email'    => 'username@example.net',
            'password' => bcrypt('secret'),
        ]);

        // Login sebagai user tersebut
        $this->actingAs($user);

        // Kunjungi halaman '/home'
        $this->visit('/home');

        // Buat post request ke url '/logout'
        $this->post('/logout');

        // Kunjungi (lagi) halaman '/home'
        $this->visit('/home');

        // User ter-redirect ke halaman '/login'
        $this->seePageIs('/login');
    }
}

Simpan, kemudian jalankan PHPUnit.

# 3
$ vendor/bin/phpunit
Hasil: Passed

Logout Test Passed

Selesai sampai di sini misi kita.

Kesimpulan

Mungkin ada yang bertanya, mengapa testing untuk fitur login dan logout ini perlu dilakukan? Bukankah fitur login bawaan laravel ini sudah handal dan teruji? Well, testing ini lebih bertujuan sebagai backup kita (developer) jika ada kebijakan baru. Kita tidak tahu jika aplikasi web kita kedepannya mengalami perubahan kebijakan, misalnya:

  1. User boleh login dengan username atau email, atau
  2. User yang bisa login, akun harus diaktifkan melalui email dulu, atau
  3. Ada fitur suspend user di dalam sistem, jika user berstatus suspend, maka dia tidak dapat login, atau
  4. Login sebagai tipe user tertentu akan ter-redirect ke halaman yang berbeda dengan user tipe lain, atau
  5. Setelah user login, ada flash message untuk user : “Selamat datang kembali, John Thor”.

Atau berbagai macam perubahan kebijakan lain terkait urusan login user. Dengan adanya automated testing pada fitur ini, kita dapat dengan mudah menyesuaikan aplikasi/sistem dengan kebijakan baru.

Semua kode yang telah kita kerjakan pada artikel ini, bisa teman-teman lihat di pada file LoginTest.php ini.

Demikian teman-teman terima kasih atas waktunya, semoga bermanfaat.

comments powered by Disqus