Pest Testing 3
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
Documentation
Use search-docs for detailed Pest 3 patterns and documentation.
Basic Usage
Creating Tests
All tests must be written using Pest. Use php artisan make:test --pest {name}.
Test Organization
- •Tests live in the
tests/Featureandtests/Unitdirectories. - •Do NOT remove tests without approval - these are core application code.
- •Test happy paths, failure paths, and edge cases.
Basic Test Structure
<code-snippet name="Basic Pest Test Example" lang="php">it('is true', function () { expect(true)->toBeTrue(); });
</code-snippet>Running Tests
- •Run minimal tests with filter before finalizing:
php artisan test --compact --filter=testName. - •Run all tests:
php artisan test --compact. - •Run file:
php artisan test --compact tests/Feature/ExampleTest.php.
Assertions
Use specific assertions (assertSuccessful(), assertNotFound()) instead of assertStatus():
it('returns all', function () { $this->postJson('/api/docs', [])->assertSuccessful(); });
</code-snippet>| 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 (validation rules, etc.):
<code-snippet name="Pest Dataset Example" lang="php">it('has emails', function (string $email) { expect($email)->not->toBeEmpty(); })->with([ 'james' => 'james@laravel.com', 'taylor' => 'taylor@laravel.com', ]);
</code-snippet>Pest 3 Features
Architecture Testing
Pest 3 includes architecture testing to enforce code conventions:
<code-snippet name="Architecture Test Example" lang="php">arch('controllers') ->expect('App\Http\Controllers') ->toExtendNothing() ->toHaveSuffix('Controller');
arch('models') ->expect('App\Models') ->toExtend('Illuminate\Database\Eloquent\Model');
arch('no debugging') ->expect(['dd', 'dump', 'ray']) ->not->toBeUsed();
</code-snippet>Type Coverage
Pest 3 provides improved type coverage analysis. Run with --type-coverage flag.
Common Pitfalls
- •Not importing
use function Pest\Laravel\mock;before using mock - •Using
assertStatus(200)instead ofassertSuccessful() - •Forgetting datasets for repetitive validation tests
- •Deleting tests without approval