pest-testing — Claude Code skill: what it does, how to install
Applies Pest 4 standards for testing PHP applications. Guides unit, feature, browser, and architecture tests with recommended assertions and datasets.
npx skills add spatie/freek.dev --skill pest-testing -a claude-codeWhat pest-testing does
The skill sets strict conventions for writing tests with the Pest 4 PHP framework. It directs the agent to generate tests using php artisan make:test --pest {name}. Files go to tests/Unit, tests/Feature, or tests/Browser/. Existing tests cannot be deleted without prior approval.
Specific assertion helpers take priority over status codes. The agent must use assertSuccessful(), assertNotFound(), and assertForbidden() instead of raw assertStatus() calls. Before running mocks, it enforces importing use function Pest\Laravel\mock;. Missing this import will break test execution immediately.
It covers browser testing in real browsers with viewport control and assertNoJavascriptErrors(). For quick multi-page checks, it defines smoke testing patterns. It also handles architectural assertions with arch(), visual regression, and test sharding for parallel CI runs.
What it helps with
- write unit and feature tests using Pest 4 syntax
- set up browser tests with JavaScript error assertions
- enforce architectural rules across application controllers
- replace generic HTTP status assertions with Pest helpers
Example prompts for the agent
- Write a Pest test for user password reset flow
- Create an architecture test enforcing controller naming rules
- Add a Pest 4 smoke test checking routes for JavaScript console errors
How to install pest-testing
1Skills CLI (Vercel)
npx skills add spatie/freek.dev --skill pest-testing -a claude-code2Manually: put the files in place
~/.claude/skills/pest-testing/SKILL.mdCopy the whole skill folder; for one project use .claude/skills/pest-testing/
1Skills CLI (Vercel)
npx skills add spatie/freek.dev --skill pest-testing -a codex2Manually: put the files in place
.agents/skills/pest-testing/SKILL.mdFor all projects use ~/.agents/skills/
1Skills CLI (Vercel)
npx skills add spatie/freek.dev --skill pest-testing -a cursor2Manually: put the files in place
.cursor/skills/pest-testing/SKILL.mdCursor also reads .agents/skills/ and .claude/skills/
1GitHub CLI
gh skill install spatie/freek.dev pest-testing2Manually: put the files in place
.github/skills/pest-testing/SKILL.md1Skills CLI (Vercel)
npx skills add spatie/freek.dev --skill pest-testing -a gemini-cli2Platform CLI
gemini skills install https://github.com/spatie/freek.dev --path .claude/skills/pest-testingManually: put the files in place
.devin/skills/pest-testing/SKILL.mdThe legacy .windsurf/skills/ path still works
Skills CLI (Vercel)
npx skills add spatie/freek.dev --skill pest-testing -a opencodeClaude.ai
Zip the folder and upload it in Settings → Capabilities → Skills
Step by step, with commands for each platform: How to install skills in Claude Code: five ways
Questions about pest-testing
How do I install pest-testing in Claude Code?
Run npx skills add spatie/freek.dev --skill pest-testing -a claude-code in your terminal.
What does the pest-testing skill do?
It instructs AI coding agents to write and debug tests using Pest 4 conventions. It covers unit, browser, smoke, and architecture testing patterns.
What assertion rules does this skill enforce?
It requires specific assertion methods like assertSuccessful() instead of assertStatus(200). For 404 and 403 HTTP statuses, it directs the agent to use assertNotFound() and assertForbidden().
Source text
SKILL.md · MIT
---
name: pest-testing
description: >-
Tests applications using the Pest 4 PHP framework. Activates when writing tests, creating unit or feature
tests, adding assertions, testing Livewire components, browser 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.
---
# Pest Testing 4
## When to Apply
Activate this skill when:
- Creating new tests (unit, feature, or browser)
- Modifying existing tests
- Debugging test failures
- Working with browser testing or smoke testing
- Writing architecture tests or visual regression tests
## Documentation
Use `search-docs` for detailed Pest 4 patterns and documentation.
## Basic Usage
### Creating Tests
All tests must be written using Pest. Use `php artisan make:test --pest {name}`.
### Test Organization
- Unit/Feature tests: `tests/Feature` and `tests/Unit` directories.
- Browser tests: `tests/Browser/` directory.
- Do NOT remove tests without approval - these are core application code.
### 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()`:
<code-snippet name="Pest Response Assertion" lang="php">
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' => '[email protected]',
'taylor' => '[email protected]',
]);
</code-snippet>
## Pest 4 Features
| Feature | Purpose |
|---------|---------|
| Browser Testing | Full integration tests in real browsers |
| Smoke Testing | Validate multiple pages quickly |
| Visual Regression | Compare screenshots for visual changes |
| Test Sharding | Parallel CI runs |
| Architecture Testing | Enforce code conventions |
### Browser Test Example
Browser tests run in real browsers for full integration testing:
- Browser tests live in `tests/Browser/`.
- Use Laravel features like `Event::fake()`, `assertAuthenticated()`, and model factories.
- Use `RefreshDatabase` for clean state per test.
- Interact with page: click, type, scroll, select, submit, drag-and-drop, touch gestures.
- Test on multiple browsers (Chrome, Firefox, Safari) if requested.
- Test on different devices/viewports (iPhone 14 Pro, tablets) if requested.
- Switch color schemes (light/dark mode) when appropriate.
- Take screenshots or pause tests for debugging.
<code-snippet name="Pest Browser Test Example" lang="php">
it('may reset the password', function () {
Notification::fake();
$this->actingAs(User::factory()->create());
$page = visit('/sign-in');
$page->assertSee('Sign In')
->assertNoJavascriptErrors()
->click('Forgot Password?')
->fill('email', '[email protected]')
->click('Send Reset Link')
->assertSee('We have emailed your password reset link!');
Notification::assertSent(ResetPassword::class);
});
</code-snippet>
### Smoke Testing
Quickly validate multiple pages have no JavaScript errors:
<code-snippet name="Pest Smoke Testing Example" lang="php">
$pages = visit(['/', '/about', '/contact']);
$pages->assertNoJavascriptErrors()->assertNoConsoleLogs();
</code-snippet>
### Visual Regression Testing
Capture and compare screenshots to detect visual changes.
### Test Sharding
Split tests across parallel processes for faster CI runs.
### Architecture Testing
Pest 4 includes architecture testing (from Pest 3):
<code-snippet name="Architecture Test Example" lang="php">
arch('controllers')
->expect('App\Http\Controllers')
->toExtendNothing()
->toHaveSuffix('Controller');
</code-snippet>
## Common Pitfalls
- Not importing `use function Pest\Laravel\mock;` before using mock
- Using `assertStatus(200)` instead of `assertSuccessful()`
- Forgetting datasets for repetitive validation tests
- Deleting tests without approval
- Forgetting `assertNoJavascriptErrors()` in browser tests
© spatie · MIT · spatie/freek.dev