mcpField
P
pest-testing

pest-testing

github.com/bagistoテスト・品質13225 回インストール2 週間前に更新
リポジトリ

pest-testing について

Bagisto 開発者向けの Pest テスト用スキルガイドです。テストの構成、作成、実行、デバッグに加え、パッケージ別の設定、アサーション、モック、データセット、アーキテクチャテストを扱います。

主な機能

  1. 01Bagisto のテスト配置とスイートの説明
  2. 02単体・機能テストの実行コマンド
  3. 03新規パッケージのテスト登録手順
  4. 04アサーション、モック、データセットの解説
  5. 05アーキテクチャテストとテスト実践の紹介

活用シーン

  1. 01Bagisto パッケージに Pest テストを追加
  2. 02スイート、ファイル、条件指定でテスト実行
  3. 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/Featurephp artisan test --testsuite="Admin Feature Test"
Core ユニットテストpackages/Webkul/Core/tests/Unitphp artisan test --testsuite="Core Unit Test"
Customer ユニットテストpackages/Webkul/Customer/tests/Unitphp artisan test --testsuite="Customer Unit Test"
DataGrid ユニットテストpackages/Webkul/DataGrid/tests/Unitphp artisan test --testsuite="DataGrid Unit Test"
EUWithdrawal フィーチャーテストpackages/Webkul/EUWithdrawal/tests/Featurephp artisan test --testsuite="EUWithdrawal Feature Test"
Installer フィーチャーテストpackages/Webkul/Installer/tests/Featurephp artisan test --testsuite="Installer Feature Test"
PayU ユニットテストpackages/Webkul/PayU/tests/Unitphp artisan test --testsuite="PayU Unit Test"
PayU フィーチャーテストpackages/Webkul/PayU/tests/Featurephp artisan test --testsuite="PayU Feature Test"
Razorpay ユニットテストpackages/Webkul/Razorpay/tests/Unitphp artisan test --testsuite="Razorpay Unit Test"
Razorpay フィーチャーテストpackages/Webkul/Razorpay/tests/Featurephp artisan test --testsuite="Razorpay Feature Test"
Shop フィーチャーテストpackages/Webkul/Shop/tests/Featurephp artisan test --testsuite="Shop Feature Test"
Stripe ユニットテストpackages/Webkul/Stripe/tests/Unitphp artisan test --testsuite="Stripe Unit Test"
Stripe フィーチャーテストpackages/Webkul/Stripe/tests/Featurephp 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();

新しいパッケージへのテストの追加

新しいパッケージにテストを追加する場合は、次の作業が必要です。

  1. Pest.php に登録: テストケースのバインディングを追加します。
uses(Webkul\NewPackage\Tests\NewPackageTestCase::class)->in('../packages/Webkul/NewPackage/tests');
  1. composer.json(autoload-dev)に登録:
"autoload-dev": {
    "psr-4": {
        "Webkul\\NewPackage\\Tests\\": "packages/Webkul/NewPackage/tests"
    }
}
  1. phpunit.xml に登録: 新しいテストスイートを追加します。
<testsuite name="New Package Test">
    <directory suffix="Test.php">packages/Webkul/NewPackage/tests</directory>
</testsuite>
  1. 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() を使用します。
  • テストの対象を絞り、互いに独立させます。

コメント