快速入门
测试: 开始
介绍
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 还会在测试时自动将会话和缓存配置到 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
使用 make:test Artisan 命令来创建一个新的测试用例。默认情况下,测试将放置在 tests/Feature 目录:
php artisan make:test UserTest --unit
技巧
可以使用 stub 定制 来自定义测试。
一旦测试生成,你可以使用 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);
}
}
注意
如果你在测试类中定义了自己的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
并行运行测试
默认情况下,Lavavel 和 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
注意:当并行运行测试时,某些 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 facade,可以指定代码在进程或者测试用例的 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
{
/**
* 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 ,则可以使用 token 方法。此令牌是单个测试进程的唯一字符串标识符,可用于在并行测试过程中划分资源。例如,Laravel 自动用此令牌值作为每个并行测试进程创建的测试数据库名后缀:
$token = ParallelTesting::token();
报告测试覆盖率
在运行测试时,你可能需要确定测试用例是否真的测到了某些程序代码,以及在运行测试时究竟使用了多少应用程序代码。要实现这一点,你可以在调用 test 命令时,增加一个 --coverage 选项:
php artisan test --coverage
最小覆盖率阈值限制
你可以使用 --min 选项来为你的应用程序定义一个最小测试覆盖率阈值。如果不满足此阈值,测试套件将失败:
php artisan test --coverage --min=80.3
测试性能分析
Artisan 测试运行器还提供了一个方便的机制用于列出你的应用程序中最慢的测试。使用 --profile 选项调用测试命令,可以看到 10 个最慢的测试列表,这可以让你很容易地识别哪些测试可以被改进,以加快你的测试套件。
php artisan test --profile
本译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。
Laravel 11 中文文档
关于 LearnKu
推荐文章: