12/08/2018, 15:33

Browser test trong Laravel

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 ...

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 LaravelDuskDuskServiceProvider trong method register của provider AppServiceProvider.

use LaravelDuskDuskServiceProvider;

/**
 * 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 TestsBrowser;

use TestsDuskTestCase;
use LaravelDuskBrowser;
use IlluminateFoundationTestingDatabaseMigrations;

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', 'admin@laravel.com')->first();
    if (!$user) {
        $user = factory(User::class)->create([
            'email' => 'admin@laravel.com',
            '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', 'taylor@laravel.com');

// 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($$itle) Xác nhận page title match với $$itle
assertTitleContains($$itle) Xác nhận page title chứa $$itle
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,name, name,parameters) Xác nhận URL hiện tại match với route name $$ame
assertQueryStringHas(name,name, name,value) Xác nhận truy vấn đã tham số name có giá trị value
assertQueryStringMissing($$ame) Xác nhận truy vấn thiếu tham số $$ame
assertHasCookie($$ame) Xác nhận có cookie $$ame
assertCookieValue(name,name, name,value) Xác nhận cookie name có giá trị value
assertSee($$ext) Xác nhận có text $$ext trong page
assertDontSee($$ext) Xác nhận ko có text $$ext trong page
assertSeeIn(selector,selector, selector,text) Xác nhận có text texttrongselectortext trong selector texttrongselectorselector
assertSeeLink($$inkText) Xác nhận có link $$inkText trong page
assertInputValue(field,field, field,value) Xác nhận input field có giá trị value
assertChecked($$ield) Xác nhận input type checkbox checked
assertRadioSelected(field,field, field,value) Xác nhận input type radio selected
assertSelected(field,field, field,value) Xác nhận input type dropdown selected
assertValue(selector,selector, 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

0