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.
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.
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!
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.
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);
}
}
./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.
Persiapan
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',
]);
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
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);
});