Laravel Dusk,让你的浏览器测试更优雅

当你使用一个 Laravel 5.4 开始你的应用程序时,Laravel Dusk 给我们带来一个在浏览器测试的API,它给我们一个内置的 ChromeDriver , 当然别的浏览器要使用的话,可以使用 Selenium

当你的环境支持 Laravel 5.4 时,第一步是安装一个 demo ,我们使用composer安装Laravel

composer create-project --prefer-dist laravel/laravel demo

安装 Laravel Dusk

composer require laravel/dusk

file

在你的 Laravel 应用中注册 DuskServiceProvider,有两个方法

方法一

我们可以在 config/app.php文件中 providers数组中注册,

App\Providers\RouteServiceProvider::class,
Laravel\Dusk\DuskServiceProvider::class,

file

这种方法会在 Laravel 中全局注册,如果不想要全局注册我们使用方法二。

方法二

在安装环境中的 AppServiceProvider 注册 DuskServiceProvider

namespace App\Providers;

use Illuminate\Support\ServiceProvider;
use Laravel\Dusk\DuskServiceProvider;

class AppServiceProvider extends ServiceProvider
{
    /**
     * Register any application services.
     *
     * @return void
     */
    public function register()
    {
        if ($this->app->environment('local', 'testing', 'staging')) {
           $this->app->register(DuskServiceProvider::class);
        }
    }
}

接下来我们安装 DUSK

php artisan dusk:install

file

接下来开始我们的测试

第一个测试

首先我们完成Laravel的认证机制。

php artisan make:auth

file

我们创建一个 Dusk 测试

php artisan dusk:make LoginTest

file

上面这个命令会在 tests\Browser 目录下创建一个 LoginTest

file

namespace Tests\Browser;

use Tests\DuskTestCase;
use Illuminate\Foundation\Testing\DatabaseMigrations;

class LoginTest extends DuskTestCase
{
    /**
     * A Dusk test example.
     *
     * @return void
     */
    public function testExample()
    {
        $this->browse(function ($browser) {
            $browser->visit('/')
                    ->assertSee('Laravel');
        });
    }
}

注意:登录的话需要用户,我们已经添加了测试用户。

  • 添加测试用户
    1.执行命令创建 User
    php artisan migrate

    2.使用 tinker 命令添加10条测试数据

    php artisan tinker
    factory(App\User::class, 10)->create();

    当然我们自然也可以自己注册。测试的话需要知道用户名和密码。
    邮箱: moocfans@moocfans.cn
    密码: moocfans
    file
    我们在 LoginTest 类中添加一个验证用户登录成功并返回欢迎页的测试用例。

    /**
     * A Dusk test example.
     *
     * @return void
     */
    public function test_I_can_login_successfully()
    {
        $this->browse(function ($browser) {
            $browser->visit('/login')
                    ->type('email', 'moocfans@moocfans.cn')
                    ->type('password', 'moocfans')
                    ->press('Login')
                    ->assertSee('You are logged in!');
        });
    }

    接下来我们开始测试

    php artisan dusk

    如果你的数据库有正确的数据,则会返回下面的结果。
    file

注意 chrome版本需>54

失败的测试

我们可以刻意的修改一个错误的测试用例, PHPUnit 给我们抛出的错误提示。我们先把登录密码改成 1

public function test_I_can_login_successfully()
    {
        $this->browse(function ($browser) {
            $browser->visit('/login')
                    ->type('email', 'moocfans@moocfans.cn')
                    ->type('password', '1')
                    ->press('Login')
                    ->assertSee('You are logged in!');
        });
    }

file

用户名和密码不匹配。所以有错误提示。Dusk 会把错误截图直接放到 \tests\Browser\screenshots 中,以方便大家可以更加准确的查找错误。
file

测试Ajax调用

Dusk 当然也可以测试ajax调用。
我们有一个完美的测试用例,在github上 ajax测试demo
我们下载下来直接可以用。

创建一个新的测试用例的过程,创建测试用例

 php artisan dusk:make CreateTaskTest

file

然后编辑测试用例

    class CreateTaskTest extends DuskTestCase
{
    /**
     * A Dusk test example.
     *
     * @return void
     */
    public function test_I_can_create_task_successfully()
    {
        $this->browse(function ($browser) {

            $browser->visit('/tasks/create')
                    ->type('title', 'My Task')
                    ->press('Add Task')
                    ->pause(5000)
                    ->assertPathIs('/tasks');
        });
    }
}
  • 测试用例的执行过程
    1. 输入标题
    2. 单击“添加任务”按钮
    3. 等待5秒
    4. 然后重定向到任务页

file

我们也可以使用 waitUntilMissing 来执行 DuskAPI

 <?php

namespace Tests\Browser;

use Tests\DuskTestCase;
use Illuminate\Foundation\Testing\DatabaseMigrations;

class CreateTaskTest extends DuskTestCase
{
    /**
     * A Dusk test example.
     *
     * @return void
     */
    public function test_I_can_create_task_successfully()
    {
        $this->browse(function ($browser) {

            $browser->visit('/tasks/create')
                    ->type('title', 'My Task')
                    ->press('Add Task')
                    ->waitUntilMissing('.btn-primary')
                    ->assertPathIs('/tasks');
        });
    }
}

更多的API请查看Laravel 5.4 文档

在看另外一个例子

模式对话框绑定你的登录EMail
创建这个测试用例的过程。

  1. 登录
  2. 找到 链接 Support Email
  3. 单击 Support Email
  4. 看到你绑定的EMail

根据上面的过程,我们创建测试用例
首先,先创建一个名为 SupportEmailsTest 测试用例

php artisan dusk:make SupportEmailsTest

编辑测试用例

class SupportEmailsTest extends DuskTestCase
{
    /**
     * A Dusk test example.
     *
     * @return void
     */
    public function test_I_can_open_modal_for_support_emails()
    {
        $this->browse(function ($browser) {

            $user = factory(User::class)->create();

            $browser->loginAs($user)
                    ->visit('/tasks')
                    ->clickLink('Support Email')
                    ->whenAvailable('#modal-support', function ($modal) use($user) {
                        $modal->assertInputValue('#support-from', $user->email);
                    });
        });
    }
}

我们来执行这个测试用例

php artisan dusk tests/Browser/SupportEmailsTest.php

file

更多的API请查看Laravel 5.4 文档

页面

DuskPages 是功能强大的可重用的测试类。
让我们使用 createtasktest 创建页面重构。

php artisan dusk:page CreateTaskPage

创建的页面会存放在 tests/Browser/Pages 目录中

我们来编辑这个类

public function url()
{
    return '/tasks/create';
}

url 可以导航 Dusk 执行的地址。

public function assert(Browser $browser)
{
    $browser->assertPathIs($this->url());
}

assert 定义页面的 assertions,当使用 CreateTaskPage 时,这些 assertions 将会使用 assert 方法执行。
在上面的例子中,我们只是明确 Url 是正确的。

public function elements()
{
    return [
        '@addTask' => '.btn-primary',
    ];
}

elements 方法可以定义选择器。我们可以定义程序可读的名称选择器和重用他们的网页在不同的测试案例。在上面的示例中,我定义了添加任务按钮的选择器。
现在让我们修改 createtasktest 类并使用选择器:

class CreateTaskTest extends DuskTestCase
{
    /**
     * A Dusk test example.
     *
     * @return void
     */
    public function test_I_can_create_task_successfully()
    {
        $this->browse(function ($browser) {

            $user = factory(User::class)->create();

            $browser->loginAs($user)
                    ->visit(new CreateTaskPage)
                    ->type('title', 'My Task')
                    ->click('@addTask')
                    ->waitUntilMissing('@addTask')
                    ->assertPathIs('/tasks');
        });
    }
}

我们修改看了 createtaskpage。现在让我们重新运行我们的测试,看看是否一切正常:
和上面测试一样,因此图我就用了同一个。
file

您可以定义自定义方法以执行某些页面的可重用操作。您可以阅读更多关于官方文件。

引用
参考原网页 :https://www.sitepoint.com/laravel-dusk-int...

本作品采用《CC 协议》,转载必须注明作者和本文链接
持续做一件事,必定有所成就
本帖由 Summer 于 7年前 加精
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 12

自己顶一下:sun_with_face:

7年前 评论
Summer

手动点赞,目前为止最棒的 dusk 教程

7年前 评论
DukeAnn

晚上回去看

7年前 评论
Destiny

手动点赞!

7年前 评论

假若遇到一些组件,就比较蛋疼了。

7年前 评论

为什么这么厉害的人不用找工作?来看看我这的工作啊。

7年前 评论

@张铁林 可惜您的公司在杭州。:smile:

7年前 评论

嗯,杭州淘宝公司多,北京技术人员多,这就是宿命,哈哈。

7年前 评论
  • 这种测试方式只能在windows下实现吗,docker环境以及linux环境下应该如何操作呢?
  • 还有ChromeDriver 是否需要单独安装这个服务呀?
6年前 评论

windows下单独跑了个ChromeDriver,测试跑起来了,但是没有自动打开chrome以及页面,请问下这个是为啥呢?

6年前 评论
qiuyuhome

感觉可以用来做爬虫

突然有个想法, 这 dusk 具备了虚拟浏览器爬虫的特性. chromedriver 可以使用 headless 模式, 在 linux 命令行下也可以运行, 那么, 是不是就可以用来做爬虫了? 用来抓取一些 ajax 的页面数据. 这个想法我还没有验证.

6年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!