测试:入门
介绍
Laravel 在构建时就充分考虑了测试的需求。事实上,它内置了对Pest和PHPUnitphpunit.xml
测试的支持,并且已经为您的应用程序设置了相应的测试文件。该框架还提供了便捷的辅助方法,让您能够以更直观的方式测试您的应用程序。
默认情况下,应用程序tests
目录包含两个目录:Feature
和Unit
。单元测试专注于代码中一小段独立的代码。事实上,大多数单元测试可能只关注一个方法。“Unit”测试目录中的测试不会启动 Laravel 应用程序,因此无法访问应用程序的数据库或其他框架服务。
功能测试可能会测试代码的大部分内容,包括多个对象之间的交互方式,甚至测试对 JSON 端点的完整 HTTP 请求。通常,大多数测试都应该是功能测试。这些类型的测试可以最大程度地确保整个系统按预期运行。
和test 目录ExampleTest.php
中都提供了一个文件。安装新的 Laravel 应用程序后,执行、或命令即可运行测试。Feature
Unit
vendor/bin/pest
vendor/bin/phpunit
php artisan test
环境
运行测试时,Laravel 会根据文件中定义的环境变量自动将配置环境设置为。Laravel 还会自动将会话和缓存配置到驱动程序中,这样测试期间就不会保留任何会话或缓存数据。testing
phpunit.xml
array
您可以根据需要自由定义其他测试环境配置值。testing
环境变量可以在应用程序文件中配置,但请确保在运行测试之前phpunit.xml
使用 Artisan 命令清除配置缓存!config:clear
环境.env.testing
文件
此外,您还可以.env.testing
在项目根目录中创建一个文件。.env
在运行 Pest 和 PHPUnit 测试或使用该选项执行 Artisan 命令时,将使用此文件代替该文件--env=testing
。
创建测试
要创建新的测试用例,请使用make:test
Artisan 命令。默认情况下,测试将放置在以下tests/Feature
目录中:
1php artisan make:test UserTest
如果您想在目录中创建测试,您可以在执行命令时tests/Unit
使用该选项:--unit
make:test
1php artisan make:test UserTest --unit
可以使用存根发布来定制测试存根。
测试生成后,您可以像使用 Pest 或 PHPUnit 一样定义测试。要运行测试,请在终端中执行vendor/bin/pest
、vendor/bin/phpunit
或命令:php artisan test
1<?php2 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(): void13 {14 $this->assertTrue(true);15 }16}
如果你在测试类中定义了自己的setUp
方法,请务必在父类中tearDown
调用相应的parent::setUp()
方法。通常,你应该在自己的方法的开头和结尾调用它们。parent::tearDown()
parent::setUp()
setUp
parent::tearDown()
tearDown
运行测试
如前所述,一旦编写了测试,就可以使用pest
或运行它们phpunit
:
1./vendor/bin/pest
1./vendor/bin/phpunit
除了pest
或phpunit
命令之外,您还可以使用test
Artisan 命令来运行测试。Artisan 测试运行器提供详细的测试报告,以简化开发和调试:
1php artisan test
任何可以传递给pest
或phpunit
命令的参数也可以传递给 Artisantest
命令:
1php artisan test --testsuite=Feature --stop-on-failure
并行运行测试
默认情况下,Laravel 和 Pest / PHPUnit 会在单个进程中顺序执行测试。但是,您可以通过在多个进程中同时运行测试来大大减少运行测试所需的时间。首先,您应该将brianium/paratest
Composer 软件包安装为“dev”依赖项。然后,--parallel
在执行test
Artisan 命令时包含以下选项:
1composer require brianium/paratest --dev2 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令牌和当前测试用例的“与”变量:setUp
tearDown
$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 ServiceProvider11{12 /**13 * Bootstrap any application services.14 */15 public function boot(): void16 {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();
报告测试覆盖率
在运行应用程序测试时,您可能需要确定测试用例是否实际覆盖了应用程序代码,以及运行测试时使用了多少应用程序代码。为此,您可以--coverage
在调用以下test
命令时提供以下选项:
1php artisan test --coverage
执行最低覆盖阈值
您可以使用此--min
选项为您的应用程序定义最低测试覆盖率阈值。如果不满足此阈值,测试套件将失败:
1php artisan test --coverage --min=80.3
分析测试
Artisan 测试运行器还包含一个便捷的机制,用于列出应用程序中运行速度最慢的测试。test
使用选项调用该命令--profile
,即可显示十个最慢测试的列表,方便您轻松找出可以改进哪些测试以加快测试套件的速度:
1php artisan test --profile