Table of Contents

Pengenalan

Laravel dibangun dengan mempertimbangkan faktor pengujian. Dukungan untuk pengujian dengan PHPUnit sudah disertakan dan file phpunit.xml sudah terdapat di dalam aplikasi. Di dalamnya juga dilengkapi dengan metode helper yang mudah digunakan dan memungkinkan anda menguji aplikasi secara ekspresif.

Secara default, di dalam Laravel terdapat direktori direktori Test yang di dalamnya berisi dua direktori: Feature dan Unit.

  • Unit adalah pengujian yang berfokus pada bagian kode yang sangat kecil dan terisolasi. Faktanya, sebagian besar pengujian unit mungkin berfokus pada satu metode. Pengujian dalam direktori pengujian “Unit” Anda tidak mem-boot aplikasi Laravel Anda dan oleh karena itu tidak dapat mengakses database aplikasi Anda atau layanan kerangka kerja lainnya.
  • Fitur dapat menguji sebagian besar kode Anda, termasuk bagaimana beberapa objek berinteraksi satu sama lain atau bahkan permintaan HTTP lengkap ke titik akhir JSON. Umumnya, sebagian besar pengujian Anda harus berupa pengujian fitur. Jenis pengujian ini memberikan keyakinan paling besar bahwa sistem Anda secara keseluruhan berfungsi sebagaimana mestinya.

File ExampleTest.php terdapat di direktori Feature dan Unit. Setelah menginstal aplikasi Laravel baru, jalankan perintah vendor/bin/phpunit atau php artisan test untuk memastikan Unit Test berjalan sebagaiman mestinya.

Persiapan Environment

Saat menjalankan pengujian, Laravel akan secara otomatis menyetel lingkungan konfigurasi ke pengujian karena variabel lingkungan ditentukan dalam file phpunit.xml. Laravel juga secara otomatis mengkonfigurasi sesi dan cache ke driver array sehingga tidak ada data sesi atau cache yang disimpan saat pengujian.

Anda bebas menentukan nilai konfigurasi lingkungan pengujian lainnya jika diperlukan. Variabel lingkungan pengujian dapat dikonfigurasi dalam file phpunit.xml aplikasi Anda, namun pastikan untuk menghapus cache konfigurasi menggunakan perintah php artisan config:clear sebelum menjalankan pengujian Anda!

Penerapan

Secara default, TestCase akan ditempatkan di direktori tests/Feature berikut ini adalah beberapa command untuk membuat TestCase beserta pilihannya :

				
					php artisan make:test LoginTest #default
php artisan make:test LoginTest --unit #Jika Anda ingin membuat test dalam direktori tests/Unit, Anda dapat menggunakan opsi --unit saat menjalankan perintah make:test
php artisan make:test LoginTest --pest #Jika Anda ingin membuat pengujian Pest PHP, Anda dapat memberikan opsi --pest pada perintah make:test:
php artisan make:test LoginTest --unit --pest #ptest di direktori unit
				
			

Setelah file test dibuat, Anda dapat menentukan metode pengujian seperti biasa menggunakan PHPUnit. Untuk menjalankan pengujian Anda, jalankan perintah ./vendor/bin/phpunit atau php artisan test dari terminal.

Login Test

Dalam penerapan Case Awal akan mencoba case LoginTest dengan option default. Disini kita akan mengecek url Login Form berjalan dengan baik/tidak, harap mengistall Breeze terlebih dahulu.

				
					php artisan make:test LoginTest
				
			

Hasilnya sbb :

tests/LoginTest

				
					<?php

namespace Tests\Feature;

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

class LoginTest extends TestCase
{
    /**
     * A basic feature test example.
     */
    public function test_login_screen_can_be_rendered(): void
    {
        $response = $this->get('/login');//ubah / menjadi /login

        $response->assertStatus(200);
    }
}
				
			
Jalankan Test
				
					./vendor/bin/phpunit
PHPUnit 10.5.10 by Sebastian Bergmann and contributors.

Runtime:       PHP 8.2.14
Configuration: /var/www/html/s21oa/cms/phpunit.xml

...                                                                 3 / 3 (100%)

Time: 00:00.196, Memory: 26.00 MB

OK (3 tests, 3 assertions)
				
			

Selanjutnya kita akan membuat Test Case terkait Authentication.

Registration Test

Persiapan

  • Sebelum memulai pastikan anda telah membuat file  .env.testing (sesuai dengan phpunit.xml) dengan database mengarah ke db testing
  • Buat Unit Test baru dengan nama RegistrationTest
				
					php artisan make:test RegistrationTest
				
			
				
					<?php

namespace Tests\Feature;

use App\Providers\RouteServiceProvider;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Foundation\Testing\WithFaker;
use Tests\TestCase;

class RegistrationTest extends TestCase
{
    use RefreshDatabase;
 
    public function test_registration_screen_can_be_rendered()
    {
        $response = $this->get('/register');
 
        $response->assertStatus(200);
    }
 
    public function test_new_users_can_register()
    {
        $response = $this->post('/register', [
            'name' => 'Test User',
            'email' => 'test@example.com',
            'password' => 'password',
            'password_confirmation' => 'password',
        ]);
 
        $this->assertAuthenticated();
        $response->assertRedirect(RouteServiceProvider::HOME);
    }
}

				
			

Penjelasan :

Di sini kita mempunyai dua metode pengujian dalam satu kelas, dimana keduanya terkait dengan form pendaftaran: satu memeriksa apakah form dapat dirender dengan benar, dan satu lagi memeriksa apakah pengiriman berfungsi dengan baik.

Pada test_user_can_register terdapat pernyataan $this->assertAuthenticated() dan $response->assertRedirect(). Kamu dapat memeriksa semua pernyataan yang tersedia di dokumentasi resmi PHPUnit dan Laravel Response. Ingatlah bahwa beberapa pernyataan umum terjadi pada $objek ini, sementara yang lain memeriksa $response spesifik dari panggilan rute.

Hal penting lainnya adalah penggunaan RefreshDatabase. Hal ini diperlukan ketika tindakan pengujian akan mempengaruhi database, seperti dalam contoh ini, registrasi menambahkan entri baru dalam tabel database user. Untuk itu, Anda perlu membuat database pengujian terpisah yang akan direfresh dengan php artisan migrate:fresh, setiap kali pengujian dijalankan.

Anda memiliki dua opsi: membuat database terpisah secara fisik, atau menggunakan database SQLite dalam memori. Keduanya dikonfigurasi dalam file phpunit.xml yang disertakan secara default dengan Laravel. Secara khusus, Anda memerlukan bagian ini:

				
					<php>
    <env name="APP_ENV" value="testing"/>
    <env name="BCRYPT_ROUNDS" value="4"/>
    <env name="CACHE_DRIVER" value="array"/>
    <!-- <env name="DB_CONNECTION" value="sqlite"/> -->
    <!-- <env name="DB_DATABASE" value=":memory:"/> -->
    <env name="MAIL_MAILER" value="array"/>
    <env name="QUEUE_CONNECTION" value="sync"/>
    <env name="SESSION_DRIVER" value="array"/>
    <env name="TELESCOPE_ENABLED" value="false"/>
</php>
				
			

Lihat DB_CONNECTION dan DB_DATABASE yang dikomentari? Jika Anda memiliki SQLite di server Anda, tindakan termudah adalah dengan menghapus komentar pada baris tersebut, dan pengujian Anda akan berjalan pada database dalam memori tersebut.

Dalam pengujian ini, kami menyatakan bahwa pengguna berhasil diautentikasi dan diarahkan ke beranda yang benar, namun kami juga dapat menguji data aktual dalam database.

Selain kode yang kita pakai yaitu:

				
					$this->assertAuthenticated();
$response->assertRedirect(RouteServiceProvider::HOME);
				
			

Kita juga dapat menggunakan Database Testing assertions dan melakukan percobaan lainnya seperti berikut :

				
					$this->assertDatabaseCount('users', 1);
 
// Or...
$this->assertDatabaseHas('users', [
    'email' => 'test@example.com',
]);

				
			
Login Test : Lanjutan

Mari kita lihat buka kembali file test/LoginTest lalu tambahkan beberapa baris berikut :

				
					<?php

namespace Tests\Feature;

use App\Providers\RouteServiceProvider;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Foundation\Testing\WithFaker;
use Tests\TestCase;

class LoginTest extends TestCase
{
    use RefreshDatabase;
 
    public function test_login_screen_can_be_rendered()
    {
        $response = $this->get('/login');
 
        $response->assertStatus(200);
    }
 
    public function test_users_can_authenticate_using_the_login_screen()
    {
        $user = User::factory()->create();
 
        $response = $this->post('/login', [
            'email' => $user->email,
            'password' => 'password',
        ]);
 
        $this->assertAuthenticated();
        $response->assertRedirect(RouteServiceProvider::HOME);
    }
 
    public function test_users_can_not_authenticate_with_invalid_password()
    {
        $user = User::factory()->create();
 
        $this->post('/login', [
            'email' => $user->email,
            'password' => 'wrong-password',
        ]);
 
        $this->assertGuest();
    }
}
				
			

Testing di atas mengenai Login Form. Logikanya mirip dengan registrasi, namun menjadi tiga metode, bukan dua, jadi ini adalah contoh pengujian skenario berhasil dan gagal. Jadi, logika umumnya adalah Anda harus menguji kedua kasus tersebut: kapan semuanya berjalan baik dan kapan gagal.

Selain itu, apa yang Anda lihat dalam pengujian ini adalah penggunaan  Database Factories  pada perintah User::factory->create() dimana Laravel membuat fake user (sekali, pada basis data pengujian Anda yang telah direfresh) dan kemudian mencoba masuk, dengan kredensial yang benar atau salah.

database/factories/UserFactory.php(tidak perlu dibuat hanya untuk mereview) :

				
					public function definition(): array
    {
        return [
            'name' => fake()->name(),
            'email' => fake()->unique()->safeEmail(),
            'email_verified_at' => now(),
            'password' => static::$password ??= Hash::make('password'),
            'remember_token' => Str::random(10),
        ];
    }
				
			

Dapat kita lihat berapa banyak hal yang disiapkan oleh Laravel sendiri, sehingga mudah bagi kita untuk memulai pengujian?

Jadi, jika kita menjalankan php artisan test setelah menginstall Laravel Breeze, kita akan melihat sesuatu seperti ini:

				
					php artisan test
 PASS  Tests\Feature\LoginTest
  ✓ login screen can be rendered  41.88s  
  ✓ users can authenticate using the login screen   0.34s  
  ✓ users can not authenticate with invalid password 0.33s
				
			
PEST: Alat Test Populer selain PHPUnit

Semua contoh di atas didasarkan pada alat pengujian Laravel default: PHPUnit. Namun selama bertahun-tahun alat lain bermunculan di ekosistem, dan salah satu alat terbaru yang populer adalah PEST. Dibuat oleh karyawan resmi Laravel, Nuno Maduro, ini memiliki tujuan untuk menyederhanakan sintaksis, sehingga menulis kode untuk pengujian menjadi lebih cepat.

Sebagai perbandingan kita akan menampilkan kode contoh dari keduanya :

tests/Feature/ExampleTest.php

				
					namespace Tests\Feature;
 
use Illuminate\Foundation\Testing\RefreshDatabase;
use Tests\TestCase;
 
class ExampleTest extends TestCase
{
    public function test_the_application_returns_a_successful_response()
    {
        $response = $this->get('/');
 
        $response->assertStatus(200);
    }
}
				
			

Sementara jika menggunakan Pest kodenya akan menjadi sbb :

				
					test('the application returns a successful response')->get('/')->assertStatus(200);
				
			

Ya hanya SATU baris kode, dan hanya itu. Jadi, tujuan PEST adalah mempersingkat kode. Untuk menghasilkan pengujian PEST di Laravel, kita hanya perlu menambahkan flag tambahan yaitu –pest. Namun sebelumnya kita harus install pest terlebih dahulu.

				
					# Install Pest plugin for Laravel
composer require pestphp/pest-plugin-laravel --dev

# Install/Auto Configure Pest in your Laravel project
# will add Pest.php file in your project ./tests directory
php artisan pest:install
				
			

Lalu jalankan…

				
					php artisan make:test HomepageTest --pest
				
			

Ubah filenya sbb :

				
					<?php

test('example', function () {
    $response = $this->get('/login');

    $response->assertStatus(200);
});