Laravel 5.4在测试方面进行了更新,所以5.3版本及之前的浏览器测试语法和API在新版本中默认已经不能使用,取而代之的是Dusk,一个默认使用ChromeDriver的测试Layer。
如果你在使用PHPUnit进行测试的时候报错,例如类似Error: Call to undefined method CUSTOM_NAME_Test::visit()
的话,那么请检查一下你的Laravel版本,是否是最新的Laravel5.4,如果是的话,而你又想使用以前的测试语法,那么可以参考官网给出的升级办法:
在里面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
注意了,如果你处于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了!
补充一下,如果我们需要结束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的进程分别为Xvfb
和chromedriver-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官网上查看:
好了,今天就说到这,有什么问题欢迎讨论和交流。