Menguji Alur Autentikasi Laravel
Bad
28 Mei 2018

Tak kenal maka tak sayang.

Laravel adalah sebuah framework PHP yang dirilis dibawah lisensi MIT, dibangun dengan konsep MVC (model view controller). Dirancang untuk meningkatkan kualitas dengan mengurangi biaya pengembangan awal dan biaya pemeliharaan, dan untuk meningkatkan pengalaman bekerja dengan aplikasi. Laravel menyediakan sintaks yang ekspresif, jelas dan menghemat waktu.

Laravel menyediakan banyak fitur berguna seperti otentikasi, integrasi yang mudah.

Kembali ke judul, mari kita mulai

Pertama, mari kita bicara tentang apa yang dibuat oleh command berikut php artisan make:auth.

Ini akan menghasilkan beberapa route:

  • /login - GET dan POST, untuk mengautentikasi pengguna yang ada
  • /logout - POST, untuk logout saat pengguna terotentikasi
  • /register - GET dan POST, untuk membuat akun baru
  • /password/email - GET dan POST, untuk mengirim tautan ulang kata sandi
  • /password/reset /{token} - GET dan POST, untuk mereset kata sandi pengguna berdasarkan token yang dikirim melalui email

Menguji fitur login Ada beberapa hal yang harus diuji di sini:

  • pengguna dapat melihat form login
  • pengguna tidak dapat melihat form masuk saat dikonfirmasi
  • pengguna dapat masuk dengan kredensial yang benar
  • pengguna mendapatkan cookie remember me yang benar, jika memilih atau checklist remember me pada form login
  • pengguna tidak dapat masuk dengan email yang tidak ada
  • pengguna tidak dapat masuk dengan kata sandi salah
  • pengguna dapat keluar, ketika sudah diautentikasi
  • pengguna tidak dapat mencoba masuk lebih dari lima kali dalam satu menit (default)

Pfff. Sepertinya banyak sekali. Dan itu akan sangat sulit untuk diuji, bukan? Sebenarnya, Laravel menggunakan phpunit dan menambahkan banyak metode berguna di atas, jadi pengujian semua fitur ini sangat mudah. Jangan percaya saya? Kalau begitu mari kita lakukan bersama.

Pertama, kita akan membuat file /test/Feature/Auth/LoginTest.php. Ini akan menjadi class sederhana yang memperluas TestCase Laravel. Untuk membuatnya, jalankan saja php artisan make:test Auth/LoginTest. Ini adalah apa yang seharusnya Anda lihat dalam file LoginTest.php: Ketika sukses, file tersebut berisi seperti berikut:

<?php
namespace Tests\Feature\Auth;
use Tests\TestCase;
use Illuminate\Foundation\Testing\WithFaker;
use Illuminate\Foundation\Testing\RefreshDatabase;
class LoginTest extends TestCase
{
    /**
     * A basic test example.
     *
     * @return void
     */
    public function testExample()
    {
        $this->assertTrue(true);
    }
}

Mari lakukan pengujian pertama “pengguna dapat melihat form login”:

<?php
namespace Tests\Feature\Auth;
use Tests\TestCase;
use Illuminate\Foundation\Testing\WithFaker;
use Illuminate\Foundation\Testing\RefreshDatabase;
class LoginTest extends TestCase
{
    public function test_user_can_view_a_login_form()
    {
        $response = $this->get('/login');
        $response->assertSuccessful();
        $response->assertViewIs('auth.login');
    }
}

Sekarang mari kita jalankan untuk melihat apakah berhasil. Jalankan phpunit di console dan hasilnya: Imgur

Seperti yang Anda lihat, 3 tes telah dijalankan, dengan total 4 pernyataan. Itu karena ada tambahan dua contoh tes yang disediakan oleh Laravel secara default. Mudah, kan?

Menggunakan factory Laravel

Ok, sekarang mari kita lihat cara menangani "pengguna tidak dapat melihat form login saat diautentikasi". Pertama, kita harus membuat pengguna. Kita bisa melakukannya dengan:

<?php
factory(User::class)->create(); // Creates a user and inserts him into the database
factory(User::class)->make(); // Creates a user object

Mari kita tambahkan function berikut

<?php
// ...
class LoginTest extends TestCase
{
    // ...

    public function test_user_cannot_view_a_login_form_when_authenticated()
    {
        $user = factory(User::class)->make();
        $response = $this->actingAs($user)->get('/login');
        $response->assertRedirect('/home');
    }
}

Asserting menggunakan database

Selanjutnya, kita buat "pengguna dapat login dengan kredensial yang benar". Membuat pengguna (kali ini di database), atur kata sandi tertentu (misalnya, ‘secret’), buat permintaan dengan email dan kata sandi pengguna.

<?php
// ...
class LoginTest extends TestCase
{
    // ...

    public function test_user_can_login_with_correct_credentials()
    {
        $user = factory(User::class)->create([
            'password' => bcrypt($password = 'secret'),
        ]);
        $response = $this->post('/login', [
            'email' => $user->email,
            'password' => $password,
        ]);
        $response->assertRedirect('/home');
        $this->assertAuthenticatedAs($user);
    }
}

Mudahkan. Tapi, jika Anda menjalankan phpunit, Anda mungkin melihat error seperti ini: Imgur

Itu, dikarenakan kita belum membuat atau setting database kredensial, kita gunakan sqlite. Tambahkan pada file phpunit.xml:

<?xml version="1.0" encoding="UTF-8"?>
<phpunit>
    <!-- ... -->

    <php>
        <!-- ... -->

        <env name="DB_CONNECTION" value="sqlite"/>
        <env name="DB_DATABASE" value=":memory:"/>
    </php>
</phpunit>

Jalankan kembali phpunit, maka akan muncul error baru seperti ini: Imgur

Ini adalah konsep yang sangat penting dalam TDD dan pengujian perangkat lunak. Menjalankan tes harus selalu menghasilkan kesalahan baru. Kalau tidak, artinya Anda sedang memperbaiki hal-hal yang tidak rusak. Selalu mencoba untuk memperbaiki satu-satunya hal yang dicatat sebagai bug.

Kesalahan berikutnya, tidak adanya table users. Kita perlu menambahkan RefreshDatabase di class tersebut.

File yang seharusnya sekarang terlihat seperti ini:

<?php
namespace Tests\Feature\Auth;
use App\User;
use Tests\TestCase;
use Illuminate\Foundation\Testing\WithFaker;
use Illuminate\Foundation\Testing\RefreshDatabase;
class LoginTest extends TestCase
{
    use RefreshDatabase;

    public function test_user_can_view_a_login_form()
    {
        $response = $this->get('/login');
        $response->assertSuccessful();
        $response->assertViewIs('auth.login');
    }

    public function test_user_cannot_view_a_login_form_when_authenticated()
    {
        $user = factory(User::class)->make();
        $response = $this->actingAs($user)->get('/login');
        $response->assertRedirect('/home');
    }
    public function test_user_can_login_with_correct_credentials()
    {
        $user = factory(User::class)->create([
            'password' => bcrypt($password = 'secret'),
        ]);
        $response = $this->post('/login', [
            'email' => $user->email,
            'password' => $password,
        ]);
        $response->assertRedirect('/home');
        $this->assertAuthenticatedAs($user);
    }
}

Jalankan kembali phpunit. Imgur

Update function test_user_cannot_login_with_incorrect_password menjadi seperti berikut:

  public function test_user_cannot_login_with_incorrect_password()
    {
        $user = factory(User::class)->create([
            'password' => bcrypt('secret'),
        ]);

        $response = $this->from('/login')->post('/login', [
            'email' => $user->email,
            'password' => 'invalid-password',
        ]);

        $response->assertRedirect('/login');
        $response->assertSessionHasErrors('email');
        $this->assertTrue(session()->hasOldInput('email'));
        $this->assertFalse(session()->hasOldInput('password'));
        $this->assertGuest();
    }

Terima kasih.

Source here

Blog ini telah dibaca sebanyak 199 kali
laravel phpunit tdd

Sekilas Tentang Penulis

Parnowo
Bad

KOMENTAR

blog comments powered by Disqus