Skip to content

测试入门

介绍

Laravel 在构建时考虑了测试。事实上,对使用 PestPHPUnit 进行测试的支持是开箱即用的,并且已经为您的应用程序设置了 phpunit.xml 文件。该框架还附带了方便的帮助程序方法,允许您以表达方式测试应用程序。

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

功能测试可以测试代码的很大一部分,包括多个对象如何相互交互,甚至是对 JSON 终端节点的完整 HTTP 请求。通常,您的大多数测试都应该是功能测试。这些类型的测试最能保证您的系统作为一个整体按预期运行。

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

环境

在运行测试时,由于 phpunit.xml 文件中定义的环境变量,Laravel 会自动将配置环境设置为 testing。Laravel 还自动将 session 和 cache 配置到数组驱动程序,以便在测试时不会保留 session 或 cache 数据。

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

.env.testing 环境文件

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

创建测试

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

shell
php artisan make:test UserTest

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

shell
php artisan make:test UserTest --unit

NOTE

可以使用 stub publishing 自定义测试。

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

php
<?php

test('basic', function () {
    expect(true)->toBeTrue();
});
php
<?php

namespace Tests\Unit;

use PHPUnit\Framework\TestCase;

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

WARNING

如果你在测试类中定义了自己的 setUp / tearDown 方法,请确保在父类上调用相应的 parent::setUp() / parent::tearDown() 方法。通常,你应该在你自己的 setUp 方法的开头调用 parent::setUp(),tearDown 方法的末尾调用 parent::tearDown()。

运行测试

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

shell
./vendor/bin/pest
shell
./vendor/bin/phpunit

除了 pestphpunit 命令之外,您还可以使用 test Artisan 命令来运行测试。Artisan 测试运行程序提供详细的测试报告,以便简化开发和调试:

shell
php artisan test

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

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

并行运行测试

默认情况下,Laravel 和 Pest / PHPUnit 在单个进程中按顺序执行您的测试。但是,您可以通过跨多个进程同时运行测试来大大减少运行测试所需的时间。首先,您应该将 brianium/paratest Composer 包安装为 “dev” 依赖项。然后,在执行 test Artisan 命令时包含 --parallel 选项:

shell
composer require brianium/paratest --dev

php artisan test --parallel

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

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

WARNING

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

并行测试和数据库

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

默认情况下,测试数据库在对 test Artisan 命令的调用之间保留,以便后续测试调用可以再次使用它们。但是,您可以使用 --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;
    use PHPUnit\Framework\TestCase;

    class AppServiceProvider extends ServiceProvider
    {
        /**
         * 引导任何应用程序服务
         */
        public function boot(): void
        {
            ParallelTesting::setUpProcess(function (int $token) {
                // ...
            });

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

            // Executed when a test database is created...
            ParallelTesting::setUpTestDatabase(function (string $database, int $token) {
                Artisan::call('db:seed');
            });

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

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

Accessing the Parallel Testing Token

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

php
    $token = ParallelTesting::token();

测试报告

WARNING

此功能需要 XdebugPCOV。

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

shell
php artisan test --coverage

实施最低覆盖率阈值

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

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

性能分析测试

Artisan 测试运行程序还包括一个方便的机制,用于列出应用程序最慢的测试。使用 --profile 选项调用 test 命令,可以看到 10 个最慢测试的列表,以便您轻松调查哪些测试可以改进以加快测试套件的速度:

shell
php artisan test --profile