Giới thiệu
Testing, hoặc kiểm thử, là một phần không thể thiếu trong quy trình phát triển phần mềm, đặc biệt là trong môi trường phát triển ứng dụng web. Trong đó, Laravel - một framework phát triển ứng dụng web của PHP đã cung cấp một hệ thống testing toàn diện và hiệu quả.
-
Tại sao lại cần testing?
- Đảm bảo chất lượng mã nguồn: Testing giúp đảm bảo rằng mã nguồn của ứng dụng Laravel hoạt động một cách chính xác và ổn định, từ đó tăng tính tin cậy và sự hài lòng của người dùng.
- Phát hiện và ngăn chặn lỗi: Testing cho phép phát hiện lỗi từ sớm, giúp giảm thiểu rủi ro và chi phí sửa chữa sau này trong quá trình phát triển và bảo trì ứng dụng.
- Hỗ trợ mở rộng và duy trì: Các bài kiểm tra được xây dựng sẵn giúp dễ dàng mở rộng và bảo trì mã nguồn, đảm bảo tính nhất quán và hiệu suất của ứng dụng trong quá trình phát triển và sau này.
-
Các loại testing:
- Kiểm thử đơn vị (Unit Testing): Kiểm thử từng phần riêng lẻ của mã nguồn.
- Kiểm thử tích hợp (Integration Testing): Kiểm thử tương tác giữa các thành phần khác nhau của ứng dụng.
- Kiểm thử tính năng (Feature Testing): Kiểm thử các tính năng cụ thể của ứng dụng thông qua HTTP requests và kiểm tra kết quả.
Cấu trúc thư mục
Trong Laravel, các function test
được viết trong thư mục tests, giúp việc quản lý test một cách dễ dàng.
Folder tests/
-
Feature: Thư mục này chứa các function test liên quan đến việc
feature test
, tập chung vào việc kiển thử các chức năng của hệ thống và thường được thực hiện thông qua HTTP Request. -
Unit: Thư mục này chứa các function test của
unit test
, chúng tập trung vào việc kiểm thử các phần riêng lẻ của mã nguồn mà không phụ thuộc vào các thành phần khác.
File TestCase.php
- Đây là một
abstract class
mà tất cả các test case trong Laravel kế thừa. Nó cung cấp các phương thức và thuộc tính cần thiết để viết và chạy các bài kiểm tra.
File phpunit.xml
- Đây là tập tin cấu hình cho PHPUnit, được sử dụng để xác định các cài đặt testing cụ thể cho ứng dụng Laravel của bạn, bao gồm cài đặt liên quan đến cơ sở dữ liệu, môi trường, và các tùy chọn khác.
Mocking
Mocking là quá trình tạo ra các đối tượng giả mạo, hoặc để thay thế các thành phần thực tế của ứng dụng. Điều này giúp bạn kiểm thử các phần của ứng dụng mà không phụ thuộc vào các thành phần ngoại vi thực tế. Ví dụ, khi bạn muốn kiểm thử một controller trong Laravel mà phụ thuộc vào một service, bạn có thể mock service đó để kiểm thử logic của controller mà không cần phải kết nối đến service thực tế.
// Ví dụ về mocking trong Laravel
public function testUserController()
{ // Tạo một mock của UserService $userService = $this->createMock(UserService::class); // Thiết lập phương thức mock $userService->expects($this->once()) ->method('getUser') ->willReturn(['id' => 1, 'name' => 'John Doe']); // Inject mock vào controller $controller = new UserController($userService); // Kiểm tra kết quả $result = $controller->getUser(); $this->assertEquals(['id' => 1, 'name' => 'John Doe'], $result);
}
Unit Testing
Unit Test là quá trình kiểm thử các thành phần cụ thể, hay đơn vị, của mã nguồn mà không phụ thuộc vào các phần khác của hệ thống. Trong Laravel, Unit Test được thực hiện thông qua việc viết các test case
để kiểm tra các phần riêng lẻ của ứng dụng như Models, Services, Repositories, và các lớp Helpers,...
Viết Test Cases cho Unit Test
Để viết test case
trong Laravel, bạn cần tạo một class test
tương ứng với thành phần bạn muốn kiểm thử. Trong class này, bạn sẽ định nghĩa các phương thức kiểm tra các phương thức và hành vi của thành phần đó.
Ví dụ:
class MathTest extends TestCase
{ public function testCalculateTotalPrice() { // Tạo một instance của Product Model $product = new Product(); // Thiết lập giá trị cho các thuộc tính của Product $product->price = 10; $product->quantity = 5; // Gọi phương thức calculateTotalPrice() $totalPrice = $product->calculateTotalPrice(); // Kiểm tra kết quả $this->assertEquals(50, $totalPrice); }
}
Chạy Test
Để chạy test bạn sử dụng câu lệnh php artisan test để thực hiện. Ngoài ra, nếu bạn chỉ muốn chạy 1 class cụ thể thì chỉ cần thêm flag --filter
php artisan test PASS Tests\Unit\MathTest
✓ calculateTotalPrice PHPUnit: 1 test completed in 103ms
Feature Testing
Feature Testing là một loại kiểm thử mà bạn kiểm tra các tính năng hoạt động như mong đợi của ứng dụng từ góc độ của người dùng cuối. Trong Laravel, Feature Testing được thực hiện thông qua việc sử dụng Laravel's HTTP Test để tương tác với ứng dụng thông qua HTTP requests và kiểm tra các kết quả trả về từ phản hồi của ứng dụng.
Ví dụ: kiểm tra tính năng đăng nhập
// Ví dụ về Feature Testing trong Laravel
public function testUserLogin()
{ $response = $this->post('/login', [ 'email' => 'example@email.com', 'password' => 'password', ]); $response->assertStatus(200) ->assertSessionHas('user');
}
Test code coverage
Test code coverage là một phương pháp được sử dụng trong quá trình kiểm thử phần mềm để đo lường mức độ phủ sóng của tests đối với mã nguồn. Mục tiêu của test code coverage là đảm bảo rằng mọi phần của mã nguồn được kiểm thử và đo lường được mức độ tin cậy của bộ tests.
Các thành phần của Test code coverage
Code coverage là tính độ bao phủ trung bình mà code đã chạy qua:
- lines (dòng code),
- functions & methods (các hàm và các phương thức),
- classes & traits
Tại sao phải viết test code coverage
- Đảm bảo code được viết ra là code sạch, được viết theo một logic đúng và hợp lý.
- Đảm bảo ít bugs nhất xảy ra với những gì chúng ta code ra.
- Đảm bảo chúng ta đang code đúng specs, yêu cầu mà khách hàng đưa ra.
- Sản phẩm đưa đến tester, QA là một sản phẩm hoàn thiện ít bugs đẩy nhanh quá trình release dự án.
Cách thực hiện
Để thực hiện test code coverage trong laravel:
vendor/bin/phpunit --coverage-html coverage-report
Sau khi chạy lệnh trên, bạn sẽ có một thư mục coverage-report
chứa các tệp HTML báo cáo về phủ sóng mã nguồn của ứng dụng Laravel.
Kết luận
Việc viết test có rất nhiều lợi ích, không chỉ giúp giảm nguy cơ tiềm ẩn cho code mà còn giúp bạn nâng cao khả năng phân tích cho code, hiểu logic của chức năng hơn và đặc biệt là giúp code của bạn trông uy tín hơn.
Mong rằng bài viết sẽ giúp bạn hiểu hơn về tầm quan trong của việc test trong dự án.