Laravel在构建时考虑了测试。实际上,开箱即用支持使用PHPUnit进行测试,并且已经为您的应用程序设置了一个文件。该框架还附带方便的帮助方法,允许您明确地测试您的应用程序。phpunit.xml默认情况下,应用程序的tests目录包含两个目录:FeatureUnit

单元测试是专注于代码中非常小的,孤立的部分的测试。

事实上,大多数单元测试可能只关注单一方法。

功能测试可以测试代码的大部分,包括多个对象如何相互交互,甚至是对JSON端点的完整HTTP请求。

在和测试目录中都提供了一个文件。安装新的Laravel应用程序后,在命令行上运行以运行测试。

ExampleTest.php  Feature   Unit   phpunit

环境

通过运行测试时phpunittesting由于文件中定义的环境变量,Laravel将自动设置配置环境。Laravel还会在测试时自动为驱动程序配置会话和缓存,这意味着在测试时不会保留会话或缓存数据。phpunit.xml  array您可以根据需要自由定义其他测试环境配置值。该testing环境变量可以在中配置文件,但请务必使用清除配置缓存运行测试之前,工匠的命令!phpunit.xml  config:clear

创建和运行测试

要创建新的测试用例,请使用Artisan命令:make:test

// Create a test in the Feature directory...
php artisan make:test UserTest

// Create a test in the Unit directory...
php artisan make:test UserTest --unit

 

生成测试后,您可以像通常使用PHPUnit一样定义测试方法。要运行测试,请phpunit从终端执行命令:

<?php

namespace Tests\Unit;

use Tests\TestCase;
use Illuminate\Foundation\Testing\RefreshDatabase;

class ExampleTest extends TestCase
{
    /**
     * A basic test example.
     *
     * @return void
     */
    public function testBasicTest()
    {
        $this->assertTrue(true);
    }
}

HTTP测试

Laravel提供了一个非常流畅的API,用于向您的应用程序发出HTTP请求并检查输出。例如,看看下面定义的测试:


<?php

namespace Tests\Feature;

use Tests\TestCase;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Foundation\Testing\WithoutMiddleware;

class ExampleTest extends TestCase
{
    /**
     * A basic test example.
     *
     * @return void
     */
    public function testBasicTest()
    {
        $response = $this->get('/');

        $response->assertStatus(200);
    }
}


get方法GET向应用程序发出请求,而该assertStatus方法断言返回的响应应具有给定的HTTP状态代码。除了这个简单的断言之外,Laravel还包含各种用于检查响应头,内容,JSON结构等的断言。

自定义请求标头

您可以使用该withHeaders方法在将请求的标头发送到应用程序之前对其进行自定义。这允许您添加您想要的任何自定义标头:

$response = $this->withHeaders([
    'X-Header' => 'Value' ,
])->json('POST' , '/user' , ['name' => 'Sally']);

$response->assertStatus(200)
    ->assertJson([
        'created' => true , 
    ]);


会话/认证

Laravel提供了几个帮助程序,用于在HTTP测试期间使用会话。首先,您可以使用该withSession方法将会话数据设置为给定数组。在向应用程序发出请求之前,这对于使用数据加载会话非常有用:

$response->withSession(['foo' => 'bar'])->get('/');


当然,会话的一个常见用途是维护经过身份验证的用户的状态。的actingAs辅助方法提供了一种简单的方式来给定用户作为当前用户进行认证。例如,我们可以使用模型工厂来生成和验证用户:

$user = factory(User::class)->create();
$response = $this->actingAs($user)
                 ->withSession(['foo'=>'bar'])
                 ->get('/');


您还可以通过将保护名称作为第二个参数传递给方法来指定应该使用哪个保护来验证给定用户actingAs

$this->actingAs($user , 'api');


测试JSON API

Laravel还提供了几个帮助程序来测试JSON API及其响应。例如,jsongetpostputpatch,和delete方法可被用于发出与各种HTTP动词请求。您也可以轻松地将数据和标题传递给这些方法。首先,让我们编写一个测试来发出POST请求/user并声明返回了预期的数据:

$response = $this->json('POST' ,'/user' , ['name' => 'Sally']);
$response->assertStatus(200)
         ->assertExactJson([
             'created' => true ,
         ]);


assertJson方法将响应转换为数组,并用于验证给定数组是否存在于应用程序返回的JSON响应中。因此,如果JSON响应中还有其他属性,只要给定的片段存在,此测试仍将通过。PHPUnit::assertArraySubset

 

验证精确的JSON匹配

如果要验证给定数组是否与应用程序返回的JSON 完全匹配,则应使用以下assertExactJson方法:

$response = $this->json('POST' ,'/user' , ['name' => 'Sally']);
$response->assertStatus(200)
         ->assertExactJson([
             'created' => true ,
         ]);


测试文件上传

的类提供一个可被用于生成虚拟文件或图像用于测试方法。这与facade的方法相结合,大大简化了文件上传的测试。例如,您可以结合使用这两个功能轻松测试头像上传表单:Illuminate\Http\UploadedFilefakeStoragefake

public function testAvatarUpload()
{
    Storage::fake('avatars');

    $response = $this->json('POST' , '/avatar' , [
        'avatar' => UploadedFile::fake()->image('avatar.jpg')
    ]);

    //Assert the file was stored ...
    Storage::disk('avatars')->assertExists('avatar.jpg');

    //Assert a file does not exist...
    Storage::disk('avatars')->assertMissing('missing.jpg');


}


假文件定制

使用该fake方法创建文件时,您可以指定图像的宽度,高度和大小,以便更好地测试验证规则:

UploadedFile::fake()->image('avatar.jpg' , $width , $height)->size(100);


除了创建图像,您还可以使用以下create方法创建任何其他类型的文件:

UploadedFile::fake()->create('document.pdf' , $sizeInkilobytes);


可用的断言

响应断言

Laravel为您的PHPUnit测试提供了各种自定义断言方法。这些断言可以对从该返回的响应进行访问jsongetpostput,和delete试验方法:

assertCookie

断言响应包含给定的cookie:


$response->assertCookie($cookieName , $value = null);


assertCookieExpired

断言响应包含给定的cookie并且它已过期:


$response->assertCookieExpired($cookieName);


assertCookieMissing

断言响应不包含给定的cookie:

assertCookieMissing

断言响应不包含给定的cookie:

assertDontSee

断言给定字符串不包含在响应中:


$response->assertDontSee($value);


身份验证断言

Laravel还为PHPUnit测试提供了各种与身份验证相关的断言:

浏览器测试(Laravel Dusk)

介绍

Laravel Dusk提供了一个富有表现力且易于使用的浏览器自动化和测试API。默认情况下,Dusk不要求您在计算机上安装JDK或Selenium。相反,Dusk使用独立的ChromeDriver安装。但是,您可以自由使用任何其他Selenium兼容的驱动程序。

安装

首先,您应该将Composer依赖项添加到项目中:laravel/dusk composer require --dev laravel/dusk安装Dusk后,您应该注册服务提供商。通常,这将通过Laravel的自动服务提供商注册自动完成。Laravel\Dusk\DuskServiceProvider

如果手动注册黄昏的服务提供者,你应该从来没有在生产环境中进行注册,因为这样做可能导致任意用户能够与您的应用程序进行身份验证。

安装Dusk软件包后,运行Artisan命令:dusk:install

php artisan dusk:install

Browser将在您的tests目录中创建一个目录,该目录将包含一个示例测试。接下来,APP_URL.env文件中设置环境变量。此值应与用于在浏览器中访问应用程序的URL匹配。要运行测试,请使用duskArtisan命令。该dusk命令接受命令也接受的任何参数phpunit

php artisan dusk

使用其他浏览器

默认情况下,Dusk使用Google Chrome和独立的ChromeDriver安装来运行浏览器测试。但是,您可以启动自己的Selenium服务器并针对您希望的任何浏览器运行测试。
要开始使用,请打开您的文件,这是您的应用程序的基础Dusk测试用例。在此文件中,您可以删除对方法的调用。这将阻止Dusk自动启动

ChromeDriver:tests/DuskTestCase.phpstartChromeDrivers

**
 * Prepare for Dusk test execution.
 *
 * @beforeClass
 * @return void
 */
public static function prepare()
{
    // static::startChromeDriver();
}