Menggunakan PEST Sebagai Testing Framework di Laravel

Belajar Pest

Assalamualaikum Warohmatullah Wabarokatuh, mungkin dari teman teman masih banyak yang asing dengan PEST, sama sebenarnya saya juga belum pernah implementasi secara langsung dalam proyek. Jadi, PEST adalah sebuah framework testing yang dibuat oleh Nuno Maduro, mungkin lebih tepatnya sebuah wrapper dari PHPUnit yang membuat menulis test lebih menyenangkan dan mudah. Bener nggak ? mari kita buktikan bersama.

Kali ini kita akan implementasikan pada Laravel, PEST bisa digunakan selain di Laravel juga kok. Anggaplah kita sudah punya proyek Laravel yang masih baru.

Menginstal PEST di Laravel

Pertama, instal Pest dengan composer

composer require pestphp/pest --dev --with-all-dependencies

Di Laravel kita membutuhkan pest-plugin-laravel dan menjalankan perintah artisan pest:install

composer require pestphp/pest-plugin-laravel --dev
php artisan pest:install

Terakhir kita bisa jalankan Pest dengan Command Line

./vendor/bin/pest

Menulis Test dengan PEST

Pest membuat menulis test menjadi mudah, untuk menulis test, buat sebuah file di dalam folder Unit atau Feature dan pastikan nama filenya diakhiri dengan suffix ...Test.php. Berikutnya jalankan testmu

it('has home', function() {
    // test
});
it('has home', function() {
   // test
});

Pest menawarkan dua fungsi untuk menulis test : test() dan it(). Gunakan yang paling cocok dalam penamaan testmu, atau gunakan keduanya, keduanya sama saja.

Praktik Dengan CRUD User

Baiklah, ga lengkap kalau kita menulis test tapi tanpa studi kasus, kali ini kita akan mencoba membuat test untuk CRUD data User dari tabel yang sudah disediakan Laravel dari pertama instal.

Secara singkat kita buat sebuah resource controller dengan artisan:

php artisan make:controller UserController -r

Kemudian daftarkan routenya di web.php

Route::resource('user', \App\Http\Controllers\UserController::class);

Berikutnya untuk membuat data kita gunakan factory, kita jalankan melalui php artisan tinker.

App\Models\User::factory()->count(10)->create();

Membuat Daftar User & Testnya

Tampilkan semua data user pada method index() di UserController

public function index()
{
    return view('user.index', [
        'users' => User::get()
    ]);
}

Jangan lupa buat file viewsnya pada resources/views/user/index.blade.php

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Data User</title>
</head>
<body>
    <h1>Data User</h1>
    <ul>
        @foreach ($users as $user)
            <li>{{ $user->name }} - {{ $user->email }}</li>
        @endforeach
    </ul>
</body>
</html>
Tampilan Index

Membuat file test dengan perintah artisan php artisan pest:test User/ListUserTest, kemudian sesuaikan testnya seperti ini.

use App\Models\User;
use function Pest\Laravel\get;
use Illuminate\Foundation\Testing\RefreshDatabase;

uses(RefreshDatabase::class);

test('url can be access', function() {
    get('/user')->assertStatus(200);
    get('/user')->assertSee('Data User');
});

test('contains user & email', function() {
    $users = User::factory()->count(10)->create();
    get('user')->assertSee($users->get(0)->name);
    get('user')->assertSee($users->get(0)->email);
});

Membuat Fungsi Tambah Data & Testnya

Untuk membuat fungsi data kita butuh dua method di controller, yaitu create() untuk menampilkan form & store() untuk fungsi menyimpan ke database.

public function create()
{
    return view('user.create');
}
public function store(Request $request)
{
    $user = new User();
    $user->name = $request->name;
    $user->email = $request->email;
    $user->password = bcrypt($request->password);
    $user->save();
    return redirect()->back();
}

Kemudian buat file create.blade.php pada folder yang sama dengan file index.blade.php sebelumnya.

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Tambah Data User</title>
</head>
<body>
    <h1>Tambah Data User</h1>
    <form action="{{ route('user.store') }}" method="POST">
        @csrf
        <div>
            <label for="">Nama</label>
            <input type="text" name="name">
        </div>
        <div>
            <label for="">Email</label>
            <input type="email" name="email">
        </div>
        <div>
            <label for="">Password</label>
            <input type="password" name="password">
        </div>
        <div>
            <input type="submit" value="Simpan">
        </div>
    </form>
</body>
</html>
Tampilan form tambah data

Membuat file test php artisan pest:test User/CreateUserTest, kemudian sesuaikan testnya seperti ini.

use function Pest\Laravel\assertDatabaseHas;
use function Pest\Laravel\get;
use function Pest\Laravel\post;

use Illuminate\Foundation\Testing\RefreshDatabase;

uses(RefreshDatabase::class);

test('can see create user page', function() {
    get('/user/create')->assertStatus(200);
    get('/user/create')->assertSee('Tambah Data User');
});

test('can create a new user', function() {
    post('/user', [
        'name' => 'Amirul',
        'email' => 'amirul.ihsan@raudhahpay.com',
        'password' => 12345678
    ]);
    
    assertDatabaseHas('users', ['name' => 'Amirul']);
});

Membuat Fungsi Update Data & Testnya

Seperti halnya fungsi menambahkan data, untuk update kita juga butuh 2 method di controller, yaitu edit() dan update(), kita buat sederhana saja.

public function edit(User $user)
{
    return view('user.edit', [
        'user' => $user,
    ]);
}
public function update(Request $request, User $user)
{
    $user->name = $request->name;
    $user->email = $request->email;
    $user->save();
    return redirect()->back();
}

Tentu saja kita butuh file tampilan, kita buat file edit.blade.php pada folder yang sama dengan file tampilan sebelumnya.

Tampilan form edit data

Kurang lebih tampilannya seperti di atas ketika akan mengedit data seorang user. Kemudian kita buat testnya php artisan pest:test User/UpdateUserTest,secara sederhana kita buat mengecek bahwa ketika kita membuka halaman edit, kita dapat melihat nama user yang akan diedit. Dan ketika kita submit atau kita jalankan fungsi update() maka akan terdapat satu data sesuai data yang kita masukkan waktu update.

use App\Models\User;
use Illuminate\Foundation\Testing\RefreshDatabase;

use function Pest\Laravel\assertDatabaseHas;
use function Pest\Laravel\get;
use function Pest\Laravel\put;

uses(RefreshDatabase::class);

test('can see edit user page', function() {
    $user = User::factory()->create();
    get('/user/'. $user->id .'/edit')->assertSee($user->name);
});

test('can edit user data', function() {
    $user = User::factory()->create();
    
    put('/user/'. $user->id, [
        'name' => 'Amirul',
        'email' => 'amirul.ihsan@raudhahpay.com',
    ]);
    assertDatabaseHas('users', ['name' => 'Amirul']);
});

Membuat Fungsi Hapus & Testnya

Terakhir kita akan buat fungsi hapus data, sederhana saja kita buat fungsi hapus data dari database saja.

public function destroy(User $user)
{
    $user->delete();
}

Lalu untuk testnya kita buat php artisan pest:test User/DeleteUserTest.

use App\Models\User;
use Illuminate\Foundation\Testing\RefreshDatabase;

use function Pest\Laravel\assertDatabaseHas;
use function Pest\Laravel\assertDatabaseMissing;
use function Pest\Laravel\delete;

uses(RefreshDatabase::class);

test('can delete user data', function() {
    $user = User::factory()->create();
    
    assertDatabaseHas('users', ['name' => $user->name]);
    
    delete('/user/'. $user->id);
    assertDatabaseMissing('users', ['name' => $user->name]);
});

Pada test di atas, kita membuat sebuah data user terlebih dahulu dan memastikan datanya ada pada database, kemudian kita hapus data dengan mengakses url hapus data, kemudian assertion berikutnya kita memastikan bahwa data yang dihapus sudah benar tidak ada dalam database.

Demikian percobaan kita menggunakan Pest sebagai framework testing di Laravel.

Wassalamualaikum Warohmatulloh Wabarokatuh.

Leave a Reply

Your email address will not be published.