pest-testing
9
总安装量
8
周安装量
#31748
全站排名
安装命令
npx skills add https://github.com/bagisto/agent-skills --skill pest-testing
Agent 安装分布
opencode
8
gemini-cli
6
github-copilot
6
codex
6
kimi-cli
6
cursor
6
Skill 文档
Pest Testing in Bagisto
When to Apply
Activate this skill when:
- Creating new tests (unit or feature)
- Modifying existing tests
- Debugging test failures
- Working with datasets, mocking, or test organization
- Writing architecture tests
- Testing Bagisto packages (Admin, Shop, Core, etc.)
Bagisto Testing Structure
Test Locations
Bagisto tests are organized within packages in 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/
Available Test Suites
Bagisto has the following test suites configured in phpunit.xml:
| Test Suite | Location | Command |
|---|---|---|
| Admin Feature Test | packages/Webkul/Admin/tests/Feature |
php artisan test --testsuite="Admin Feature Test" |
| Core Unit Test | packages/Webkul/Core/tests/Unit |
php artisan test --testsuite="Core Unit Test" |
| DataGrid Unit Test | packages/Webkul/DataGrid/tests/Unit |
php artisan test --testsuite="DataGrid Unit Test" |
| Installer Feature Test | packages/Webkul/Installer/tests/Feature |
php artisan test --testsuite="Installer Feature Test" |
| Shop Feature Test | packages/Webkul/Shop/tests/Feature |
php artisan test --testsuite="Shop Feature Test" |
Pest.php Configuration
Bagisto uses tests/Pest.php to register test cases for each package:
<?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\DataGrid\Tests\DataGridTestCase::class)->in('../packages/Webkul/DataGrid/tests');
uses(Webkul\Installer\Tests\InstallerTestCase::class)->in('../packages/Webkul/Installer/tests');
uses(Webkul\Shop\Tests\ShopTestCase::class)->in('../packages/Webkul/Shop/tests');
Test Case Structure
Each package has its own test case that extends 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 Autoload Configuration
Production Autoload
Package namespaces are registered in root composer.json:
"autoload": {
"psr-4": {
"Webkul\\Admin\\": "packages/Webkul/Admin/src",
"Webkul\\Shop\\": "packages/Webkul/Shop/src",
"Webkul\\Core\\": "packages/Webkul/Core/src",
...
}
}
Development Autoload
Test namespaces are registered in 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"
}
}
Running Tests
Run All Tests
php artisan test --compact
Run Specific Test Suite
php artisan test --testsuite="Shop Feature Test"
php artisan test --testsuite="Admin Feature Test"
php artisan test --testsuite="Core Unit Test"
Run Specific Test File
php artisan test --compact packages/Webkul/Shop/tests/Feature/Checkout/CheckoutTest.php
Run Test with Filter
php artisan test --compact --filter=testName
Run Tests for Specific Package
# 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/
Creating New Tests
Create Feature Test
php artisan make:test --pest packages/Webkul/Shop/tests/Feature/Checkout/MyNewTest
Create Unit Test
php artisan make:test --pest --unit packages/Webkul/Core/tests/Unit/MyNewTest
Basic Test Structure
<?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);
});
Assertions
Use specific assertions (assertSuccessful(), assertNotFound()) instead of assertStatus():
| Use | Instead of |
|---|---|
assertSuccessful() |
assertStatus(200) |
assertNotFound() |
assertStatus(404) |
assertForbidden() |
assertStatus(403) |
Mocking
Import mock function before use:
use function Pest\Laravel\mock;
Datasets
Use datasets for repetitive tests:
it('has valid emails', function (string $email) {
expect($email)->not->toBeEmpty();
})->with([
'james' => 'james@bagisto.com',
'john' => 'john@bagisto.com',
]);
Architecture Testing
Pest 3 includes architecture testing to enforce code conventions:
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();
Adding Tests to a New Package
If you add tests to a new package, you need to:
- Register in Pest.php: Add the test case binding:
uses(Webkul\NewPackage\Tests\NewPackageTestCase::class)->in('../packages/Webkul/NewPackage/tests');
- Register in composer.json (autoload-dev):
"autoload-dev": {
"psr-4": {
"Webkul\\NewPackage\\Tests\\": "packages/Webkul/NewPackage/tests"
}
}
- Register in phpunit.xml: Add a new testsuite:
<testsuite name="New Package Test">
<directory suffix="Test.php">packages/Webkul/NewPackage/tests</directory>
</testsuite>
- Run composer dump-autoload:
composer dump-autoload
Common Pitfalls
- Not importing
use function Pest\Laravel\mock;before using mock - Using
assertStatus(200)instead ofassertSuccessful() - Forgetting to run
composer dump-autoloadafter adding test namespace - Not registering test case in
tests/Pest.php - Not adding testsuite to
phpunit.xmlfor package-specific testing - Deleting tests without approval
- Forgetting to register test namespace in composer.json autoload-dev
Testing Best Practices
- Test happy paths, failure paths, and edge cases.
- Use factories for model creation in tests.
- Follow existing test patterns in the package.
- Use
$this->fakerorfake()for generating test data. - Keep tests focused and independent.