Skip to content

测试:入门

介绍

Laravel 是以测试为中心构建的。实际上,支持使用 PHPUnit 进行测试是开箱即用的,并且已经为您的应用程序设置了一个 phpunit.xml 文件。该框架还附带了方便的辅助方法,允许您以表达式方式测试您的应用程序。

默认情况下,您的应用程序的 tests 目录包含两个目录:FeatureUnit。单元测试是专注于代码中非常小的、独立部分的测试。实际上,大多数单元测试可能专注于单个方法。位于“Unit”测试目录中的测试不会启动您的 Laravel 应用程序,因此无法访问应用程序的数据库或其他框架服务。

功能测试可能会测试代码的更大部分,包括多个对象如何相互交互,甚至是对 JSON 端点的完整 HTTP 请求。通常,您的大多数测试应该是功能测试。这些类型的测试提供了系统整体按预期运行的最大信心。

FeatureUnit 测试目录中都提供了一个 ExampleTest.php 文件。安装新的 Laravel 应用程序后,执行 vendor/bin/phpunitphp artisan test 命令以运行您的测试。

环境

运行测试时,Laravel 会自动将配置环境设置为 testing,因为在 phpunit.xml 文件中定义了环境变量。Laravel 还会在测试时自动将会话和缓存配置为 array 驱动程序,这意味着在测试期间不会持久化任何会话或缓存数据。

您可以根据需要定义其他测试环境配置值。可以在应用程序的 phpunit.xml 文件中配置 testing 环境变量,但请确保在运行测试之前使用 config:clear Artisan 命令清除配置缓存!

.env.testing 环境文件

此外,您可以在项目的根目录中创建一个 .env.testing 文件。运行 PHPUnit 测试或使用 --env=testing 选项执行 Artisan 命令时,将使用此文件而不是 .env 文件。

CreatesApplication Trait

Laravel 包含一个 CreatesApplication trait,该 trait 应用于应用程序的基本 TestCase 类。此 trait 包含一个 createApplication 方法,该方法在运行测试之前引导 Laravel 应用程序。重要的是,您要将此 trait 保留在其原始位置,因为某些功能(例如 Laravel 的并行测试功能)依赖于它。

创建测试

要创建新的测试用例,请使用 make:test Artisan 命令。默认情况下,测试将放置在 tests/Feature 目录中:

shell
php artisan make:test UserTest

如果您希望在 tests/Unit 目录中创建测试,可以在执行 make:test 命令时使用 --unit 选项:

shell
php artisan make:test UserTest --unit

如果您希望创建 Pest PHP 测试,可以为 make:test 命令提供 --pest 选项:

shell
php artisan make:test UserTest --pest
php artisan make:test UserTest --unit --pest
lightbulb

可以使用存根发布自定义测试存根。

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

php
<?php

namespace Tests\Unit;

use PHPUnit\Framework\TestCase;

class ExampleTest extends TestCase
{
    /**
     * 一个基本的测试示例。
     *
     * @return void
     */
    public function test_basic_test()
    {
        $this->assertTrue(true);
    }
}
exclamation

如果您在测试类中定义了自己的 setUp / tearDown 方法,请确保调用父类的相应 parent::setUp() / parent::tearDown() 方法。

运行测试

如前所述,编写测试后,可以使用 phpunit 运行它们:

shell
./vendor/bin/phpunit

除了 phpunit 命令,您还可以使用 test Artisan 命令运行测试。Artisan 测试运行器提供详细的测试报告,以便于开发和调试:

shell
php artisan test

可以将传递给 phpunit 命令的任何参数也传递给 Artisan test 命令:

shell
php artisan test --testsuite=Feature --stop-on-failure

并行运行测试

默认情况下,Laravel 和 PHPUnit 在单个进程中顺序执行测试。但是,您可以通过在多个进程中同时运行测试来大大减少运行测试所需的时间。要开始,请确保您的应用程序依赖于 nunomaduro/collision 包的版本 ^5.3 或更高版本。然后,在执行 test Artisan 命令时包含 --parallel 选项:

shell
php artisan test --parallel

默认情况下,Laravel 将创建与您机器上可用 CPU 核心数量相同的进程。但是,您可以使用 --processes 选项调整进程数量:

shell
php artisan test --parallel --processes=4
exclamation

在并行运行测试时,某些 PHPUnit 选项(例如 --do-not-cache-result)可能不可用。

并行测试与数据库

只要您配置了主数据库连接,Laravel 就会自动处理为每个运行测试的并行进程创建和迁移测试数据库。测试数据库将以每个进程唯一的进程标记作为后缀。例如,如果您有两个并行测试进程,Laravel 将创建并使用 your_db_test_1your_db_test_2 测试数据库。

默认情况下,测试数据库在 test Artisan 命令的调用之间保持不变,以便后续的 test 调用可以再次使用它们。但是,您可以使用 --recreate-databases 选项重新创建它们:

shell
php artisan test --parallel --recreate-databases

并行测试钩子

有时,您可能需要准备应用程序测试使用的某些资源,以便它们可以安全地被多个测试进程使用。

使用 ParallelTesting facade,您可以指定在进程或测试用例的 setUptearDown 时执行的代码。给定的闭包接收包含进程标记和当前测试用例的 $token$testCase 变量:

php
<?php

namespace App\Providers;

use Illuminate\Support\Facades\Artisan;
use Illuminate\Support\Facades\ParallelTesting;
use Illuminate\Support\ServiceProvider;

class AppServiceProvider extends ServiceProvider
{
    /**
     * 启动任何应用程序服务。
     *
     * @return void
     */
    public function boot()
    {
        ParallelTesting::setUpProcess(function ($token) {
            // ...
        });

        ParallelTesting::setUpTestCase(function ($token, $testCase) {
            // ...
        });

        // 当创建测试数据库时执行...
        ParallelTesting::setUpTestDatabase(function ($database, $token) {
            Artisan::call('db:seed');
        });

        ParallelTesting::tearDownTestCase(function ($token, $testCase) {
            // ...
        });

        ParallelTesting::tearDownProcess(function ($token) {
            // ...
        });
    }
}

访问并行测试标记

如果您希望从应用程序测试代码的任何其他位置访问当前并行进程的“标记”,可以使用 token 方法。此标记是单个测试进程的唯一字符串标识符,可用于在并行测试进程之间分割资源。例如,Laravel 会自动将此标记附加到每个并行测试进程创建的测试数据库的末尾:

php
$token = ParallelTesting::token();

报告测试覆盖率

exclamation

此功能需要 XdebugPCOV

运行应用程序测试时,您可能希望确定测试用例是否实际覆盖了应用程序代码,以及在运行测试时使用了多少应用程序代码。为此,您可以在调用 test 命令时提供 --coverage 选项:

shell
php artisan test --coverage

强制执行最低覆盖率阈值

您可以使用 --min 选项为应用程序定义最低测试覆盖率阈值。如果未达到此阈值,测试套件将失败:

shell
php artisan test --coverage --min=80.3