跳至内容

测试:入门

介绍

Laravel 在构建时就充分考虑了测试的需求。事实上,它内置了对PestPHPUnitphpunit.xml测试的支持,并且已经为您的应用程序设置了相应的测试文件。该框架还提供了便捷的辅助方法,让您能够以更直观的方式测试您的应用程序。

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

功能测试可能会测试代码的大部分内容,包括多个对象之间的交互方式,甚至测试对 JSON 端点的完整 HTTP 请求。通常,大多数测试都应该是功能测试。这些类型的测试可以最大程度地确保整个系统按预期运行。

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

环境

运行测试时,Laravel 会根据文件中定义的环境变量自动将配置环境设置为。Laravel 还会自动将会话和缓存配置到驱动程序中,这样测试期间就不会保留任何会话或缓存数据。testingphpunit.xmlarray

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

环境.env.testing文件

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

创建测试

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

1php artisan make:test UserTest

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

1php artisan make:test UserTest --unit

可以使用存根发布来定制测试存根。

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

1<?php
2 
3test('basic', function () {
4 expect(true)->toBeTrue();
5});
1<?php
2 
3namespace Tests\Unit;
4 
5use PHPUnit\Framework\TestCase;
6 
7class ExampleTest extends TestCase
8{
9 /**
10 * A basic test example.
11 */
12 public function test_basic_test(): void
13 {
14 $this->assertTrue(true);
15 }
16}

如果你在测试类中定义了自己的setUp方法,请务必在父类中tearDown调用相应的parent::setUp()方法。通常,你应该在自己的方法的开头结尾调用它们。parent::tearDown()parent::setUp()setUpparent::tearDown()tearDown

运行测试

如前所述,一旦编写了测试,就可以使用pest或运行它们phpunit

1./vendor/bin/pest
1./vendor/bin/phpunit

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

1php artisan test

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

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

并行运行测试

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

1composer require brianium/paratest --dev
2 
3php artisan test --parallel

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

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

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

并行测试和数据库

只要你配置了主数据库连接,Laravel 就会自动为运行测试的每个并行进程创建和迁移测试数据库。测试数据库将以进程令牌作为后缀,每个进程的令牌都是唯一的。例如,如果你有两个并行测试进程,Laravel 将创建并使用your_db_test_1测试your_db_test_2数据库。

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

1php artisan test --parallel --recreate-databases

并行测试钩子

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

使用外观,您可以指定要在Processes或测试用例的“与”处ParallelTesting执行的代码。给定的闭包分别接收包含Processes令牌和当前测试用例的“与”变量:setUptearDown$token$testCase

1<?php
2 
3namespace App\Providers;
4 
5use Illuminate\Support\Facades\Artisan;
6use Illuminate\Support\Facades\ParallelTesting;
7use Illuminate\Support\ServiceProvider;
8use PHPUnit\Framework\TestCase;
9 
10class AppServiceProvider extends ServiceProvider
11{
12 /**
13 * Bootstrap any application services.
14 */
15 public function boot(): void
16 {
17 ParallelTesting::setUpProcess(function (int $token) {
18 // ...
19 });
20 
21 ParallelTesting::setUpTestCase(function (int $token, TestCase $testCase) {
22 // ...
23 });
24 
25 // Executed when a test database is created...
26 ParallelTesting::setUpTestDatabase(function (string $database, int $token) {
27 Artisan::call('db:seed');
28 });
29 
30 ParallelTesting::tearDownTestCase(function (int $token, TestCase $testCase) {
31 // ...
32 });
33 
34 ParallelTesting::tearDownProcess(function (int $token) {
35 // ...
36 });
37 }
38}

访问并行测试令牌

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

1$token = ParallelTesting::token();

报告测试覆盖率

此功能需要XdebugPCOV

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

1php artisan test --coverage

执行最低覆盖阈值

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

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

分析测试

Artisan 测试运行器还包含一个便捷的机制,用于列出应用程序中运行速度最慢的测试。test使用选项调用该命令--profile,即可显示十个最慢测试的列表,方便您轻松找出可以改进哪些测试以加快测试套件的速度:

1php artisan test --profile