18:58:36 8/5/2024 - 15 lượt xem
Kiểm thử Laravel
Trong Laravel, có 2 loại kiểm thử:
- Kiểm thử đơn vị
- Kiểm thử tính năng
Kiểm thử đơn vị chỉ tập trung vào một đoạn mã nhỏ (thường là một phương thức trong một lớp), trong khi kiểm thử tính năng xác minh xem một tính năng cụ thể, có thể bao gồm nhiều phương thức hoặc lớp tương tác với nhau, có hoạt động đúng như bạn thiết kế hay không.
Tạo kiểm thử
- Tạo một kiểm thử tính năng
php artisan make:test UserTest
- Tạo một kiểm thử đơn vị
php artisan make:test UserTest --unit
Bắt đầu
Để làm quen với kiểm thử Laravel, khi bạn chạy một trong hai lệnh trên để tạo kiểm thử, Laravel sẽ tạo một thư mục với cấu trúc như sau:
tests
___Feature
* |___ExampleTest.php*
* |___UserTest.php*
___Unit
* |___ExampleTest.php*
Bạn có thể chạy lệnh này để bắt đầu các kiểm thử:
./vendor/bin/phpunit
Kết quả sẽ hiển thị thông báo cho tất cả các kiểm thử.
Bây giờ, tôi sẽ chỉnh sửa một đoạn trong UserTest.php:
public function test_example(): void
{
$x = 1 + 1;
$this->assertTrue($x == 3);
}
Nếu bạn chạy kiểm thử, sẽ nhận được lỗi ở hàm test_example(), vì kết quả của phép tính là 2, không phải 3.
Gọi API
Có 2 cách để gửi một yêu cầu (gọi API):
1. withHeaders
$response = $this->withHeaders([
'Accept' => 'application/json',
'Content-Type' => 'application/json',
'Authorization' => 'Bearer ' . $jwtToken,
])->json('POST', '/endpoint');
$this->assertEquals(200, $response->status());
2. postJson
$headers = ['Authorization' => 'Bearer ' . $jwtToken];
$response = $this->postJson('/personal/upload-image-editor', [], $headers);
$this->assertEquals(200, $response->status());
Phụ thuộc kiểm thử
Thông thường, các kiểm thử sẽ chạy theo thứ tự từ trên xuống dưới, nhưng trong trường hợp hàm của bạn là bất đồng bộ và bạn muốn đảm bảo thứ tự chính xác, bạn có thể sử dụng chú thích @depends.
Ví dụ, nếu bạn có một kiểm thử với 2 trường hợp:
- Tạo người dùng
- Xóa người dùng vừa tạo
Nếu bạn viết 2 hàm để thực hiện, có thể phương thức xóa sẽ chạy trước phương thức tạo, dẫn đến lỗi.
Để tránh điều này, PHPUnit hỗ trợ phụ thuộc kiểm thử qua chú thích @depends.
public function createUser(){}
/**
* @depends testEmpty
*/
public function deleteUser(){}
Mã trên sẽ đảm bảo hàm createUser được thực thi xong, sau đó hàm deleteUser mới được chạy.
Chạy kiểm thử
Chạy tất cả kiểm thử:
php artisan test
hoặc
./vendor/bin/phpunit
Chạy tất cả kiểm thử và hiển thị chi tiết lỗi (nếu có):
./vendor/bin/phpunit --testdox
Chạy một file kiểm thử cụ thể:
./vendor/bin/phpunit --testdox .\tests\Feature\UserTest.php
Hoặc bạn có thể chạy trực tiếp trong VS Code (Image 1)

Image 1: Chạy một file kiểm thử cụ thể trong VS Code
Chạy một file kiểm thử cụ thể và một hàm cụ thể:
./vendor/bin/phpunit --testdox .\tests\Feature\UserTest.php --filter createUser
Nhưng với ví dụ trên, nếu bạn muốn chạy một hàm cụ thể phụ thuộc vào hàm khác, sẽ xảy ra lỗi.
Hoặc bạn có thể chạy một hàm cụ thể trực tiếp trong VS Code (Image 2)

Image 2: Chạy một phương thức kiểm thử trong VS Code
Lấy dữ liệu từ phản hồi
Ví dụ, chúng ta gọi API tới máy chủ trả về JSON:
class myController{
function test()
{
return response()->json(['message' => 'Hello']);
}
}
Kiểm thử:
function test_get_message()
{
$response = $this->postJson('/test');
$this->assertEquals(200, $response->status());
$res= $response->json();
$message = $res['message'];
}
Truyền giá trị giữa các kiểm thử (hàm)
Trong PHPUnit, mỗi kiểm thử là độc lập, nghĩa là các biến của mỗi kiểm thử (hàm) sẽ không được chia sẻ với nhau.
Để chia sẻ biến giữa các hàm, phải sử dụng @depends, xem ví dụ sau:
public function test_create_post()
{
$id_post = 1;
return $id_post;
}
/**
* @depends test_create_post
*/
public function test_delete_post_illegal($id_post): void
{
//$id_post = 1
}
/**
* @depends test_create_post
*/
public function test_delete_post_legal($id_post): void
{
//$id_post = 1
}
Tham khảo
https://betterstack.com/community/guides/testing/laravel-unit-testing/