Top 7 thư viện Testing Laravel được dùng nhiều nhất
Trong bài viết này, chúng ta sẽ điểm qua 7 thư viện testing được ưa chuộng nhất trong Laravel, bao gồm PHPUnit, Mockery, Dusk, BrowserKit, Guzzle, Prophecy, Testbench và Orchestra Testbench. Các thư viện này sẽ giúp cho việc kiểm thử trở nên đơn giản và nhanh chóng hơn, đồng thời đảm bảo rằng ứng dụng của bạn hoạt động tốt và đáp ứng được các yêu cầu của người dùng.
Bài viết này sẽ giới thiệu cho bạn những đặc điểm và ứng dụng của từng thư viện, giúp bạn lựa chọn những công cụ phù hợp nhất với nhu cầu của dự án của mình. Hãy cùng khám phá và tìm hiểu thêm về các thư viện testing này trong bài viết dưới đây.
Tại sao chọn thư viện testing trong Laravel là quan trọng?
Khi xây dựng một ứng dụng Laravel, việc kiểm thử (testing) là một phần quan trọng và không thể thiếu để đảm bảo rằng ứng dụng hoạt động một cách ổn định và đáp ứng được yêu cầu của người dùng. Với mỗi ứng dụng Laravel, có nhiều thư viện testing được cung cấp, và việc lựa chọn thư viện phù hợp sẽ giúp cho việc kiểm thử trở nên hiệu quả hơn.
Dưới đây là tổng quan về 8 thư viện testing phổ biến trong Laravel
Bài viết này được đăng tại [free tuts .net]
Top 7 thư viện testing sử dụng nhiều nhất trong Laravel
1. Thư viện PHPUnit để kiểm thử đơn vị trong Laravel
PHPUnit là một thư viện testing đơn vị (unit testing) phổ biến trong Laravel. Nó được tích hợp sẵn trong framework Laravel và cung cấp cho bạn nhiều cách để kiểm tra các hành vi và kết quả của ứng dụng của bạn.
Để sử dụng PHPUnit để kiểm thử đơn vị trong Laravel, bạn có thể làm theo các bước sau:
Tạo một file test
#Sử dụng lệnh php artisan make:test:
php artisan make:test ExampleTest
Lệnh này sẽ tạo ra một file test mới tên là ExampleTest.php trong thư mục tests/Unit.
#Tạo thủ công một file PHP mới trong thư mục tests:
Bạn có thể tạo một file PHP mới trong thư mục tests và viết mã kiểm thử vào đó. Ví dụ, bạn có thể tạo một file có tên là ExampleTest.php và đặt nó trong thư mục tests/Unit với nội dung sau:
<?php namespace Tests\Unit; use Tests\TestCase; use Illuminate\Foundation\Testing\RefreshDatabase; class ExampleTest extends TestCase { /** * Test the example. * * @return void */ public function testExample() { $this->assertTrue(true); } }
Trong đó, ExampleTest là tên của test case, TestCase là class cha của test case được cung cấp bởi Laravel, RefreshDatabase là một trait dùng để làm mới cơ sở dữ liệu trước mỗi lần chạy test, và testExample()
là một method test mẫu kiểm tra xem PHPUnit có hoạt động đúng hay không.
Viết các phương thức test
Các phương thức test PHPUnit trong Laravel cần phải được đặt trong một class test. Class này thường sẽ kế thừa PHPUnit\Framework\TestCase hoặc Tests\TestCase, class cha được cung cấp bởi Laravel.
Sau đây là một số phương thức test PHPUnit phổ biến:
#testMethodName()
Phương thức test đơn giản nhất, kiểm tra xem một đoạn code có hoạt động đúng hay không.
public function testAddition() { $this->assertEquals(2+2, 4); }
#testRoute()
Kiểm tra xem một route có hoạt động đúng hay không.
public function testWelcomeRoute() { $response = $this->get('/freetuts.net'); $response->assertStatus(200); }
#testView()
Kiểm tra xem một view có hiển thị đúng nội dung hay không.
public function testHomeView() { $response = $this->get('/home'); $response->assertViewIs('home.index'); $response->assertSee('Welcome to the home page freetuts.net!'); }
#testModel()
Kiểm tra xem một model có hoạt động đúng hay không.
public function testUserModel() { $user = new User([ 'name' => 'John Doe', 'email' => 'johndoe@example.com', 'password' => bcrypt('password'), ]); $this->assertTrue($user->save()); }
#testDatabase()
kiểm tra xem cơ sở dữ liệu có hoạt động đúng hay không.
public function testUsersTable() { $user = factory(User::class)->create([ 'name' => 'John Doe', 'email' => 'johndoe@example.com', 'password' => bcrypt('password'), ]); $this->assertDatabaseHas('users', [ 'name' => 'John Doe', 'email' => 'johndoe@example.com', ]); }
Trong các phương thức test trên, $this
là đối tượng test case hiện tại, có thể sử dụng các phương thức được cung cấp bởi Laravel để thực hiện kiểm tra. Ví dụ, $this->assertEquals()
để kiểm tra xem hai giá trị có bằng nhau hay không, $this->get()
để gửi một request GET tới một route, $this->assertViewIs()
để kiểm tra xem một view có được render hay không, $this->assertDatabaseHas()
để kiểm tra xem một bản ghi có tồn tại trong cơ sở dữ liệu hay không, và $this->assertTrue()
để kiểm tra một biểu thức đúng hay sai.
Chạy các test
Để chạy các test PHPUnit trong Laravel, ta có thể sử dụng câu lệnh php artisan test.
Nếu muốn chạy một hoặc một số file test cụ thể, ta có thể truyền đường dẫn tới file test vào sau câu lệnh php artisan test,
ví dụ:
php artisan test tests/Feature/ExampleTest.php
Nếu muốn chạy một hoặc một số test case cụ thể, ta có thể sử dụng tùy chọn --filter,
ví dụ:
php artisan test --filter test_can_create_new_user
Nếu muốn chạy các test case với nhiều tùy chọn khác nhau, ta có thể sử dụng tùy chọn --testdox để hiển thị tóm tắt kết quả các test case,
ví dụ:
php artisan test --testdox
Ngoài ra, Laravel còn cung cấp một số công cụ hỗ trợ chạy test như PHPUnit Browser Kit, PHPUnit Selenium, PHPUnit Mockery, PHPUnit Database Testing, PHPUnit HTTP Testing,... để giúp cho quá trình testing trở nên dễ dàng và chính xác hơn.
2. Thư viện Mockery, tạo đối tượng giả lập trong Laravel
Để tạo đối tượng giả lập trong Laravel với thư viện Mockery, ta cần làm như sau:
Cài đặt thư viện Mockery
Sử dụng composer để cài đặt thư viện Mockery bằng lệnh sau:
composer require mockery/mockery --dev
Khởi tạo đối tượng Mockery
Trong file test, ta có thể khởi tạo đối tượng Mockery bằng cách sử dụng hàm Mockery::mock()
.
Ví dụ, ta muốn tạo một đối tượng giả lập của lớp UserService, ta có thể viết như sau:
use App\Services\UserService; use Mockery; class ExampleTest extends TestCase { public function test_example() { $userService = Mockery::mock(UserService::class); // Code kiểm thử sử dụng đối tượng giả lập $userService } }
Định nghĩa các phương thức của đối tượng giả lập
Để định nghĩa các phương thức của đối tượng giả lập, ta sử dụng các phương thức như shouldReceive()
hoặc shouldNotReceive()
.
Ví dụ, ta muốn định nghĩa phương thức getUserById()
trả về một user có id là 1, ta có thể viết như sau:
use App\Services\UserService; use Mockery; class ExampleTest extends TestCase { public function test_example() { $userService = Mockery::mock(UserService::class); $userService->shouldReceive('getUserById')->with(1)->andReturn([ 'id' => 1, 'name' => 'John Doe', 'email' => 'john.doe@example.com', ]); // Code kiểm thử sử dụng đối tượng giả lập $userService } }
Đóng đối tượng giả lập
Sau khi sử dụng đối tượng giả lập, ta cần đóng đối tượng giả lập để giải phóng tài nguyên. Ta có thể sử dụng phương thức close() để đóng đối tượng giả lập.
Ví dụ:
use App\Services\UserService; use Mockery; class ExampleTest extends TestCase { public function test_example() { $userService = Mockery::mock(UserService::class); $userService->shouldReceive('getUserById')->with(1)->andReturn([ 'id' => 1, 'name' => 'John Doe', 'email' => 'john.doe@example.com', ]); // Code kiểm thử sử dụng đối tượng giả lập $userService $userService->close(); } }
Lưu ý: Đối tượng giả lập nên được đóng sau khi sử dụng để tránh xảy ra lỗi trong các test khác.
3. Công cụ Dusk, kiểm thử giao diện người dùng trong Laravel
Công cụ Dusk là một trong những công cụ testing phổ biến trong Laravel được sử dụng để kiểm thử giao diện người dùng. Nó cho phép các nhà phát triển kiểm tra chức năng của các trang web Laravel một cách tự động và hiệu quả. Để kiểm thử giao diện người dùng trong Laravel với công cụ Dusk, ta có thể thực hiện các bước sau:
Cài đặt Dusk
Để cài đặt Dusk trong Laravel, ta có thể làm theo các bước sau:
Sử dụng Composer để cài đặt Dusk:
composer require --dev laravel/dusk
Chạy lệnh sau để tạo file .env.dusk.local và cấu hình tên miền của ứng dụng để Dusk có thể sử dụng:
php artisan dusk:install
Sau khi thực hiện các bước trên, ta đã cài đặt và sẵn sàng sử dụng Dusk để kiểm thử giao diện người dùng trong Laravel. Ta có thể viết các phương thức test trong file test case vừa tạo và chạy chúng bằng cách sử dụng lệnh php artisan dusk.
Tạo một test case Dusk mới
Để tạo một test case Dusk mới, ta có thể sử dụng lệnh php artisan dusk:make và chỉ định tên của test case:
php artisan dusk:make MyFirstDuskTest
Viết test case Dusk
Để viết một test case Dusk trong Laravel, bạn có thể làm như sau:
Mở file MyDuskTestCase.php trong thư mục tests/Browser và định nghĩa các phương thức test. Ví dụ:
<?php namespace Tests\Browser; use Illuminate\Foundation\Testing\DatabaseMigrations; use Laravel\Dusk\Browser; use Tests\DuskTestCase; class MyDuskTestCase extends DuskTestCase { use DatabaseMigrations; public function testLogin() { $this->browse(function (Browser $browser) { $browser->visit('/login') ->type('email', 'johndoe@example.com') ->type('password', 'secret') ->press('Login') ->assertPathIs('/home'); }); } }
Trong đó, phương thức testLogin()
sẽ thực hiện các hành động trên trình duyệt để đăng nhập và kiểm tra xem đăng nhập thành công hay không.
Chạy test case Dusk
Chạy lệnh artisan dusk để khởi động trình duyệt và chạy tất cả các test case Dusk:
php artisan dusk
Lệnh này sẽ chạy tất cả các test case Dusk trong thư mục tests/Browser.
Lưu ý : rằng trước khi chạy các test case Dusk, bạn cần phải khởi động môi trường Laravel và trình duyệt Chrome hoặc Firefox. Bạn cũng cần cài đặt Selenium Server để đảm bảo việc kiểm thử được thực hiện đúng cách.
4. Thư viện BrowserKit, kiểm thử ứng dụng trên trình duyệt
Thư viện BrowserKit là một trong những thư viện phổ biến được sử dụng để kiểm thử ứng dụng trên trình duyệt trong Laravel. Để sử dụng thư viện này, bạn có thể làm như sau:
Cài đặt thư viện BrowserKit bằng Composer
composer require symfony/browser-kit
Tạo một file test PHP mới trong thư mục tests của Laravel.
Ví dụ, để tạo một test cho trang đăng nhập của ứng dụng, bạn có thể tạo một file LoginTest.php và viết code như sau:
<?php use Symfony\Component\DomCrawler\Crawler; use Symfony\Component\HttpKernel\Client; class LoginTest extends TestCase { public function testLoginForm() { $client = new Client($this->app); $crawler = $client->request('GET', '/login'); $form = $crawler->selectButton('Login')->form(); $form->setValues([ 'email' => 'test@example.com', 'password' => 'password123', ]); $crawler = $client->submit($form); $this->assertEquals('/dashboard', $client->getRequest()->getPathInfo()); } }
Trong đoạn code trên, chúng ta sử dụng đối tượng Client để tạo một phiên làm việc trên trình duyệt. Sau đó, chúng ta sử dụng phương thức request()
để gửi yêu cầu GET đến trang đăng nhập. Tiếp theo, chúng ta sử dụng phương thức selectButton()
để lấy thông tin về form đăng nhập và phương thức form()
để tạo một đối tượng form để điền thông tin đăng nhập. Cuối cùng, chúng ta sử dụng phương thức submit()
để gửi yêu cầu POST đến server và kiểm tra xem nó có chuyển hướng đến trang dashboard hay không.
Chạy các test bằng cách sử dụng lệnh phpunit
:
phpunit tests/LoginTest.php
Lưu ý rằng trước khi chạy các test, bạn cần phải khởi động môi trường Laravel và trình duyệt được hỗ trợ (như Firefox hoặc Chrome).
4. Thư viện Guzzle, tương tác với các API bên ngoài trong Laravel
Thư viện Guzzle trong Laravel cung cấp các phương thức và lớp để tương tác với các API bên ngoài. Với Guzzle, bạn có thể thực hiện các phương thức HTTP như GET, POST, PUT, DELETE, PATCH, OPTIONS và HEAD, cũng như xử lý các yêu cầu và phản hồi được gửi và nhận từ API.
Để sử dụng Guzzle trong Laravel, ta cần cài đặt thư viện bằng Composer:
composer require guzzlehttp/guzzle
Sau khi cài đặt thành công, ta có thể tạo một đối tượng của Guzzle để gửi các yêu cầu HTTP đến các API bên ngoài. Ví dụ, để gửi một yêu cầu GET đến một URL nào đó, ta có thể làm như sau:
use GuzzleHttp\Client; $client = new Client(); $response = $client->request('GET', 'https://example.com');
Ở đây, $response
sẽ chứa phản hồi từ server sau khi gửi yêu cầu GET.
Ngoài ra, thư viện Guzzle cũng cung cấp các tính năng như tùy chỉnh header, query string, request body, cài đặt timeout, xác thực và mã hóa các thông tin truyền qua mạng, xử lý lỗi và nhiều tính năng khác.
Để tăng tính linh hoạt và sử dụng lại mã code, ta có thể tạo một lớp riêng để xử lý các yêu cầu HTTP và sử dụng nó trong các phương thức của controller hoặc service khác trong ứng dụng Laravel.
5. Thư viện Prophecy, giả lập đối tượng động trong Laravel
Thư viện Prophecy trong Laravel là một thư viện giả lập đối tượng động (dynamic object mocking) cho phép tạo ra các đối tượng giả lập để sử dụng trong các bài kiểm tra (test cases) trong Laravel.
Prophecy sử dụng cú pháp rõ ràng và dễ hiểu để giả lập các phương thức và trả về các giá trị tùy ý. Điều này cho phép bạn tạo ra các đối tượng giả lập động mà không cần cài đặt thêm bất kỳ thư viện nào khác.
Để sử dụng thư viện Prophecy trong Laravel, trước tiên bạn cần cài đặt nó thông qua Composer:
composer require --dev phpunit/phpunit prophecy/phpunit-prophecy
Sau đó, bạn có thể sử dụng Prophecy để tạo ra các đối tượng giả lập trong các bài kiểm tra Laravel của bạn. Ví dụ:
use Prophecy\PhpUnit\ProphecyTrait; class MyTest extends TestCase { use ProphecyTrait; public function testSomething() { // Tạo đối tượng giả lập của class Example $example = $this->prophesize(Example::class); // Giả lập phương thức foo() trả về "bar" $example->foo()->willReturn('bar'); // Lấy đối tượng thực sự từ đối tượng giả lập $realExample = $example->reveal(); // Kiểm tra kết quả $this->assertEquals('bar', $realExample->foo()); } }
Trong ví dụ trên, chúng ta sử dụng Prophecy để tạo ra một đối tượng giả lập của class Example và giả lập phương thức foo()
trả về chuỗi "bar". Sau đó, chúng ta lấy đối tượng thực sự từ đối tượng giả lập và kiểm tra kết quả. Nếu phương thức foo()
được triển khai đúng, kết quả sẽ là "bar", và bài kiểm tra sẽ thành công.
Với Prophecy, bạn có thể giả lập các phương thức, trả về các giá trị, tạo ra các đối tượng giả lập lồng nhau và nhiều hơn nữa. Thư viện này là một công cụ hữu ích cho việc kiểm thử các đối tượng phức tạp trong Laravel.
6. Kiểm thử các gói Laravel một cách dễ dàng với Testbench
Testbench cho phép bạn viết các bài kiểm thử cho gói của mình mà không cần chạy một ứng dụng Laravel đầy đủ. Thay vào đó, nó cung cấp một môi trường kiểm thử được thiết lập sẵn với các đặc điểm cấu hình tương tự như một ứng dụng Laravel thực sự. Điều này giúp bạn có thể viết các bài kiểm thử chính xác và tin cậy hơn.
Giả sử bạn đang phát triển một gói Laravel để tích hợp với một dịch vụ bên ngoài. Bạn muốn kiểm thử gói này một cách độc lập và không phụ thuộc vào ứng dụng Laravel chính của bạn.
Bạn có thể sử dụng Testbench để giả lập một ứng dụng Laravel và kiểm thử gói của bạn bên trong nó.
Bắt đầu bằng cách cài đặt Testbench:
composer require orchestra/testbench --dev
Sau đó, tạo một lớp kiểm thử cho gói của bạn và kế thừa từ lớp Orchestra\Testbench\TestCase. Trong lớp kiểm thử này, bạn có thể cấu hình ứng dụng Laravel giả lập và đăng ký các dịch vụ và tài nguyên cần thiết cho gói của bạn.
Ví dụ, nếu gói của bạn cần sử dụng các tài nguyên như tệp cấu hình, cơ sở dữ liệu hoặc kết nối HTTP, bạn có thể đăng ký chúng bằng cách sử dụng các phương thức của lớp Testbench.
use Orchestra\Testbench\TestCase; class MyPackageTest extends TestCase { protected function getPackageProviders($app) { return [ MyPackageServiceProvider::class, ]; } protected function getEnvironmentSetUp($app) { $app['config']->set('my-package.api_key', 'test_api_key'); $app['config']->set('my-package.api_secret', 'test_api_secret'); $app['db']->connection()->getSchemaBuilder()->create('my_table', function ($table) { $table->increments('id'); $table->string('name'); $table->timestamps(); }); } public function testSomething() { // Kiểm thử gói của bạn ở đây } }
Để chạy kiểm thử của bạn, bạn chỉ cần chạy lệnh PHPUnit thông thường:
vendor/bin/phpunit
Testbench sẽ khởi tạo ứng dụng Laravel giả lập và chạy kiểm thử của bạn bên trong nó.
Ngoài Testbench, bạn cũng có thể sử dụng Orchestra Testbench để kiểm thử các tính năng phức tạp hơn của gói của bạn, chẳng hạn như kiểm thử các tính năng tích hợp với cơ sở dữ liệu hoặc giao diện người dùng.
7. Orchestra Testbench, kiểm thử các gói Laravel một cách dễ dàng
Cài đặt nó thông qua Composer bằng lệnh sau
composer require --dev orchestra/testbench
Sau khi cài đặt thành công, bạn có thể bắt đầu sử dụng Orchestra Testbench để kiểm thử các gói Laravel của mình. Đầu tiên, bạn cần tạo một lớp kiểm thử, tương tự như khi sử dụng PHPUnit. Tuy nhiên, bạn cần mở rộng lớp Orchestra\Testbench\TestCase thay vì lớp PHPUnit\Framework\TestCase.
Sau đó, bạn cần cài đặt và cấu hình các gói Laravel mà bạn muốn kiểm thử trong phương thức getPackageProviders của lớp kiểm thử của mình. Ví dụ, nếu bạn muốn kiểm thử gói Laravel Debugbar, bạn cần cài đặt nó và thêm nó vào danh sách các nhà cung cấp trong phương thức getPackageProviders như sau:
protected function getPackageProviders($app) { return [ \Barryvdh\Debugbar\ServiceProvider::class, ]; }
Sau đó, bạn có thể viết các phương thức kiểm thử tương tự như khi sử dụng PHPUnit. Tuy nhiên, để sử dụng các phương thức cung cấp bởi Orchestra Testbench, bạn cần gọi phương thức actingAs để đăng nhập với người dùng cụ thể hoặc phương thức withoutMiddleware để bỏ qua middleware trong quá trình kiểm thử.
Ví dụ, để kiểm thử một API với middleware, bạn có thể sử dụng phương thức withoutMiddleware để bỏ qua middleware và kiểm tra kết quả như sau:
public function testApi() { $response = $this->withoutMiddleware()->get('/api/users'); $response->assertStatus(200); $response->assertJsonStructure([ '*' => ['id', 'name', 'email'], ]); }
Đó là cách sử dụng Orchestra Testbench để kiểm thử các gói Laravel của bạn một cách dễ dàng và hiệu quả. Với những tiện ích mà nó cung cấp, bạn có thể kiểm thử các gói Laravel của mình một cách linh hoạt và nhanh chóng hơn.
Testbench và Orchestra Testbench là hai công cụ mạnh giúp các nhà phát triển kiểm thử các gói Laravel một cách dễ dàng và hiệu quả hơn. Testbench cung cấp một môi trường kiểm thử ảo cho các gói Laravel, cho phép các nhà phát triển viết các test case riêng biệt cho các gói của họ mà không cần cài đặt Laravel hoàn chỉnh.
Việc sử dụng Testbench và Orchestra Testbench có thể giúp cho quá trình kiểm thử gói Laravel trở nên nhanh chóng và dễ dàng hơn. Các nhà phát triển có thể tập trung vào viết các test case và xác định các lỗi mà không phải lo lắng về cấu hình và triển khai của toàn bộ ứng dụng.
Kết bài viết
Bài viết trên đã tổng quan về 8 thư viện testing phổ biến trong Laravel, bao gồm PHPUnit, Dusk, BrowserKit, Guzzle, Mockery, Prophecy, Testbench và Orchestra Testbench. Đối với mỗi thư viện, chúng ta đã đi sâu vào cách sử dụng, tạo các test case và chạy chúng. Bài viết cũng cung cấp các ví dụ minh họa và giải thích chi tiết cách sử dụng các công cụ này để giúp bạn nắm bắt được các khái niệm cơ bản của kiểm thử trong Laravel.
Ngoài ra, chúng ta cũng tìm hiểu về cách giả lập đối tượng trong Laravel với Mockery và Prophecy, và cách kiểm thử các gói Laravel một cách dễ dàng với Testbench và Orchestra Testbench.
Nhờ vào bài viết này, bạn có thể học được cách sử dụng các thư viện testing trong Laravel và có thể áp dụng chúng vào dự án của mình để đảm bảo chất lượng phần mềm được tốt hơn.