pest-testing について
Bagisto 開発者向けの Pest テスト用スキルガイドです。テストの構成、作成、実行、デバッグに加え、パッケージ別の設定、アサーション、モック、データセット、アーキテクチャテストを扱います。
主な機能
- 01Bagisto のテスト配置とスイートの説明
- 02単体・機能テストの実行コマンド
- 03新規パッケージのテスト登録手順
- 04アサーション、モック、データセットの解説
- 05アーキテクチャテストとテスト実践の紹介
活用シーン
- 01Bagisto パッケージに Pest テストを追加
- 02スイート、ファイル、条件指定でテスト実行
- 03テスト設定や失敗の原因を調査
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ bagisto/ agent-skills --skill pest-testingインストール後、Claude Code で/pest-testingを入力して読み込まれたか確認します。
詳細
Bagisto の Pest テスト
適用するタイミング
以下の場合にこのスキルを有効にします。
- 新しいテストを作成するとき(ユニットテストまたはフィーチャーテスト)
- 既存のテストを変更するとき
- テストの失敗をデバッグするとき
- データセット、モック、またはテストの整理に取り組むとき
- アーキテクチャテストを作成するとき
- Bagisto のパッケージ(Admin、Shop、Core など)をテストするとき
Bagisto のテスト構成
テストの配置場所
Bagisto のテストは、packages/Webkul/{Package}/tests/ 内のパッケージごとに整理されています。
packages/Webkul/
├── Admin/
│ └── tests/
│ ├── AdminTestCase.php # Base test case
│ ├── Concerns/
│ │ └── AdminTestBench.php # Test helpers
│ └── Feature/
│ ├── ExampleTest.php
│ └── ...
├── Shop/
│ └── tests/
│ ├── ShopTestCase.php
│ ├── Concerns/
│ │ └── ShopTestBench.php
│ └── Feature/
│ ├── Checkout/
│ │ └── CheckoutTest.php
│ └── ...
├── Core/
│ └── tests/
│ ├── CoreTestCase.php
│ ├── Concerns/
│ │ └── CoreAssertions.php
│ ├── Unit/
│ └── Feature/
├── DataGrid/
│ └── tests/
│ ├── DataGridTestCase.php
│ └── Unit/
└── Installer/
└── tests/
├── InstallerTestCase.php
└── Feature/
利用可能なテストスイート
Bagisto では、phpunit.xml に次のテストスイートが設定されています。
| テストスイート | 場所 | コマンド |
|---|---|---|
| Admin フィーチャーテスト | packages/Webkul/Admin/tests/Feature | php artisan test --testsuite="Admin Feature Test" |
| Core ユニットテスト | packages/Webkul/Core/tests/Unit | php artisan test --testsuite="Core Unit Test" |
| Customer ユニットテスト | packages/Webkul/Customer/tests/Unit | php artisan test --testsuite="Customer Unit Test" |
| DataGrid ユニットテスト | packages/Webkul/DataGrid/tests/Unit | php artisan test --testsuite="DataGrid Unit Test" |
| EUWithdrawal フィーチャーテスト | packages/Webkul/EUWithdrawal/tests/Feature | php artisan test --testsuite="EUWithdrawal Feature Test" |
| Installer フィーチャーテスト | packages/Webkul/Installer/tests/Feature | php artisan test --testsuite="Installer Feature Test" |
| PayU ユニットテスト | packages/Webkul/PayU/tests/Unit | php artisan test --testsuite="PayU Unit Test" |
| PayU フィーチャーテスト | packages/Webkul/PayU/tests/Feature | php artisan test --testsuite="PayU Feature Test" |
| Razorpay ユニットテスト | packages/Webkul/Razorpay/tests/Unit | php artisan test --testsuite="Razorpay Unit Test" |
| Razorpay フィーチャーテスト | packages/Webkul/Razorpay/tests/Feature | php artisan test --testsuite="Razorpay Feature Test" |
| Shop フィーチャーテスト | packages/Webkul/Shop/tests/Feature | php artisan test --testsuite="Shop Feature Test" |
| Stripe ユニットテスト | packages/Webkul/Stripe/tests/Unit | php artisan test --testsuite="Stripe Unit Test" |
| Stripe フィーチャーテスト | packages/Webkul/Stripe/tests/Feature | php artisan test --testsuite="Stripe Feature Test" |
Pest.php の設定
Bagisto では、tests/Pest.php を使用して各パッケージのテストケースを登録します。
<?php
uses(Webkul\Admin\Tests\AdminTestCase::class)->in('../packages/Webkul/Admin/tests');
uses(Webkul\Core\Tests\CoreTestCase::class)->in('../packages/Webkul/Core/tests');
uses(Webkul\Customer\Tests\CustomerTestCase::class)->in('../packages/Webkul/Customer/tests');
uses(Webkul\DataGrid\Tests\DataGridTestCase::class)->in('../packages/Webkul/DataGrid/tests');
uses(Webkul\EUWithdrawal\Tests\EUWithdrawalTestCase::class)->in('../packages/Webkul/EUWithdrawal/tests');
uses(Webkul\Installer\Tests\InstallerTestCase::class)->in('../packages/Webkul/Installer/tests');
uses(Webkul\Payment\Tests\PaymentTestCase::class)->in('../packages/Webkul/Payment/tests');
uses(Webkul\PayU\Tests\PayUTestCase::class)->in('../packages/Webkul/PayU/tests');
uses(Webkul\Razorpay\Tests\RazorpayTestCase::class)->in('../packages/Webkul/Razorpay/tests');
uses(Webkul\Shop\Tests\ShopTestCase::class)->in('../packages/Webkul/Shop/tests');
uses(Webkul\Stripe\Tests\StripeTestCase::class)->in('../packages/Webkul/Stripe/tests');
テストケースの構成
各パッケージには、Tests\TestCase を継承する独自のテストケースがあります。
// packages/Webkul/Shop/tests/ShopTestCase.php
<?php
namespace Webkul\Shop\Tests;
use Tests\TestCase;
use Webkul\Core\Tests\Concerns\CoreAssertions;
use Webkul\Shop\Tests\Concerns\ShopTestBench;
class ShopTestCase extends TestCase
{
use CoreAssertions, ShopTestBench;
}
Composer.json のオートロード設定
本番用オートロード
パッケージの名前空間は、ルートの composer.json に登録されています。
"autoload": {
"psr-4": {
"Webkul\\Admin\\": "packages/Webkul/Admin/src",
"Webkul\\Shop\\": "packages/Webkul/Shop/src",
"Webkul\\Core\\": "packages/Webkul/Core/src",
...
}
}
開発用オートロード
テストの名前空間は autoload-dev に登録されています。
"autoload-dev": {
"psr-4": {
"Tests\\": "tests/",
"Webkul\\Admin\\Tests\\": "packages/Webkul/Admin/tests",
"Webkul\\Core\\Tests\\": "packages/Webkul/Core/tests",
"Webkul\\DataGrid\\Tests\\": "packages/Webkul/DataGrid/tests",
"Webkul\\Installer\\Tests\\": "packages/Webkul/Installer/tests",
"Webkul\\Shop\\Tests\\": "packages/Webkul/Shop/tests"
}
}
テストの実行
すべてのテストを実行
php artisan test --compact
特定のテストスイートを実行
php artisan test --testsuite="Shop Feature Test"
php artisan test --testsuite="Admin Feature Test"
php artisan test --testsuite="Core Unit Test"
特定のテストファイルを実行
php artisan test --compact packages/Webkul/Shop/tests/Feature/Checkout/CheckoutTest.php
フィルターを指定してテストを実行
php artisan test --compact --filter=testName
特定のパッケージのテストを実行
# Shop tests
php artisan test --compact packages/Webkul/Shop/tests/
# Admin tests
php artisan test --compact packages/Webkul/Admin/tests/
# Core tests
php artisan test --compact packages/Webkul/Core/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();
});
it('should return successful response', function () {
$response = $this->getJson('/api/categories');
$response->assertStatus(200);
});
アサーション
assertStatus() の代わりに、専用のアサーション(assertSuccessful()、assertNotFound())を使用します。
| 使用するもの | 代わりに使用するもの |
|---|---|
assertSuccessful() | assertStatus(200) |
assertNotFound() | assertStatus(404) |
assertForbidden() | assertStatus(403) |
モック
使用する前にモック関数をインポートします。
use function Pest\Laravel\mock;
データセット
繰り返し行うテストにはデータセットを使用します。
it('has valid emails', function (string $email) {
expect($email)->not->toBeEmpty();
})->with([
'james' => '[email protected]',
'john' => '[email protected]',
]);
アーキテクチャテスト
Pest 3 には、コード規約を適用するためのアーキテクチャテストが含まれています。
arch('controllers')
->expect('Webkul\Admin\Http\Controllers')
->toExtendNothing()
->toHaveSuffix('Controller');
arch('models')
->expect('Webkul\Core\Models')
->toExtend('Illuminate\Database\Eloquent\Model');
arch('no debugging')
->expect(['dd', 'dump', 'ray'])
->not->toBeUsed();
新しいパッケージへのテストの追加
新しいパッケージにテストを追加する場合は、次の作業が必要です。
- Pest.php に登録: テストケースのバインディングを追加します。
uses(Webkul\NewPackage\Tests\NewPackageTestCase::class)->in('../packages/Webkul/NewPackage/tests');
- composer.json(autoload-dev)に登録:
"autoload-dev": {
"psr-4": {
"Webkul\\NewPackage\\Tests\\": "packages/Webkul/NewPackage/tests"
}
}
- phpunit.xml に登録: 新しいテストスイートを追加します。
<testsuite name="New Package Test">
<directory suffix="Test.php">packages/Webkul/NewPackage/tests</directory>
</testsuite>
- composer dump-autoload を実行:
composer dump-autoload
よくある落とし穴
mockを使用する前にuse function Pest\Laravel\mock;をインポートし忘れるassertSuccessful()ではなくassertStatus(200)を使用する- テスト名前空間を追加した後に
composer dump-autoloadを実行し忘れる tests/Pest.phpにテストケースを登録し忘れる- パッケージ固有のテストを行うために
phpunit.xmlにテストスイートを追加し忘れる - 承認を得ずにテストを削除する
- composer.json の autoload-dev にテスト名前空間を登録し忘れる
テストのベストプラクティス
- 正常系、異常系、エッジケースをテストします。
- テストでモデルを作成する際はファクトリーを使用します。
- パッケージ内の既存のテストパターンに従います。
- テストデータの生成には
$this->fakerまたはfake()を使用します。 - テストの対象を絞り、互いに独立させます。
コメント
Markdown 対応