测试
简介
Laravel 天生就具有测试的基因。事实上,Laravel 默认就支持用 PHPUnit 来做测试,并为你的应用程序配置好了 phpunit.xml
文件。框架还提供了 一些便利的辅助函数,让你可以更直观的测试应用程序。
在 tests
目录中有提供一个 ExampleTest.php
的示例文件。安装新的 Laravel 应用程序之后,只需在命令行上运行 phpunit
就可以进行测试。
测试环境
在运行测试时,Laravel 会自动将环境变量设置为 testing
,并将 Session 及缓存以 array
的形式存储,也就是说在测试时不会持久化任何 Session 或缓存数据。
你可以随意创建其它必要的测试环境配置。testing
环境的变量可以在 phpunit.xml
文件中被修改,但是在运行测试之前,请确保使用 config:clear
Artisan 命令来清除配置信息的缓存。
定义并运行测试
可以使用 make:test
Artisan 命令,创建一个测试案例:
php artisan make:test UserTest
此命令会放置一个新的 UserTest
类至你的 tests
目录。接着就可以像平常使用 PHPUnit 一样来定义测试方法。要运行测试只需要在终端上运行 phpunit
命令即可:
<?php
use Illuminate\Foundation\Testing\WithoutMiddleware;
use Illuminate\Foundation\Testing\DatabaseMigrations;
use Illuminate\Foundation\Testing\DatabaseTransactions;
class UserTest extends TestCase
{
/**
* 基本的测试样例。
*
* @return void
*/
public function testExample()
{
$this->assertTrue(true);
}
}
如果要在你的类自定义自己的 setUp
方法,请确保调用了 parent::setUp
。
测试应用程序
Laravel 为 HTTP 请求的生成和发送操作、输出的检查,甚至表单的填写都提供了非常流利的 API。 举例来说,你可以看看 tests
目录中的 ExampleTest.php
文件:
<?php
use Illuminate\Foundation\Testing\WithoutMiddleware;
use Illuminate\Foundation\Testing\DatabaseTransactions;
class ExampleTest extends TestCase
{
/**
* 一个基本的功能测试样例。
*
* @return void
*/
public function testBasicExample()
{
$this->visit('/')
->see('Laravel 5')
->dontSee('Rails');
}
}
visit
方法会创建一个 GET
请求,see
方法则断言在返回的响应中会有指定的文本,dontSee
方法断言在返回的响应中不会有指定的文本。这是 Laravel 所提供的最基本的应用程序测试。
与你的应用程序进行交互
当然,除了断言文本是否存在于一个指定的响应中,你还可以做更多的交互。让我们来看看点击链接及填写表单的例子:
点击链接
在这个测试中,我们会生成一个请求并「点击」返回响应中的链接,接着断言我们会停留在指定的 URI 上。举个例子,假设在响应中有个链接,并写着「About Us」:
<a href="/about-us">About Us</a>
现在,我们编写一个测试,点击链接并断言用户会停留在正确的页面:
public function testBasicExample()
{
$this->visit('/')
->click('About Us')
->seePageIs('/about-us');
}
使用表单
Laravel 还提供了几种用于测试表单的方法。通过 type
、select
、check
、attach
及 press
方法让你与表单的所有输入框进行交互。举个例子,让我们想像一下有个在应用程序注册页面的表单:
<form action="/register" method="POST">
{!! csrf_field() !!}
<div>
Name: <input type="text" name="name">
</div>
<div>
<input type="checkbox" value="yes" name="terms"> Accept Terms
</div>
<div>
<input type="submit" value="Register">
</div>
</form>
我们可以 编写一个测试来填写此表单,并检查结果:
public function testNewUserRegistration()
{
$this->visit('/register')
->type('Taylor', 'name')
->check('terms')
->press('Register')
->seePageIs('/dashboard');
}
当然,如果你的表单中包含了类似单选框或下拉式菜单的其它输入框,也可以很轻松的填入这些类型的区域。以下是每个表单的方法操作列表:
方法 | 说明 |
---|---|
$this->type($text, $elementName) | 「输入(type)」文本在一个指定的区域 |
$this->select($value, $elementName) | 「选择(select)」一个单选框或下拉式菜单的区域 |
$this->check($elementName) | 「勾选(check)」一个复选框的区域 |
$this->uncheck($elementName) | 「取消勾选(uncheck)」一个复选框的区域 |
$this->attach($pathToFile, $elementName) | 「附加(attach)」一个文件至表单 |
$this->press($buttonTextOrElementName) | 「按下(press)」一个指定文本或名称的按钮 |