Laravel 5.4 Testing - The Dusk API

25 篇文章 0 订阅

Laravel 5.4在测试方面进行了更新,所以5.3版本及之前的浏览器测试语法和API在新版本中默认已经不能使用,取而代之的是Dusk,一个默认使用ChromeDriver的测试Layer。

如果你在使用PHPUnit进行测试的时候报错,例如类似Error: Call to undefined method CUSTOM_NAME_Test::visit()的话,那么请检查一下你的Laravel版本,是否是最新的Laravel5.4,如果是的话,而你又想使用以前的测试语法,那么可以参考官网给出的升级办法:

https://laravel.com/docs/5.4/upgrade

在里面Testing部分是这样描述的:

Laravel 5.4’s testing layer has been re-written to be simpler and lighter out of the box. If you would like to continue using the testing layer present in Laravel 5.3, you may install the laravel/browser-kit-testing package into your application. This package provides full compatibility with the Laravel 5.3 testing layer. In fact, you can run the Laravel 5.4 testing layer side-by-side with the Laravel 5.3 testing layer.

所以,不想使用Dusk或者想兼容旧版测试的话,可以安装laravel/browswe-kit-testing这个包裹。具体办法请移步上述链接查看详情。


而我们今天要来学习一下Laravel 5.4中如何使用Dusk来进行浏览器测试。

第一步先在项目中加入laravel/dusk这个dependency:

$ composer require laravel/dusk

完成之后,我们需要注册Laravel\Dusk\DuskServiceProvider这个服务。Laravel官方特别说明我们应该在AppServiceProvider中使用register函数来限制可以调用dusk的环境,因为dusk提供了可以作为其他用户来登陆的可能性。所以我们找到app/Providers目录,将以下代码放进AppServiceProvider中:


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

注意$this->app->environment('local', 'testing')相当于调用了app()->environment()。$this->app是在任何一个service provider之中都能够调用的一个container实例,这里我们把dusk限制在了local或者testing环境中。

接下来,运行dusk:install命令:

$ php artisan dusk:install

完成后,我们会在tests文件夹中看见一个新生成的叫Browser的文件夹,其中已经有一个example test了。接下来,我们打开项目根目录下的.env文件,把其中APP_URL环境变量设置为我们当前浏览器可以访问到的项目地址。例如我在浏览器中输入teahouse.app,就可以访问到我项目的首页,那么APP_URL的设置就是

APP_URL = http://teahouse.app

好了,基本设置就完成了!要进行测试,可以使用dusk命令(dusk也接受phpunit所能够接受的参数):

$ php artisan dusk

php artisan dusk

注意了,如果你处于vagrant的laravel homestead虚拟机中(使用ssh进行连接),那么如果按照上面的步骤做完,运行php artisan dusk会看到

Failed to connect to localhost port 9515: Connection refused

这样的错误,原因是guest系统中需要安装google-chrome。解决办法如下:

输入以下命令来安装Chrome(摘自github并已亲测可用):

$ wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | sudo apt-key add -
$ sudo sh -c 'echo "deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google-chrome.list'
$ sudo apt-get update && sudo apt-get install -y google-chrome-stable

接下来安装xvfb

$ sudo apt-get install -y xvfb

现在我们尝试运行./vendor/laravel/dusk/bin/chromedriver-linux --port=8888,如果报错(缺少libnss3.so, libgconf-2.so.4库)的话,尝试

$ sudo apt-get install -y libnss3-dev libxi6 libgconf-2-4

当运行

$ ./vendor/laravel/dusk/bin/chromedriver-linux --port=8888

显示的是

$ ./vendor/laravel/dusk/bin/chromedriver-linux --port=8888
Starting ChromeDriver 2.25.426924 (649f9b868f6783ec9de71c123212b908bf3b232e) on port 8888
Only local connections are allowed.

类似信息时,说明ChromeDriver可以启动,那么SupportsChrome这个trait也可以启动它。所以我们可以暂时结束这个进程了(Ctrl +C)。

接下来我们运行

$ Xvfb :0 -screen 0 800x600x24 &

好了,现在我们可以运行dusk了!

php artisan dusk


补充一下,如果我们需要结束Xvfb的进程,我们需要查看当前的process:

vagrant@homestead:~/Webdev/teahouse$ ps
  PID TTY          TIME CMD
 2378 pts/0    00:00:00 bash
 3076 pts/0    00:00:00 Xvfb
 3099 pts/0    00:00:00 chromedriver-li
 3536 pts/0    00:00:00 ps

可以看到PID为3076和3099的进程分别为Xvfbchromedriver-li,我们可以用kill来结束它们:

$ kill 3076
$ kill 3099
$ ps
  PID TTY          TIME CMD
 2378 pts/0    00:00:00 bash
 3550 pts/0    00:00:00 ps

以后每次需要测试前,我们都需要先启动xvfb。如果不需要使用了,记得kill掉进程,以防止多开资源浪费。至于Dusk详细的API,大家可以在Laravel 5.4官网上查看:

https://laravel.com/docs/5.4/dusk

好了,今天就说到这,有什么问题欢迎讨论和交流。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值