测试:入门
简介
Laravel 在构建时就考虑到了测试。实际上,对 Pest 和 PHPUnit 的测试支持是开箱即用的,并且已经为您的应用程序设置了 phpunit.xml
文件。该框架还附带了方便的辅助方法,使您可以富有表现力地测试您的应用程序。
默认情况下,您的应用程序的 tests
目录包含两个目录:Feature
和 Unit
。单元测试是专注于代码中非常小的、隔离部分的测试。实际上,大多数单元测试可能专注于单个方法。 “Unit” 测试目录中的测试不会启动您的 Laravel 应用程序,因此无法访问您的应用程序的数据库或其他框架服务。
功能测试可以测试您代码的更大部分,包括多个对象如何相互交互,甚至是对 JSON 端点的完整 HTTP 请求。 通常,您的大多数测试应该是功能测试。这些类型的测试提供了最大的信心,即您的整个系统都在按预期运行。
在 Feature
和 Unit
测试目录中都提供了一个 ExampleTest.php
文件。安装新的 Laravel 应用程序后,执行 vendor/bin/pest
、vendor/bin/phpunit
或 php artisan test
命令来运行您的测试。
环境
运行测试时,由于 phpunit.xml
文件中定义的环境变量,Laravel 会自动将 配置环境 设置为 testing
。 Laravel 还会自动将 session 和 cache 配置为 array
驱动,以便在测试时不会持久化任何 session 或 cache 数据。
您可以根据需要自由定义其他测试环境配置值。 testing
环境变量可以在您的应用程序的 phpunit.xml
文件中配置,但请务必在使用 config:clear
Artisan 命令运行测试之前清除您的配置缓存!
.env.testing
环境变量文件
此外,您可以在项目的根目录中创建一个 .env.testing
文件。当运行 Pest 和 PHPUnit 测试或使用 --env=testing
选项执行 Artisan 命令时,将使用此文件代替 .env
文件。
创建测试
要创建新的测试用例,请使用 make:test
Artisan 命令。默认情况下,测试将放置在 tests/Feature
目录中
1php artisan make:test UserTest
如果您想在 tests/Unit
目录中创建测试,您可以在执行 make:test
命令时使用 --unit
选项
1php artisan make:test UserTest --unit
可以使用 stub 发布 来自定义测试存根。
生成测试后,您可以像往常一样使用 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()
方法。 通常,您应该在您自己的 setUp
方法的开始处调用 parent::setUp()
,并在 tearDown
方法的结尾处调用 parent::tearDown()
。
运行测试
如前所述,一旦您编写了测试,您可以使用 pest
或 phpunit
运行它们
1./vendor/bin/pest
1./vendor/bin/phpunit
除了 pest
或 phpunit
命令之外,您还可以使用 test
Artisan 命令来运行您的测试。 Artisan 测试运行器提供详细的测试报告,以方便开发和调试
1php artisan test
可以传递给 pest
或 phpunit
命令的任何参数也可以传递给 Artisan test
命令
1php artisan test --testsuite=Feature --stop-on-failure
并行运行测试
默认情况下,Laravel 和 Pest / PHPUnit 在单个进程中按顺序执行您的测试。但是,您可以通过跨多个进程同时运行测试来大大减少运行测试所需的时间。 要开始使用,您应该安装 brianium/paratest
Composer 软件包作为“dev”依赖项。 然后,在执行 test
Artisan 命令时包含 --parallel
选项
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
测试数据库。
默认情况下,测试数据库在调用 test
Artisan 命令之间持久存在,以便它们可以被后续的 test
调用再次使用。 但是,您可以使用 --recreate-databases
选项重新创建它们
1php artisan test --parallel --recreate-databases
并行测试钩子
有时,您可能需要准备应用程序测试使用的某些资源,以便它们可以被多个测试进程安全地使用。
使用 ParallelTesting
facade,您可以指定要在进程或测试用例的 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();
报告测试覆盖率
运行应用程序测试时,您可能想确定您的测试用例是否实际覆盖了应用程序代码,以及运行测试时使用了多少应用程序代码。 为了实现这一点,您可以在调用 test
命令时提供 --coverage
选项
1php artisan test --coverage
强制执行最低覆盖率阈值
您可以使用 --min
选项为您的应用程序定义最低测试覆盖率阈值。 如果未达到此阈值,测试套件将失败
1php artisan test --coverage --min=80.3
分析测试
Artisan 测试运行器还包括一个方便的机制来列出您应用程序中最慢的测试。 使用 --profile
选项调用 test
命令,以显示您最慢的十个测试的列表,从而使您可以轻松地调查哪些测试可以改进以加快您的测试套件
1php artisan test --profile