简介
Laravel 在构建时就充分考虑了测试。实际上,它开箱即支持使用 Pest (opens in a new tab) 和 PHPUnit (opens in a new tab) 进行测试,并且已经为您的应用程序设置好了 phpunit.xml
文件。该框架还附带了方便的辅助方法,使您能够明确地测试您的应用程序。
默认情况下,您的应用程序的 tests
目录包含两个目录:Feature
(功能测试)和 Unit
(单元测试)。单元测试是专注于您代码中非常小的、独立的部分的测试。实际上,大多数单元测试可能专注于单个方法。在您的“单元”测试目录中的测试不会启动您的 Laravel 应用程序,因此无法访问您的应用程序的数据库或其他框架服务。
功能测试可能会测试您代码的较大部分,包括几个对象如何相互交互,甚至是对 JSON 端点的完整 HTTP 请求。通常,您的大多数测试应该是功能测试。这些类型的测试能最大程度地确保您的整个系统按预期运行。
在 Feature
(功能测试)和 Unit
(单元测试)测试目录中都提供了一个 ExampleTest.php
文件。在安装新的 Laravel 应用程序后,执行 vendor/bin/pest
、vendor/bin/phpunit
或 php artisan test
命令来运行您的测试。
环境
在运行测试时,由于 phpunit.xml
文件中定义的环境变量,Laravel 将自动将配置环境设置为 testing
。Laravel 还会自动将会话和缓存配置为 array
驱动程序,以便在测试时不会持久保存会话或缓存数据。
您可以根据需要自由定义其他测试环境配置值。可以在应用程序的 phpunit.xml
文件中配置 testing
环境变量,但在运行测试之前,请确保使用 config:clear
Artisan 命令清除您的配置缓存!
.env.testing
环境文件
此外,您可以在项目的根目录中创建一个 .env.testing
文件。在运行 Pest 和 PHPUnit 测试或使用 --env=testing
选项执行 Artisan 命令时,将使用此文件而不是 .env
文件。
创建测试
要创建一个新的测试用例,可以使用 make:test
Artisan 命令。默认情况下,测试将被放置在 tests/Feature
目录中:
php artisan make:test UserTest
如果您想在 tests/Unit
目录中创建测试,可以在执行 make:test
命令时使用 --unit
选项:
php artisan make:test UserTest --unit
[!NOTE]
测试存根可以使用 存根发布 进行自定义。
一旦生成了测试,您可以像通常使用 Pest 或 PHPUnit 那样定义测试。要运行您的测试,可以从终端执行 vendor/bin/pest
、vendor/bin/phpunit
或 php artisan test
命令:
<?php
test('basic', function () {
expect(true)->toBeTrue();
});
<?php
namespace Tests\Unit;
use PHPUnit\Framework\TestCase;
class ExampleTest extends TestCase
{
/**
* 一个基础测试示例。
*/
public function test_basic_test(): void
{
$this->assertTrue(true);
}
}
[!WARNING]
如果您在测试类中定义了自己的setUp
/tearDown
方法,请确保在父类上调用相应的parent::setUp()
/parent::tearDown()
方法。通常,您应该在自己的setUp
方法的开头调用parent::setUp()
,并在tearDown
方法的结尾调用parent::tearDown()
。
运行测试
如前所述,一旦您编写了测试,就可以使用 pest
或 phpunit
来运行它们:
./vendor/bin/pest
./vendor/bin/phpunit
除了 pest
或 phpunit
命令外,您还可以使用 test
Artisan 命令来运行您的测试。Artisan 测试运行器提供详细的测试报告,以方便开发和调试:
php artisan test
可以传递给 pest
或 phpunit
命令的任何参数也可以传递给 Artisan test
命令:
php artisan test --testsuite=Feature --stop-on-failure
并行运行测试
默认情况下,Laravel 和 Pest / PHPUnit 在单个进程中按顺序执行您的测试。但是,您可以通过在多个进程中同时运行测试来大大减少运行测试所需的时间。首先,您应该将 brianium/paratest
Composer 包作为 "dev" 依赖项进行安装。然后,在执行 test
Artisan 命令时包含 --parallel
选项:
composer require brianium/paratest --dev
php artisan test --parallel
默认情况下,Laravel 会根据您机器上可用的 CPU 核心数量创建尽可能多的进程。但是,您可以使用 --processes
选项调整进程数量:
php artisan test --parallel --processes=4
[!WARNING]
在并行运行测试时,某些 Pest / PHPUnit 选项(例如--do-not-cache-result
)可能不可用。
并行测试与数据库
只要您配置了主数据库连接,Laravel 会自动为每个运行测试的并行进程处理创建和迁移测试数据库。测试数据库将以一个进程令牌作为后缀,每个进程的令牌都是唯一的。例如,如果您有两个并行测试进程,Laravel 将创建并使用 your_db_test_1
和 your_db_test_2
测试数据库。
默认情况下,测试数据库在对 test
Artisan 命令的调用之间会持久存在,以便后续的 test
调用可以再次使用它们。但是,您可以使用 --recreate-databases
选项重新创建它们:
php artisan test --parallel --recreate-databases
并行测试钩子
有时,您可能需要准备应用程序测试所使用的某些资源,以便多个测试进程可以安全地使用它们。
使用 ParallelTesting
外观,您可以指定在进程或测试用例的 setUp
和 tearDown
上执行的代码。给定的闭包会分别接收包含进程令牌的 $token
和包含当前测试用例的 $testCase
变量:
<?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) {
//...
});
// 在创建测试数据库时执行...
ParallelTesting::setUpTestDatabase(function (string $database, int $token) {
Artisan::call('db:seed');
});
ParallelTesting::tearDownTestCase(function (int $token, TestCase $testCase) {
//...
});
ParallelTesting::tearDownProcess(function (int $token) {
//...
});
}
}
访问并行测试令牌
如果您想从应用程序测试代码的任何其他位置访问当前并行进程的“令牌”,您可以使用 token
方法。此令牌是单个测试进程的唯一字符串标识符,可用于在并行测试进程之间分割资源。例如,Laravel 会自动将此令牌附加到每个并行测试进程创建的测试数据库的末尾:
$token = ParallelTesting::token();
报告测试覆盖率
[!警告]
此功能需要 Xdebug (opens in a new tab) 或 PCOV (opens in a new tab)。
在运行应用程序测试时,您可能想要确定您的测试用例是否实际覆盖了应用程序代码,以及在运行测试时使用了多少应用程序代码。要实现此目的,您可以在调用 test
命令时提供 --coverage
选项:
php artisan test --coverage
强制设置最低覆盖率阈值
您可以使用 --min
选项为您的应用程序定义最低测试覆盖率阈值。如果未达到此阈值,测试套件将失败:
php artisan test --coverage --min=80.3
分析测试
Artisan 测试运行器还包括一个方便的机制,用于列出应用程序中最慢的测试。使用 --profile
选项调用 test
命令,您将获得十个最慢测试的列表,从而可以轻松地调查哪些测试可以进行改进以加快测试套件的速度:
php artisan test --profile