Unit test là 1 bước rất quan trọng trong quá trình phát triển sản phẩm. Với ngôn ngữ PHP, PhpUnit được tích hợp trong Laravel cùng với những method được viết sẵn phục vụ chúng ta dễ dàng test dự án hơn.
Laravel giúp chúng ta test dự án với 4 mục như sau: - HTTP - Browser - Database - Mocking
Ở bài này, chúng ta sẽ tìm hiểu về Browser test của Laravel.
1. Cài đặt dusk
Để chạy được browser test chúng ta cần cài đặt dusk với câu lệnh sau:
$ composer require laravel/dusk
Sau khi chạy command trên, chúng ta cần đăng kí service provider Laravel\Dusk\DuskServiceProvider trong method register của provider
AppServiceProvider.
use Laravel\Dusk\DuskServiceProvider;
/**
* Register any application services.
*
* @return void
*/
public function register()
{
if ($this->app->environment('local', 'testing')) {
$this->app->register(DuskServiceProvider::class);
}
}
Config url và môi trường của dự án trong file .env
APP_URL=http://localhost:8000
APP_ENV=local
Chạy command tiếp theo:
$ php artisan dusk:install
Sau khi chạy xong lệnh trên, folder /app/tests/Browser được tạo ra và có chứa file ExampleTest.
/app/tests/Browser/ExampleTest.php
<?php
namespace Tests\Browser;
use Tests\DuskTestCase;
use Laravel\Dusk\Browser;
use Illuminate\Foundation\Testing\DatabaseMigrations;
class ExampleTest extends DuskTestCase
{
/**
* A basic browser test example.
*
* @return void
*/
public function testBasicExample()
{
$this->browse(function (Browser $browser) {
$browser->visit('/')
->assertSee('Laravel');
});
}
}
Method testBasicExample trên xác nhận có text ‘Laravel’ ở trong page.
Để chạy unit tests, chúng ta sử dụng câu lệnh sau:
$ php artisan dusk
Kết quả:
PHPUnit 5.7.21 by Sebastian Bergmann and contributors.
. 1 / 1 (100%)
Time: 1.8 seconds, Memory: 10.00MB
OK (1 test, 1 assertion)
2. Sử dụng và một vài ví dụ cụ thể
Để tạo 1 class test, chúng ta sử dụng command artisan: dusk:make. File test được sinh ra trong folder /app/tests/Browser
$ php artisan dusk:make LoginTest
Một vài ví dụ cụ thể:
Test chức năng đăng nhập
// /app/tests/Browser/LoginTest.php
public function testLogin()
{
$user = User::where('email', '[email protected]')->first();
if (!$user) {
$user = factory(User::class)->create([
'email' => '[email protected]',
'password' => bcrypt('secret'),
]);
}
$this->browse(function (Browser $browser) use ($user) {
$browser->visit('/login') // vào trang login page
->type('email', $user->email) // nhập ô text email
->type('password', 'secret') // nhập ô password
->press('Login') // bấm nút Login
->assertPathIs('/home');
});
}
Giả lập ngường dùng đã đăng nhập để vào được màn hình /home với method loginAs
$this->browse(function ($first, $second) {
$first->loginAs(User::find(1))
->visit('/home');
});
Test chức năng chat websocket, Laravel support Multiple Browsers để dùng nhiều browsers trong 1 lần chạy unit test.
$this->browse(function ($first, $second) {
// Xác thực ngường dùng với method loginAs
$first->loginAs(User::find(1))
->visit('/home')
->waitForText('Message');
$second->loginAs(User::find(2))
->visit('/home')
->waitForText('Message')
->type('message', 'Hey Taylor')
->press('Send');
$first->waitForText('Hey Taylor')
->assertSee('Jeffrey Way');
});
3. Tương tác với các elements trong html
Laravel cung cấp rất nhiều các method được dựng sẵn phục vụ việc tự động trong quá trình Browser test
// Click link
$browser->clickLink($linkText);
// Retrieving values
$value = $browser->value('selector');
$text = $browser->text('selector');
$attribute = $browser->attribute('selector', 'value');
// Setting value
$text = $browser->text('selector');
// Nhập giá trị input email
$browser->type('email', '[email protected]');
// Xoá input type email
$browser->clear('email');
// Chọn giá trị dropdown
$browser->select('size', 'Large');
// Chọn giá trị checkbox
$browser->check('terms');
$browser->uncheck('terms');
// Chọn giá trị radio
$browser->radio('version', 'php7');
// Nhập input file
$browser->attach('photo', __DIR__.'/photos/me.png');
// Click on elements
$browser->click('.selector');
// Drag & Drop
$browser->drag('.from-selector', '.to-selector');
// Dừng unit test lại 1 khoảng thời gian (unit: miliseconds)
4. Các Assertions khả dụng
Laravel cung cấp rất nhiều ‘xác nhận’ mà bạn có thể sử dụng để chạy unittest 1 cách dễ dàng
| Assertions | Description |
|---|---|
| assertTitle($title) | Xác nhận page title match với $title |
| assertTitleContains($title) | Xác nhận page title chứa $title |
| assertPathIs(‘/home’) | Xác nhận đường dẫn hiện tại match với /home |
| assertPathIsNot(‘/home’) | Xác nhận đường dẫn hiện tại ko match với /home |
| assertRouteIs($name, $parameters) | Xác nhận URL hiện tại match với route name $name |
| assertQueryStringHas($name, $value) | Xác nhận truy vấn đã tham số $name có giá trị $value |
| assertQueryStringMissing($name) | Xác nhận truy vấn thiếu tham số $name |
| assertHasCookie($name) | Xác nhận có cookie $name |
| assertCookieValue($name, $value) | Xác nhận cookie $name có giá trị $value |
| assertSee($text) | Xác nhận có text $text trong page |
| assertDontSee($text) | Xác nhận ko có text $text trong page |
| assertSeeIn($selector, $text) | Xác nhận có text $text trong selector $selector |
| assertSeeLink($linkText) | Xác nhận có link $linkText trong page |
| assertInputValue($field, $value) | Xác nhận input $field có giá trị $value |
| assertChecked($field) | Xác nhận input type checkbox checked |
| assertRadioSelected($field, $value) | Xác nhận input type radio selected |
| assertSelected($field, $value) | Xác nhận input type dropdown selected |
| assertValue($selector, $value) | Xác nhận selector $selector có giá trị $value |
Các bạn có thể tìm hiểu thêm ở documents của Laravel: https://laravel.com/docs/5.4/dusk