+5

Viết test với Laravel Dusk

1. Mở đầu

Tất cả chúng ta đều hiểu rằng testing là công việc quan trọng đối với mọi dự án. Nhằm giúp cho các developer có thể thực hiện test ứng dụng dễ dàng hơn thì ở bản Laravel 5.4 cho ra đời Dusk. Ở bài viết hôm nay mình sẽ nói rõ hơn về Dusk để xem nó giúp được gì cho chúng ta trong việc test ứng dụng Laravel nhé.

Xét về mặt kiến trúc của một ứng dụng thì nhiều ứng dụng Laravel chỉ xữ lý một phần logic ở back-end còn lại các xữ lý logic phụ khác thì các framework của javascript như Angular hoặc Vue xữ lý. Bằng cách này thì ứng dụng sẽ có trải nghiệm người dùng tốt hơn nhưng khi mà ứng dụng bị break thành hai phần như vậy thì chúng ta sẽ gặp khá nhiều khó khăn để viết test.

Laravel 5.4 và Dusk Như các bạn đã biết thì với các bản trước đó của Laravel, phần testing cung cấp cho chúng ta nhiều method để test HTTP request hoặc test hành vi của trình duyệt như visit một trang, click link, button...Laravel sử dụng thành phần Symfony BrowserKit để mô phỏng một trình duyệt web nhưng nó không phải là một trình duyệt thực sự.

Với Laravel 5.4 điều này đã thay đổi. Mặc định thì ứng dụng sẽ chứa một thư mục Feature và một thư mục Unit. Phần test tính năng sẽ giống như test Application của các bản Laravel trước đó nhưng sẽ không bao gồm browser nữa, vì vậy nếu bạn muốn thực hiện các thao tác như visit một trang, click vào một link… bạn sẽ cần đến Dusk. Tất cả mọi thứ liên quan đến trình duyệt bây giờ sẽ là một phần của Dusk và với Dusk bây giờ chúng ta đã có một trình duyệt thưc sự.

2. Cài đặt

Vào terminal gõ lệnh sau để cài đặt Dusk: composer require laravel/dusk

Khi Dusk đã được cài đặt bạn cần đăng ký Laravel\Dusk\DuskServiceProvider service provider. Bạn cần đăng ký provider này trong phương thức register của AppServiceProvider để giới hạn môi trường mà Dusk được sử dụng.

<?php
...
public function register()
{
	if ($this->app->environment('local', 'testing')) {
		$this->app->register(DuskServiceProvider::class);
	}
}
...

Bước tiếp theo là run dusk:install. php artisan dusk:install

Khi chạy xong thì một thư mục Browser sẽ được tạo ra trong thư mục tests.

Chú ý: Đừng quên thêm APP_URL của bạn vào file .env vì Dusk sẽ cần nó để duyệt ứng dụng của bạn.

3. Ví dụ

Bên trong thư mục tests/Browser/ExampleTest.php

<?php
...
public function testBasicExample()
{
	$this->browse(function ($browser) {
		$browser->visit('/')
			->assertSee('Laravel');
	});
}
...

File này cũng tương tự như ExampleTest của bản cũ nhưng bây giờ thì nó đang sử dụng ChromeDriver. Chúng ta sử dụng phương thức browse nhận vào một callback, callback này sẽ get được thực thể main browser và sử dụng nó cho việc assertion. Bây giờ chúng a chạy lệnh sau đây để thực hiện việc test.

php artisan dusk

Thay vì chờ đợi toàn bộ phần giao diện người dùng được nạp, Dusk cho phép bạn waiting một yếu tố hoặc một điều kiện nhất định nào đó.

<?php
...
$this->browse(function ($browser) {
	$browser->visit('/')
		->waitForText('Hello Dusk!')
		->assertSee('Hello Dusk!');
});
...

Mặc định nó sẽ waiting tối đa 5 giây cho đoạn test đó. Bạn có thể thay đổi thời gian chờ bằng việc truyền vào một param nữa kiểu như: waitForText(‘hello’, 1).

Ngoài đoạn text thì bạn có thể waiting các thành phần khác kiểu như sau:

<?php
...
// Wait for a selector
$browser->waitFor('.selector');
...
// Wait for a selector to disapear
$browser->waitUntilMissing('.selector');
...
// Wait for a text link
$browser->waitForLink('Create');
...

Bạn cũng có thể waiting cho đến khi điều kiện của Javascript đúng.Thật vi diệu

<?php
...
$browser->waitUntil('appLoaded');
...
$browser->waitUntil('users > 0');
...

4. Thay đổi đoạn text với Javascript

Đôi lúc bạn cần thay đổi nội dung của đoạn text với Javascript. Hãy làm một ví dụ đơn giản sau nhé. Bạn sẽ thay đổi chữ Laravel quen thuộc trong view welcome mặc định của Laravel bằng chữ Dusk sau 2 giây nhé. Thêm đoạn script này vào view welcome.blade.php và gán id là "title" cho title Laravel nhé.

<script>
	setTimeout(function(){
		document.getElementById("title").innerHTML = "Dusk";
	}, 2000);
</script>

Bây giờ bạn có thể thêm hai đoạn test sau để kiểm tra nội dung đoạn text lúc ban đầu và sau đó 2 giây nhé.

<?php
...
$this->browse(function ($browser) {
	$browser->visit('/')
		->assertSee('Laravel');
});

$this->browse(function ($browser) {
	$browser->visit('/')
		->waitForText('Dusk')
		->assertSee('Dusk');
});
...

Ngoài ra chúng ta có thể sử dụng hai trình duyệt để test với Dusk.

<?php
...
$this->browse(function ($first, $second) {
    $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');
});
...

5. Kết luận

Khi sử dụng Dusk mình chỉ muốn nói rằng nó thực sự rất vi diệu. Hãy cùng trải nghiệm nhé [Tài liệu tham khảo] Official docs Github


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí