Xin chào mọi người, chắc hẳn mỗi lập trình viên trong chúng ta đều biết về quá trình kiểm thử. Kiểm thử là một công việc quan trọng trong quá trình phát triển phần mềm. Ban đầu, khi tôi bắt đầu học lập trình, tưởng rằng việc kiểm tra tính chính xác của chương trình hay phát hiện lỗi chỉ là nhiệm vụ của QA/Tester, còn những người lập trình chỉ cần tập trung vào việc viết mã để chạy một cách ổn định. Nhưng tôi đã nhận ra rằng quan điểm đó hoàn toàn sai lầm khi tham gia vào các dự án thực tế, khi mà việc kiểm thử sẽ đi đôi với việc lập trình và thực hiện bởi chính những người lập trình, tuy có cách thức khác biệt so với kiểm thử do QA hay Tester thực hiện.
Việc viết test là rất quan trọng từ khi chúng ta bắt đầu dự án, vì chỉ khi chúng ta kiểm soát từng thành phần nhỏ trong mã của mình thì chúng ta mới có thể phát triển ứng dụng, kiểm soát lỗi một cách dễ dàng và tiết kiệm thời gian hơn so với việc viết mã không có kiểm thử. Việc kiểm tra từng dòng mã mà bạn viết sẽ giúp bạn phát hiện lỗi và sửa chúng ngay lập tức, tránh tình trạng mất quá nhiều thời gian để tìm kiếm lỗi thay vì tập trung vào việc xây dựng và phát triển ứng dụng. Có lỗi thì sửa ngay, không chờ đến QA.)
Bạn đang xem: UnitTest là gì ? Những điều cần biết về Unit Test trong Laravel – PHP
Vậy Unit Test là gì? Tại sao lập trình viên đều cần tìm hiểu và áp dụng nó vào dự án của mình?
Unit được dịch là đơn vị. Điều này có nghĩa là kiểm thử ở mức đơn vị, trong đó mỗi đơn vị là một method, function hoặc class. Viết kiểm thử cho các method, function hoặc class này giúp chúng ta hiểu rõ quy trình xử lý của từng thành phần nhỏ để từ đó có thể yên tâm xây dựng những chức năng lớn hơn từ chúng.
- UnitTest giúp tiết kiệm thời gian và chi phí trong quá trình phát triển ứng dụng.
- UnitTest giúp dễ dàng nắm bắt quy trình xử lý trong mã và từ đó dễ dàng nâng cấp mã.
- UnitTest chất lượng có thể coi như tài liệu cho dự án.
- UnitTest cho phép chúng ta tách riêng các method để dễ dàng kiểm thử và sử dụng lại.
Một số công cụ sử dụng cho Unit Test:
- Junit: Junit là công cụ kiểm thử miễn phí dành cho ngôn ngữ Java.
- NUnit: NUnit được sử dụng phổ biến trong kiểm thử đơn vị và hỗ trợ cả các ngôn ngữ .net. Đây là một công cụ mã nguồn mở, cho phép bạn viết kịch bản thủ công và hỗ trợ kiểm thử dựa trên dữ liệu mẫu.
- EMMA: EMMA là một bộ công cụ mã nguồn mở để phân tích và báo cáo mã nguồn viết bằng Java. EMMA hỗ trợ các kiểu tìm kiếm như method, line, basic block. Nó không cần thư viện bên ngoài và có thể truy cập mã nguồn.
- PHPUnit: PHPUnit là một công cụ kiểm thử đơn vị cho lập trình viên PHP. PHPUnit sử dụng các thành phần nhỏ để kiểm thử từng phần riêng biệt và cho phép nhà phát triển sử dụng phương pháp xác nhận cụ thể để xác định rằng hệ thống hoạt động như dự kiến hay không.
UnitTest có ba trạng thái chính:
- Fail: Lỗi trong quá trình kiểm thử.
- Ignore: Tạm dừng quá trình kiểm thử.
- Pass: Kiểm thử không có lỗi và hoạt động như mong muốn.
UnitTest tốt cần đảm bảo các điều kiện sau:
- Mỗi UnitTest là hoàn toàn độc lập và không liên quan đến các thành phần khác. Trong trường hợp các thành phần khác thay đổi, UnitTest sẽ không bị ảnh hưởng.
- Chỉ kiểm tra một đơn vị tại một thời điểm.
- Khi nâng cấp, thay đổi hoặc viết mới một thành phần, cần chắc chắn viết UnitTest cho nó.
- Kiểm thử không tác động đến cơ sở dữ liệu thực tế.
Xem thêm : Trẩu Là Gì ? Nghĩa Của Từ Trẩu Trong Tiếng Việt Định Nghĩa Trẻ Trâu Dùng Để Chỉ Những Ai
Bài viết hôm nay, chúng ta sẽ tìm hiểu về PHPUnit – công cụ chính để viết và chạy UnitTest đã được tích hợp sẵn trong Laravel.
Trong Laravel, để viết test, chúng ta sẽ tạo file test trong thư mục “test”.
Giải thích các thư mục:
- tests: chứa mã kiểm thử ứng dụng.
- tests/Browser: chứa các file kiểm thử giao diện, tương tác với trình duyệt.
- tests/Feature: chứa các file kiểm thử chức năng.
- tests/Unit: chứa các file kiểm thử đơn vị.
- TestCase: là file khởi động để cài đặt môi trường Laravel cho các test.
- phpunit.xml: file cấu hình cho PHPUnit.
Quy tắc tạo file test:
- Tên lớp kiểm thử sẽ có định dạng hậu tố “Test”. Ví dụ: PostControllerTest.
- Tạo cấu trúc thư mục tương tự với file thực tế: Ví dụ, nếu tôi muốn kiểm thử một Controller và đường dẫn của nó là folder “Http/Controllers/PostController.php”, chúng ta sẽ tạo file kiểm thử đơn vị với cấu trúc thư mục là: tests/Unit/Http/Controllers/PostControllerTest.php.
Những thành phần cần kiểm thử trong Laravel:
- Controllers
- Models
- View
- Repository
- Auth policies…
Để tạo file kiểm thử đơn vị:
php artisan make:test UserTest -unit
Khi tạo một file kiểm thử, chúng ta sẽ sử dụng hai phương thức setUp và tearDown. Vậy hai phương thức này được sử dụng để làm gì? Đơn giản, phương thức setUp dùng để thiết lập môi trường trước khi kiểm thử, ví dụ như tạo một người dùng có quyền admin hoặc sử dụng một model để chuẩn bị cho kiểm thử. Phương thức này sẽ được chạy trước mỗi phương thức kiểm thử.
Xem thêm : Bản sao công chứng là gì? Bản sao khác gì bản photo?
Tương tự, phương thức tearDown được sử dụng để dọn dẹp những môi trường đã được thiết lập trong quá trình setUp.
Assertions
Assertions: Đây là các phương thức giúp chúng ta xác nhận xem kết quả có đúng như mong muốn hay không.
Một số phương thức assertions thường gặp:
- assertEquals: kiểm tra xem hai kết quả có bằng nhau không.
- assertInstanceOf: kiểm tra xem kết quả có là một instance của một kiểu dữ liệu cụ thể hay không.
- assertArrayHasKey: kiểm tra xem một mảng có chứa khóa đã cho hay không.
- assertTrue: kiểm tra xem kết quả có bằng true hay không.
- assertFalse: kiểm tra xem kết quả có bằng false hay không.
- assertIsArray: kiểm tra xem kết quả có phải là một mảng hay không.
- và một số phương thức assertions khác. Mọi người có thể tìm hiểu thêm trong tài liệu của Laravel.
Ví dụ kiểm thử một model trong Laravel:
“`php
‘datetime’,
];
public function role()
{
return $this->belongsTo(Role::class);
}
}
“`
Trong file kiểm thử:
“`php
user = new User();
}
protected function tearDown(): void
{
parent::tearDown();
unset($this->user);
}
public function test_table_name()
{
$this->assertEquals(‘users’, $this->user->getTable());
}
public function test_fillable()
{
$this->assertEquals([
‘username’, ‘password’, ‘name’, ‘avatar’, ’email’, ‘address’, ‘phone_number’, ‘role_id’,
], $this->user->getFillable());
}
public function test_hidden()
{
$this->assertEquals([
‘password’, ‘remember_token’
], $this->user->getHidden()
);
}
protected function test_belongsTo_relation($related, $foreignKey, $ownerKey, $model, $relationName)
{
$relation = $model->$relationName();
$this->assertInstanceOf(BelongsTo::class, $relation);
$this->assertInstanceOf($related, $relation->getRelated());
$this->assertEquals($ownerKey, $relation->getOwnerKeyName());
$this->assertEquals($foreignKey, $relation->getForeignKeyName());
}
public function test_role_relation()
{
$this->test_belongsTo_relation(
Role::class, ‘role_id’, ‘id’, $this->user, ‘role’
);
}
}
“`
Cuối cùng, chúng ta chạy lệnh artisan:
php artisan test
Trong ví dụ trên, chúng tôi đã kiểm thử một Model User có quan hệ với Model Role. Trong file kiểm thử này, chúng ta có sử dụng các phương thức như getFillable() và getHidden() để kiểm thử cho thuộc tính fillable và hidden trong Laravel. Ngoài ra, để kiểm thử quan hệ, chúng tôi đã sử dụng phương thức assertInstanceOf để kiểm tra xem quan hệ trong User có chính xác là instance của BelongsTo trong Laravel hay không và kiểm tra OwnerKeyName và ForeignKeyName như trên.
Sau khi đọc bài viết này, chúng ta đã nắm được kiến thức cơ bản về Unit Test. Để làm việc hiệu quả, chúng ta cần tìm hiểu thêm về các phương thức kiểm thử có sẵn trong tài liệu của các công cụ cụ thể. Kiểm thử đồng thời với việc viết mã là rất quan trọng và cần thiết để đảm bảo phát triển ứng dụng một cách chuyên nghiệp và tiết kiệm công sức và thời gian. Mong rằng bài viết này sẽ hữu ích cho các bạn trong công việc của mình. Cảm ơn các bạn và hẹn gặp lại vào một ngày gần nhất!