pest-testing
Original:🇺🇸 English
Not Translated
Tests applications using the Pest 3 PHP framework in Bagisto. Activates when writing tests, creating unit or feature tests, adding assertions, testing Livewire components, architecture testing, debugging test failures, working with datasets or mocking; or when the user mentions test, spec, TDD, expects, assertion, coverage, or needs to verify functionality works.
2installs
Sourcebagisto/agent-skills
Added on
NPX Install
npx skill4agent add bagisto/agent-skills pest-testingSKILL.md Content
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 | | |
| Core Unit Test | | |
| DataGrid Unit Test | | |
| Installer Feature Test | | |
| Shop Feature Test | | |
Pest.php Configuration
Bagisto uses to register test cases for each package:
tests/Pest.phpphp
<?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\TestCasephp
// 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.jsonjson
"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-devjson
"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
bash
php artisan test --compactRun Specific Test Suite
bash
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
bash
php artisan test --compact packages/Webkul/Shop/tests/Feature/Checkout/CheckoutTest.phpRun Test with Filter
bash
php artisan test --compact --filter=testNameRun Tests for Specific Package
bash
# 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
bash
php artisan make:test --pest packages/Webkul/Shop/tests/Feature/Checkout/MyNewTestCreate Unit Test
bash
php artisan make:test --pest --unit packages/Webkul/Core/tests/Unit/MyNewTestBasic Test Structure
php
<?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 (, ) instead of :
assertSuccessful()assertNotFound()assertStatus()| Use | Instead of |
|---|---|
| |
| |
| |
Mocking
Import mock function before use:
php
use function Pest\Laravel\mock;Datasets
Use datasets for repetitive tests:
php
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:
php
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:
php
uses(Webkul\NewPackage\Tests\NewPackageTestCase::class)->in('../packages/Webkul/NewPackage/tests');- Register in composer.json (autoload-dev):
json
"autoload-dev": {
"psr-4": {
"Webkul\\NewPackage\\Tests\\": "packages/Webkul/NewPackage/tests"
}
}- Register in phpunit.xml: Add a new testsuite:
xml
<testsuite name="New Package Test">
<directory suffix="Test.php">packages/Webkul/NewPackage/tests</directory>
</testsuite>- Run composer dump-autoload:
bash
composer dump-autoloadCommon Pitfalls
- Not importing before using mock
use function Pest\Laravel\mock; - Using instead of
assertStatus(200)assertSuccessful() - Forgetting to run after adding test namespace
composer dump-autoload - Not registering test case in
tests/Pest.php - Not adding testsuite to for package-specific testing
phpunit.xml - 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 or
$this->fakerfor generating test data.fake() - Keep tests focused and independent.