跳到内容

测试:入门

简介

Laravel 在设计时就考虑到了测试。事实上,对使用 PestPHPUnit 进行测试的支持是开箱即用的,并且已经为您的应用程序设置了一个 phpunit.xml 文件。该框架还提供了方便的辅助方法,使您能够富有表现力地测试您的应用程序。

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

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

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

环境

运行测试时,Laravel 会自动将 配置环境 设置为 testing,这是因为 phpunit.xml 文件中定义了环境变量。 Laravel 还会自动将会话和缓存配置为 array 驱动程序,以便在测试时不会持久化会话或缓存数据。

您可以根据需要自由定义其他测试环境配置值。 testing 环境变量可以在您的应用程序的 phpunit.xml 文件中配置,但请确保在使用 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
lightbulb

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

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

<?php
 
test('basic', function () {
expect(true)->toBeTrue();
});
<?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);
}
}
exclamation

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

运行测试

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

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

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

php artisan test

可以传递给 pestphpunit 命令的任何参数也可以传递给 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
exclamation

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

并行测试和数据库

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

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

php artisan test --parallel --recreate-databases

并行测试钩子

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

使用 ParallelTesting facade,你可以指定在进程或测试用例的 setUptearDown 阶段执行的代码。给定的闭包会接收 $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
{
/**
* Bootstrap any application services.
*/
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) {
// ...
});
}
}

访问并行测试令牌

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

$token = ParallelTesting::token();

报告测试覆盖率

exclamation

此功能需要 XdebugPCOV

运行应用程序测试时,你可能想确定测试用例是否实际覆盖了应用程序代码,以及运行测试时使用了多少应用程序代码。为了实现这一点,你可以在调用 test 命令时提供 --coverage 选项。

php artisan test --coverage

强制执行最低覆盖率阈值

你可以使用 --min 选项为你的应用程序定义最低测试覆盖率阈值。如果未达到此阈值,测试套件将失败。

php artisan test --coverage --min=80.3

分析测试

Artisan 测试运行器还包括一个方便的机制来列出应用程序中最慢的测试。使用 --profile 选项调用 test 命令,将显示你最慢的十个测试的列表,让你能够轻松地调查哪些测试可以改进以加快测试套件的速度。

php artisan test --profile