Testing adalah komponen penting dalam pengembangan perangkat lunak yang memastikan bahwa kode yang kita tulis berfungsi dengan baik. Laravel, sebagai salah satu kerangka kerja PHP paling populer, menyediakan beragam fitur dan alat untuk memudahkan pengujian aplikasi Anda. Dalam artikel ini, kita akan menjelajahi cara membuat pengujian (testing) pada Laravel.
Jalankan command dibaah yang akan menggenerate sebuah file Test dengan nama ExampleFeatureTest , File akan di generate di path tests/Feature/ExampleFeatureTest.php
php artisan make:test ExampleFeatureTestKita akan membuat sebuah Test sederhana, Edit ExampleFeatureTest.php dan kita membuat sebuah fungsi kalkulator yang akan di test:
<?php
namespace Tests\Feature;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Foundation\Testing\WithFaker;
use Tests\TestCase;
class ExampleFeatureTest extends TestCase
{
/**
* A basic feature test example.
*/
public function test_example(): void
{
$response = $this->get('/');
$response->assertStatus(200);
}
public function calculate($number1, $number2, $operator)
{
switch ($operator) {
case '+':
$result = $number1 + $number2;
break;
case '-':
$result = $number1 - $number2;
break;
case '*':
$result = $number1 * $number2;
break;
case '/':
if ($number2 != 0) {
$result = $number1 / $number2;
} else {
throw new \Exception("Cannot divide by zero");
}
break;
default:
throw new \Exception("Invalid operator");
}
return [
'result' => $result,
];
}
public function test_calculator_testing()
{
$result = $this->calculate(5, 3, '+');
// var_dump($result);
$this->assertIsArray($result);
$this->assertArrayHasKey('result', $result);
$this->assertEquals(8, $result['result']);
}
}Jalankan Test:
php artisan test --filter ExampleFeatureTestSeperti kode diatas, Kita membuat sebuah fungsi kalkulator biasa dengan nama fungsi calculate($number1, $number2, $operator), yang akan menerima number1 dan number2 dan menerima simbol jenis operator yang digunakan (tambah,kurang,kali,bagi). Setelah itu kita membuat sebuah fungsi untuk menjalankan test fungsi kalkulator diatas dengan sebuah fungsi dengan nama test_calculator_testing(). Di awal nama function kita awali dengan nama test_ diikuti dengan keterangan test kita agar function testing dikenali.
Didala fungsi testCalculate(), kita mengecek kondisi fungsi kalkulator sesuai dengan jenis test yang akan kita cek.
Diatas kita cek jika fungsi calculate harus mereturn sebuah array dan harus mereturn sebuah key array dengan nama ‘result’ , kita juga cek kondisi return harus sesuai dengan kondisi yang kita input.
Jika kita memanggil calculate pertambahan dengan parameter calculate(5, 3, ‘+’) , makan fungsi calculate harus mereturn dengan nilai 8. jika kita ganti angka 8 dengan angka lain tentu test akan gagal
Membuat Contoh sederhana Test Login dan koneksi Database berbeda khusus untuk Testing.
Setting Configurasi Database Untuk testing:
Untuk melakukan testing kedatabase kita bisa memisahkan database utama dengan database khusus untuk testing. Sekarang kita akan mengkonfigurasi database untuk keperluan testing
Edit file .env dan tambahkan configurasi DB untuk testing:
DB_CONNECTION_TESTING=mysql
DB_HOST_TESTING=127.0.0.1
DB_PORT_TESTING=3306
DB_DATABASE_TESTING=db_name_for_test
DB_USERNAME_TESTING=username_db_test
DB_PASSWORD_TESTING=password_db_testEdit file .config/database.php dan tambahkan configurasi untuk testing:
'testing' => [
'driver' => env('DB_CONNECTION_TESTING', 'mysql'),
'host' => env('DB_HOST_TESTING', '127.0.0.1'),
'port' => env('DB_PORT_TESTING', '3306'),
'database' => env('DB_DATABASE_TESTING', 'db_name_for_test'),
'username' => env('DB_USERNAME_TESTING', 'username_db_test'),
'password' => env('DB_PASSWORD_TESTING', 'password_db_test'),
],Edit file phpunit.xml dan configurasi harus seperti dibawah ini:
<php>
<!-- ... -->
<env name="DB_CONNECTION" value="testing"/>
</php>Membuat File Testing
Disini kita anggap sudah mempunyai routes Rest API authentication untuk mengakses endpoint login dan juga endpoint profile.
Sekarang kita membuat sebuah file testing didalam path : tests/Feature/Auth/AutheticationTest.php . Jalankan perintah dibawah untuk membuat file test
php artisan make:test Auth/AutheticationTestEdit file AutheticationTest.php seperti dibawah ini:
<?php
namespace Tests\Feature\Auth;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Foundation\Testing\WithFaker;
use Tests\TestCase;
use App\Models\User;
class AutheticationTest extends TestCase
{
var $url='localhost:8000';
public function test_login_must_be_successfull(): void
{
// Attempt to log in
$response = $this->post('/api/v1/login', [
'email' => 'mahmud@gmail.com',
'password' => '123456',
]);
// Assert that the login was successful
$response
->assertStatus(201)
->assertJsonStructure([
'user' => [
'id',
'driver_no',
'driver_name',
'email',
],
'token'
]);
}
public function test_login_must_be_not_valid(): void
{
$response = $this->post('/api/v1/login', [
'email' => 'invalid@example.com',
'password' => 'invalidpassword',
]);
// Assert that the login failed
$response
->assertStatus(401)
->assertJson([
'message' => 'Not Authenticated' // Match the actual response case
]);
}
public function test_access_profile_has_logged(): void
{
$response = $this->get('/api/v1/profile');
$response
->assertStatus(200)
->assertJsonStructure([
'user' => [
'id',
'driver_no',
'driver_name',
'email',
],
]);
}
public function test_access_profile_error_token_invalid(): void
{
$response = $this->get('/api/v1/profile');
$response
->assertStatus(200)
->assertJson([
'user' =>null
]);
}
}Didalam class AutheticationTest diatas kita melakukan 4 buah test, dimana kita melakukan test jika berhasil login dan jika tidak berhasil login karena salah username dan password. Kita juga melakukan testing untuk akses profile jika sudah berhasil login, dengan syarat saat kita akses profile maka kita juga akan mengirimkan sebuah token diheader yang kita dapatkan saat login terlebih dahulu. Kita melakukan test akses profile jika token yang diberikan benar ataupun token salah.
Jalankan test untuk menguji.
php artisan test --filter AutheticationTest
Maka jika Test yang kta berikan benar maka semua test kita akan lolos.
Sebaliknya jika salah maka testing kita akan fails seperti gambar dibawah ini:


