Testbench và Orchestra Testbench trong Laravel, kiểm thử Laravel dễ dàng
Trong quá trình phát triển phần mềm, kiểm thử là một phần quan trọng để đảm bảo chất lượng và tính ổn định của sản phẩm. Với ứng dụng Laravel, có hai gói Testbench và Orchestra Testbench được cung cấp để giúp bạn kiểm thử ứng dụng Laravel của mình một cách dễ dàng và hiệu quả.
Gói Testbench cho phép bạn thiết lập môi trường kiểm thử cho ứng dụng Laravel của mình mà không cần phải cài đặt và cấu hình môi trường thực tế. Gói này cung cấp các phương thức hữu ích để tạo các instance của các thành phần của Laravel như ServiceProvider, Facade, Middleware, Route, Request và Response, giúp bạn dễ dàng kiểm thử và phát triển ứng dụng Laravel của mình.
Orchestra Testbench cung cấp các tính năng mở rộng của Testbench, bao gồm cơ chế mock objects để giả lập các tài nguyên bên ngoài như file, database, session, cache, queue, event, job và mail. Điều này cho phép bạn kiểm thử các phần mềm phức tạp hơn và đảm bảo tính đúng đắn của ứng dụng của mình.
Trên cơ sở đó, trong bài viết này, chúng ta sẽ tìm hiểu cách sử dụng Testbench và Orchestra Testbench để kiểm thử các ứng dụng Laravel một cách dễ dàng và hiệu quả.
Bài viết này được đăng tại [free tuts .net]
I. Testbench Laravel là gì?
Testbench Laravel là một công cụ kiểm thử được thiết kế để hỗ trợ việc kiểm thử ứng dụng Laravel một cách đơn giản và hiệu quả. Testbench cho phép bạn tạo ra một môi trường kiểm thử hoàn toàn độc lập, bao gồm cả cơ sở dữ liệu, trình xử lý lệnh và các thành phần khác của Laravel.
Testbench cung cấp một số lớp trợ giúp để giả lập ứng dụng Laravel và các thành phần của nó trong quá trình kiểm thử. Các lớp trợ giúp này bao gồm cả việc giả lập các yêu cầu HTTP, các truy vấn cơ sở dữ liệu và các hoạt động khác của Laravel.
Với Testbench, bạn có thể viết test chức năng của ứng dụng mà không cần phải triển khai ứng dụng thực sự. Điều này giúp bạn tiết kiệm thời gian và tiền bạc trong việc triển khai và kiểm thử ứng dụng của mình.
1. Các tính năng chính của Testbench
Tạo môi trường kiểm thử độc lập
Để tạo môi trường kiểm thử độc lập trong Laravel, bạn có thể sử dụng Testbench. Dưới đây là một ví dụ cụ thể về cách tạo môi trường kiểm thử độc lập trong Laravel bằng Testbench.
Ví dụ: Giả sử bạn muốn kiểm tra một tính năng trong ứng dụng Laravel của mình liên quan đến việc lưu trữ và truy vấn cơ sở dữ liệu. Bạn muốn kiểm tra tính năng này mà không phụ thuộc vào cơ sở dữ liệu thực tế. Bạn có thể sử dụng Testbench để tạo môi trường kiểm thử độc lập và thực hiện kiểm tra của mình.
Bước 1: Cài đặt Testbench
Bạn cần cài đặt Testbench vào ứng dụng Laravel của mình bằng Composer. Bạn có thể thêm Testbench vào tệp composer.json bằng cách thêm dòng sau vào phần "require-dev":
"orchestra/testbench": "6.*"
Sau đó, chạy lệnh sau để cập nhật các gói:
composer update
Bước 2: Tạo test mới
Bạn cần tạo một bài test mới để kiểm tra chức năng của ứng dụng của mình. Bạn có thể tạo một bài test mới bằng cách chạy lệnh sau:
php artisan make:test DatabaseTest
Lệnh trên sẽ tạo một bài kiểm tra mới với tên là "DatabaseTest".
Bước 3: Sử dụng Testbench trong bài test
Bạn cần sử dụng Testbench trong bài test của mình để tạo môi trường kiểm thử độc lập. Để làm điều này, hãy thêm dòng sau vào đầu bài test của bạn:
use Orchestra\Testbench\TestCase;
Bước 4: Định nghĩa ứng dụng trong bài test
Bạn cần định nghĩa ứng dụng của mình trong bài kiểm tra của mình để test các chức năng của ứng dụng. Để làm điều này, hãy sử dụng phương thức createApplication trong bài test của bạn.
Ví dụ:
protected function createApplication() { $app = require __DIR__.'/../bootstrap/app.php'; $app->make('Illuminate\Contracts\Console\Kernel')->bootstrap(); return $app; }
Trong ví dụ trên, chúng ta đã tạo một ứng dụng Laravel mới và sử dụng Kernel để khởi động ứng dụng này.
Bước 5: Thực hiện test
Trong bài test của bạn, bạn có thể thực hiện kiểm tra các chức năng của ứng dụng của mình bằng cách sử dụng các phương thức kiểm tra trong Laravel như assertDatabaseHas, assertDatabaseMissing, assertSee, assertDontSee, vv.
Ví dụ: Giả sử bạn muốn kiểm tra rằng khi bạn lưu trữ một người dùng mới vào cơ sở dữ liệu, người dùng đó đã được lưu trữ thành công. Bạn có thể thực hiện test bằng cách sử dụng assertDatabaseHas như sau:
public function testNewUserIsStoredInDatabase() { // Create a new user $user = new User; $user->name = 'John Doe'; $user->email = 'johndoe@example.com'; $user->password = bcrypt('password'); $user->save(); // Assert that the user is stored in the database $this->assertDatabaseHas('users', [ 'name' => 'John Doe', 'email' => 'johndoe@example.com' ]); }
Trong ví dụ trên, chúng ta đã tạo một người dùng mới và sử dụng assertDatabaseHas để kiểm tra rằng người dùng đã được lưu trữ thành công trong cơ sở dữ liệu.
Bước 6: Chạy bài test
Cuối cùng, bạn có thể chạy bài test của mình bằng cách sử dụng lệnh sau:
phpunit tests/DatabaseTest.php
Lệnh trên sẽ chạy bài testcủa bạn và hiển thị kết quả kiểm tra trong cửa sổ terminal.
Như vậy, đó là cách tạo môi trường kiểm thử độc lập trong Laravel bằng Testbench và thực hiện kiểm tra chức năng của ứng dụng mà không phụ thuộc vào cơ sở dữ liệu thực tế.
Giả lập yêu cầu HTTP và truy vấn cơ sở dữ liệu
Để giả lập yêu cầu HTTP và truy vấn cơ sở dữ liệu trong Laravel, ta có thể sử dụng các phương thức cung cấp bởi Testbench và Laravel Eloquent. Sau đây là một số ví dụ về cách sử dụng chúng:
Giả lập yêu cầu HTTP với Testbench
Ví dụ, để giả lập một yêu cầu HTTP GET đến URL '/users', bạn có thể sử dụng phương thức get của lớp Illuminate\Foundation\Testing\TestResponse như sau:
use Illuminate\Foundation\Testing\TestCase; use Illuminate\Foundation\Testing\TestResponse; class ExampleTest extends TestCase { public function testGetUsers() { $response = $this->get('/users'); $response->assertStatus(200); $response->assertSee('List of users'); } }
Ở đây, $this->get('/users')
giả lập một yêu cầu HTTP GET đến URL '/users', và trả về một đối tượng TestResponse để bạn có thể kiểm tra kết quả của yêu cầu.
Giả lập truy vấn cơ sở dữ liệu với Laravel Eloquent
Ví dụ, để giả lập một truy vấn cơ sở dữ liệu để lấy danh sách người dùng, bạn có thể sử dụng phương thức factory và create của lớp Illuminate\Database\Eloquent\Model như sau:
use Illuminate\Foundation\Testing\TestCase; use App\Models\User; class ExampleTest extends TestCase { public function testGetUsers() { $user1 = User::factory()->create([ 'name' => 'John Doe', 'email' => 'john.doe@example.com', ]); $user2 = User::factory()->create([ 'name' => 'Jane Doe', 'email' => 'jane.doe@example.com', ]); $users = User::all(); $this->assertCount(2, $users); $this->assertEquals('John Doe', $users[0]->name); $this->assertEquals('jane.doe@example.com', $users[1]->email); } }
Ở đây, $user1
và $user2
là hai bản ghi được tạo ra bởi phương thức factory của lớp User, và User::all()
là phương thức để lấy danh sách tất cả người dùng từ cơ sở dữ liệu. Bạn có thể kiểm tra kết quả của truy vấn bằng các phương thức kiểm tra có sẵn trong Laravel PHPUnit.
Như vậy, sử dụng Testbench và Laravel Eloquent, bạn có thể dễ dàng giả lập yêu cầu HTTP và truy vấn cơ sở dữ liệu trong Laravel để kiểm tra các chức năng của ứng dụng của bạn.
Tự động hóa các bài test
Để tự động hóa các bài test trong Laravel, bạn có thể sử dụng Laravel PHPUnit. Laravel PHPUnit là một phần mềm kiểm thử đơn vị mạnh mẽ được tích hợp sẵn trong Laravel Framework, cho phép bạn viết các bài test đơn vị và tích hợp chúng vào quá trình phát triển của mình.
Để tự động hóa các bài test, bạn có thể sử dụng các câu lệnh php artisan make:test để tạo các lớp test mới.
Ví dụ:
php artisan make: test UserControllerTest
Sau khi tạo lớp test, bạn có thể viết các bài test cho phương thức trong lớp đó.
Ví dụ:
use App\Models\User; use Illuminate\Foundation\Testing\DatabaseMigrations; use Tests\TestCase; class UserControllerTest extends TestCase { use DatabaseMigrations; public function testIndex() { $user1 = User::factory()->create(); $user2 = User::factory()->create(); $response = $this->get('/users'); $response->assertStatus(200); $response->assertSee($user1->name); $response->assertSee($user2->name); } public function testShow() { $user = User::factory()->create(); $response = $this->get('/users/'.$user->id); $response->assertStatus(200); $response->assertSee($user->name); } }
Ở đây, testIndex()
và testShow()
là các phương thức kiểm tra cho phương thức index()
và show()
của UserController. Trong mỗi phương thức, bạn có thể giả lập yêu cầu HTTP và truy vấn cơ sở dữ liệu để kiểm tra các kết quả. Các phương thức assertStatus(),
assertSee()
, assertRedirect()
và nhiều hơn nữa đều được cung cấp bởi Laravel PHPUnit để giúp bạn kiểm tra các kết quả.
Sau khi viết các bài test, bạn có thể chạy chúng bằng câu lệnh php artisan test để kiểm tra xem chúng có hoạt động đúng hay không. Nếu các bài test của bạn không vượt qua, Laravel PHPUnit sẽ cung cấp cho bạn các thông tin chi tiết về lỗi, giúp bạn tìm và sửa lỗi một cách dễ dàng.
Với Laravel PHPUnit, bạn có thể tự động hóa các bài test của mình và tích hợp chúng vào quá trình phát triển của mình để đảm bảo rằng ứng dụng của bạn hoạt động đúng và ổn định.
Hỗ trợ phần mở rộng
Laravel hỗ trợ rất nhiều phần mở rộng để giúp bạn phát triển ứng dụng một cách nhanh chóng và hiệu quả hơn. Dưới đây là một số phần mở rộng phổ biến trong Laravel:
- Laravel Debugbar: là một công cụ giúp bạn xem thông tin debug của ứng dụng một cách dễ dàng và chi tiết hơn. Nó cung cấp cho bạn các biểu đồ, bảng và các thông tin khác để giúp bạn hiểu rõ hơn về các hoạt động của ứng dụng.
- Laravel Horizon: là một bộ công cụ quản lý hàng đợi cho ứng dụng Laravel. Nó giúp bạn theo dõi các hàng đợi, quản lý các tiến trình và cung cấp các thống kê chi tiết về các hoạt động của hàng đợi.
- Laravel Telescope: là một công cụ giúp bạn theo dõi các hoạt động của ứng dụng một cách chi tiết hơn. Nó cung cấp cho bạn các bản ghi và phân tích các hoạt động của ứng dụng để giúp bạn tìm ra các vấn đề và sửa chữa chúng một cách nhanh chóng.
- Laravel Socialite: là một bộ công cụ giúp bạn tích hợp đăng nhập bằng mạng xã hội vào ứng dụng Laravel của mình. Nó hỗ trợ đăng nhập bằng Facebook, Google, Twitter và nhiều mạng xã hội khác.
- Laravel Passport: là một bộ công cụ giúp bạn xác thực và quản lý API của mình. Nó cung cấp các tính năng bảo mật như xác thực qua token, xác thực qua OAuth2 và các tính năng khác để giúp bạn bảo vệ các API của mình.
- Laravel Nova: là một công cụ quản lý nội dung giúp bạn tạo các bảng điều khiển quản lý cho ứng dụng Laravel của mình. Nó cung cấp các tính năng như tìm kiếm, lọc, sắp xếp và các tính năng khác để giúp bạn quản lý dữ liệu của mình một cách hiệu quả.
Trên đây là một số phần mở rộng phổ biến trong Laravel. Ngoài ra còn rất nhiều phần mở rộng khác được cung cấp bởi cộng đồng Laravel, giúp bạn phát triển ứng dụng một cách nhanh chóng và hiệu quả.
II. Orchestra Testbench là gì?
Orchestra Testbench là một phần mở rộng của Laravel framework, được sử dụng để kiểm thử các gói mở rộng của Laravel một cách dễ dàng và hiệu quả hơn. Nó cung cấp một số công cụ và hỗ trợ để giả lập yêu cầu HTTP, truy vấn cơ sở dữ liệu, và các hoạt động khác của ứng dụng. Nó cũng có thể được sử dụng để tự động hóa các bài kiểm tra và tích hợp với các công cụ kiểm thử khác. Orchestra Testbench cho phép bạn phát triển và kiểm thử các phần mở rộng của Laravel một cách dễ dàng, tiện lợi và chuyên nghiệp.
1. Các tính năng chính của Orchestra Testbench
Giả lập yêu cầu HTTP
Để giả lập yêu cầu HTTP với Orchestra Testbench trong Laravel, trước tiên bạn cần phải cài đặt gói này thông qua Composer:
composer require orchestra/testbench
Sau khi cài đặt thành công, bạn có thể sử dụng các phương thức được cung cấp bởi Testbench để giả lập các yêu cầu HTTP
get($uri, $headers = [])
: Giả lập một yêu cầu GET tới một URI cụ thể, với các tiêu đề tùy chọn.post($uri, $data = [], $headers = [])
: Giả lập một yêu cầu POST tới một URI cụ thể, với các dữ liệu và tiêu đề tùy chọn.put($uri, $data = [], $headers = [])
: Giả lập một yêu cầu PUT tới một URI cụ thể, với các dữ liệu và tiêu đề tùy chọn.patch($uri, $data = [], $headers = [])
: Giả lập một yêu cầu PATCH tới một URI cụ thể, với các dữ liệu và tiêu đề tùy chọn.delete($uri, $data = [], $headers = [])
: Giả lập một yêu cầu DELETE tới một URI cụ thể, với các dữ liệu và tiêu đề tùy chọn.
Ví dụ sau đây minh họa cách sử dụng phương thức get()
của Orchestra Testbench để giả lập một yêu cầu GET tới một URI cụ thể:
use Orchestra\Testbench\TestCase; class ExampleTest extends TestCase { public function testGetRequest() { $response = $this->get('/example'); // giả lập yêu cầu GET tới URI '/example' $response->assertStatus(200); // kiểm tra mã trạng thái phản hồi có phải là 200 không $response->assertSee('Example'); // kiểm tra xem trang web có chứa từ 'Example' không } }
Trong ví dụ này, chúng ta đã sử dụng phương thức get()
để giả lập một yêu cầu GET tới URI '/example'. Sau đó, chúng ta kiểm tra xem mã trạng thái của phản hồi có phải là 200 không bằng phương thức assertStatus()
, và kiểm tra xem trang web có chứa từ 'Example' không bằng phương thức assertSee().
Bạn có thể sử dụng các phương thức tương tự để giả lập các yêu cầu POST, PUT, PATCH và DELETE.
Truy vấn cơ sở dữ liệu
Orchestra Testbench cung cấp một số phương thức để giả lập truy vấn cơ sở dữ liệu trong Laravel, giúp bạn kiểm tra các tác vụ của ứng dụng một cách chính xác và hiệu quả. Các phương thức này bao gồm:
seed():
Giả lập việc chạy các truy vấn seeders để tạo dữ liệu giả lập trong cơ sở dữ liệu.migrate()
: Giả lập việc chạy các truy vấn migrations để tạo các bảng và cấu trúc cơ sở dữ liệu giả lập.create($table, $attributes = [])
: Tạo một bản ghi mới trong bảng cơ sở dữ liệu cụ thể với các thuộc tính được chỉ định.make($table, $attributes = [])
: Tạo một bản ghi mới nhưng không lưu vào cơ sở dữ liệu, thích hợp cho các trường hợp kiểm tra mẫu dữ liệu.assertDatabaseHas($table, $data)
: Kiểm tra xem bảng cơ sở dữ liệu có chứa dữ liệu nhất định hay không.assertDatabaseMissing($table, $data)
: Kiểm tra xem bảng cơ sở dữ liệu không chứa dữ liệu nhất định hay không.
Ví dụ sau đây minh họa cách sử dụng phương thức create()
và assertDatabaseHas()
của Orchestra Testbench để kiểm tra việc tạo mới bản ghi trong cơ sở dữ liệu:
use Orchestra\Testbench\TestCase; class ExampleTest extends TestCase { public function testCreateRecord() { $data = ['name' => 'John Doe', 'email' => 'john@example.com']; $record = $this->create('users', $data); // tạo một bản ghi mới trong bảng 'users' với dữ liệu được chỉ định $this->assertDatabaseHas('users', $data); // kiểm tra xem bảng 'users' có chứa dữ liệu được chỉ định không } }
Trong ví dụ này, chúng ta đã sử dụng phương thức create() để tạo một bản ghi mới trong bảng 'users' với dữ liệu được chỉ định. Sau đó, chúng ta kiểm tra xem bảng 'users' có chứa dữ liệu được chỉ định không bằng phương thức assertDatabaseHas().
Bạn có thể sử dụng các phương thức tương tự để giả lập các truy vấn seeders, migrations và kiểm tra sự tồn tại của các bản ghi trong cơ sở dữ liệu.
Tự động hóa các bài kiểm tra
Tự động hóa các bài kiểm tra với Orchestra Testbench trong Laravel có thể được thực hiện bằng cách sử dụng tính năng Testing Helpers của nó. Testing Helpers cung cấp các phương thức để thực hiện các tác vụ thường gặp trong kiểm thử, bao gồm tạo dữ liệu mẫu, làm sạch cơ sở dữ liệu và thực hiện các yêu cầu HTTP giả lập.
Ví dụ sau đây minh họa cách sử dụng Testing Helpers để tạo một bài test tự động cho một ứng dụng Laravel:
use Illuminate\Foundation\Testing\DatabaseTransactions; use Illuminate\Foundation\Testing\WithFaker; use Illuminate\Foundation\Testing\RefreshDatabase; use Orchestra\Testbench\TestCase; class MyTest extends TestCase { use DatabaseTransactions, WithFaker; /** @test */ public function it_can_create_a_new_user() { $user = factory(User::class)->create([ 'name' => $this->faker->name, 'email' => $this->faker->email, ]); $this->assertDatabaseHas('users', [ 'name' => $user->name, 'email' => $user->email, ]); } }
Trong ví dụ này, chúng ta sử dụng trait DatabaseTransactions để bảo đảm rằng các thay đổi trong cơ sở dữ liệu sẽ không được lưu lại sau khi chạy bài test. Chúng ta cũng sử dụng trait WithFaker để tạo dữ liệu mẫu và RefreshDatabase để làm sạch cơ sở dữ liệu trước khi chạy bài test.
Phương thức factory(User::class)->create()
sử dụng tính năng tạo dữ liệu mẫu của Laravel để tạo một người dùng mới trong cơ sở dữ liệu. Sau đó, chúng ta sử dụng phương thức assertDatabaseHas để kiểm tra xem người dùng đã được lưu trong cơ sở dữ liệu hay chưa.
Khi chạy bài test, Laravel sẽ tự động tạo một cơ sở dữ liệu mới và làm sạch nó trước khi chạy mỗi bàitest. Các phương thức Testing Helpers sẽ giả lập các yêu cầu HTTP và truy vấn cơ sở dữ liệu, giúp bạn kiểm tra ứng dụng của mình một cách đầy đủ và hiệu quả.
Hỗ trợ phần mở rộng
Hỗ trợ phần mở rộng với Orchestra Testbench cung cấp rất nhiều phương thức và hàm hỗ trợ cho việc phát triển và kiểm thử phần mở rộng (packages) của Laravel. Điều này giúp cho việc phát triển các phần mở rộng của Laravel trở nên dễ dàng hơn và nhanh chóng hơn.
Một số phần mở rộng quan trọng của Orchestra Testbench bao gồm:
-
Package Discovery: cho phép phát hiện và tải các phần mở rộng của Laravel tự động trong quá trình kiểm thử.
-
Factories: cung cấp một API dễ sử dụng để tạo ra các bản ghi trong cơ sở dữ liệu để sử dụng trong quá trình kiểm thử.
-
Migrations: cho phép bạn tạo và chạy các migration trong quá trình kiểm thử một cách dễ dàng và hiệu quả.
-
Mail testing: cung cấp các phương thức giả lập việc gửi email để giúp bạn kiểm thử các chức năng liên quan đến email một cách dễ dàng và nhanh chóng.
-
Events: giúp bạn kiểm thử các sự kiện và lắng nghe các sự kiện trong quá trình kiểm thử.
Với sự hỗ trợ của các tính năng và phần mở rộng này, việc phát triển và kiểm thử các phần mở rộng của Laravel trở nên dễ dàng và tiện lợi hơn bao giờ hết.
Kết Bài Viết
Trong bài viết này, chúng ta đã tìm hiểu về Testbench và Orchestra Testbench, hai thư viện kiểm thử cho Laravel. Chúng ta đã xem xét cách tạo môi trường kiểm thử độc lập trong Laravel, giả lập yêu cầu HTTP và truy vấn cơ sở dữ liệu bằng Testbench và Orchestra Testbench, tự động hóa các bài test, hỗ trợ phần mở rộng và tích hợp với các công cụ kiểm thử khác.
Testbench và Orchestra Testbench giúp chúng ta kiểm tra các gói Laravel một cách dễ dàng và chính xác hơn. Với Testbench, chúng ta có thể tạo môi trường kiểm thử độc lập và giả lập yêu cầu HTTP và truy vấn cơ sở dữ liệu. Còn với Orchestra Testbench, chúng ta có thể sử dụng các phương thức để giả lập yêu cầu HTTP và truy vấn cơ sở dữ liệu một cách dễ dàng hơn.
Chúng ta cũng đã tìm hiểu cách tự động hóa các bài test và hỗ trợ phần mở rộng với Orchestra Testbench. Ngoài ra, chúng ta đã thấy cách tích hợp Testbench và Orchestra Testbench với các công cụ kiểm thử khác để giúp chúng ta thực hiện kiểm thử một cách toàn diện và hiệu quả hơn.
Tóm lại, Testbench và Orchestra Testbench là những công cụ mạnh mẽ giúp chúng ta kiểm thử các gói Laravel một cách dễ dàng và chính xác. Chúng ta có thể sử dụng chúng để đảm bảo rằng ứng dụng của mình hoạt động đúng như mong đợi và đáp ứng được yêu cầu của người dùng.