SuperAPI AI 工具集

pest-testing

测试与质量

查看项目

更新于 10-15 14:47

技能介绍

用途

pest-testing 用于在 Bagisto 项目中使用 Pest 3 PHP 框架测试应用。当创建新测试(单元或功能)、修改现有测试、调试测试失败、处理数据集、Mock 或测试组织、编写架构测试,以及测试 Bagisto 各包(Admin、Shop、Core 等)时启用。

测试结构

Bagisto 的测试按包组织在 packages/Webkul/{Package}/tests/ 下。例如 Admin 包包含 AdminTestCase.php、Concerns/AdminTestBench.php 和 Feature/ 目录;Shop 包包含 ShopTestCase.php、Concerns/ShopTestBench.php 和 Feature/(如 Checkout/CheckoutTest.php);Core 包包含 CoreTestCase.php、Concerns/CoreAssertions.php、Unit/ 和 Feature/;DataGrid 包包含 DataGridTestCase.php 和 Unit/;Installer 包包含 InstallerTestCase.php 和 Feature/。

测试套件

Bagisto 在 phpunit.xml 中配置了多个测试套件,包括:Admin Feature Test、Core Unit Test、Customer Unit Test、DataGrid Unit Test、EUWithdrawal Feature Test、Installer Feature Test、PayU Unit Test、PayU Feature Test、Razorpay Unit Test、Razorpay Feature Test、Shop Feature Test、Stripe Unit Test、Stripe Feature Test。每个套件对应特定目录,可通过 php artisan test --testsuite="套件名" 运行。

Pest.php 配置

Bagisto 使用 tests/Pest.php 为每个包注册测试用例,通过 uses(...)->in(...) 将各包的 TestCase 绑定到对应测试目录,例如:

uses(Webkul\Admin\Tests\AdminTestCase::class)->in('../packages/Webkul/Admin/tests');
uses(Webkul\Core\Tests\CoreTestCase::class)->in('../packages/Webkul/Core/tests');

每个包的测试用例继承 Tests\TestCase,并组合相应的 Concerns,例如 ShopTestCase 使用 CoreAssertions 和 ShopTestBench。

自动加载配置

生产自动加载在根 composer.json 的 autoload.psr-4 中注册包命名空间(如 Webkul\Admin\、Webkul\Shop\、Webkul\Core\)。测试命名空间在 autoload-dev.psr-4 中注册,包括 Tests\、Webkul\Admin\Tests\、Webkul\Core\Tests\、Webkul\DataGrid\Tests\、Webkul\Installer\Tests\、Webkul\Shop\Tests\。

运行测试

  • 运行全部测试:php artisan test --compact
  • 运行指定套件:php artisan test --testsuite="Shop Feature Test"
  • 运行指定文件:php artisan test --compact packages/Webkul/Shop/tests/Feature/Checkout/CheckoutTest.php
  • 按名称过滤:php artisan test --compact --filter=testName
  • 按包运行:php artisan test --compact packages/Webkul/Shop/tests/

创建新测试

  • 创建功能测试:php artisan make:test --pest packages/Webkul/Shop/tests/Feature/Checkout/MyNewTest
  • 创建单元测试:php artisan make:test --pest --unit packages/Webkul/Core/tests/Unit/MyNewTest

基本结构示例:

<?php

namespace Webkul\Shop\Tests\Feature\Checkout;

use Webkul\Shop\Tests\ShopTestCase;

it('should pass basic test', function () {
    expect(true)->toBeTrue();
});

断言、Mock 与数据集

建议使用具体断言而非通用状态码断言:用 assertSuccessful() 代替 assertStatus(200),用 assertNotFound() 代替 assertStatus(404),用 assertForbidden() 代替 assertStatus(403)。使用 Mock 前需导入 use function Pest\Laravel\mock;。数据集可用于重复性测试,例如 ->with(['james' => 'james@bagisto.com', 'john' => 'john@bagisto.com'])。

架构测试

Pest 3 支持架构测试以强制代码约定,例如检查控制器后缀、模型继承关系,以及禁止使用 dd、dump、ray 等调试函数。

为新包添加测试

需要:在 tests/Pest.php 中注册测试用例绑定;在 composer.json 的 autoload-dev 中注册测试命名空间;在 phpunit.xml 中添加新的 testsuite;运行 composer dump-autoload。

常见注意事项

使用 mock 前未导入 use function Pest\Laravel\mock;;使用 assertStatus(200) 而非 assertSuccessful();添加测试命名空间后忘记运行 composer dump-autoload;未在 tests/Pest.php 中注册测试用例;未在 phpunit.xml 中为包添加 testsuite;未经批准删除测试;忘记在 composer.json 的 autoload-dev 中注册测试命名空间。

最佳实践

测试正常路径、失败路径和边界情况;使用工厂创建模型;遵循包内现有测试模式;使用 $this->faker 或 fake() 生成测试数据;保持测试聚焦且相互独立。