home / skills / openagentsinc / openagents / pest-testing

This skill helps you write and debug Pest 4 tests in PHP applications, covering unit, feature, browser, and visual regression scenarios.

npx playbooks add skill openagentsinc/openagents --skill pest-testing

Review the files below or copy the command above to add this skill to your agents.

Files (1)
SKILL.md
4.6 KB
---
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."
license: MIT
metadata:
  author: laravel
---

# 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

<!-- Basic Pest Test Example -->
```php
it('is true', function () {
    expect(true)->toBeTrue();
});
```

### 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()`:

<!-- Pest Response Assertion -->
```php
it('returns all', function () {
    $this->postJson('/api/docs', [])->assertSuccessful();
});
```

| 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.):

<!-- Pest Dataset Example -->
```php
it('has emails', function (string $email) {
    expect($email)->not->toBeEmpty();
})->with([
    'james' => '[email protected]',
    'taylor' => '[email protected]',
]);
```

## 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.

<!-- Pest Browser Test Example -->
```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);
});
```

### Smoke Testing

Quickly validate multiple pages have no JavaScript errors:

<!-- Pest Smoke Testing Example -->
```php
$pages = visit(['/', '/about', '/contact']);

$pages->assertNoJavaScriptErrors()->assertNoConsoleLogs();
```

### 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):

<!-- Architecture Test Example -->
```php
arch('controllers')
    ->expect('App\Http\Controllers')
    ->toExtendNothing()
    ->toHaveSuffix('Controller');
```

## 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

Overview

This skill helps you write, run, and debug tests using the Pest 4 PHP framework. It focuses on best practices for unit, feature, browser, and architecture tests, and provides guidance for assertions, datasets, mocking, sharding, and visual regression testing. Use it to keep tests consistent, fast, and reliable across development and CI.

How this skill works

The skill inspects test code and context to suggest Pest-specific patterns, assertions, and structure. It recommends commands for running tests, advises on browser and smoke testing setup, and flags common pitfalls like missing imports or weak assertions. For failing tests it suggests debugging steps, dataset usage, and when to add mocks or RefreshDatabase isolation.

When to use it

  • Creating new unit, feature, browser, or architecture tests
  • Modifying or refactoring existing tests and assertions
  • Debugging failing tests, browser errors, or flaky CI runs
  • Adding datasets, mocks, or Livewire/browser interactions
  • Implementing visual regression, smoke testing, or sharded CI

Best practices

  • Generate tests with php artisan make:test --pest {Name} and keep tests in tests/Unit, tests/Feature, or tests/Browser
  • Prefer specific response assertions (assertSuccessful, assertNotFound, assertForbidden) over assertStatus
  • Import mock helper before use: use function Pest\Laravel\mock;
  • Use datasets for repetitive inputs and RefreshDatabase for clean state per test
  • Run focused tests during development with php artisan test --compact --filter=Name before running all tests

Example use cases

  • Write a feature test for an API endpoint using assertSuccessful() and JSON assertions
  • Create a browser test that navigates pages, interacts with forms, and asserts no JavaScript errors
  • Use datasets to validate multiple input permutations for a form validator
  • Implement visual regression by capturing screenshots and comparing them across runs
  • Shard slow test suites across CI workers to reduce overall pipeline time

FAQ

How do I run a single Pest test file?

Use php artisan test --compact tests/Feature/YourTest.php or run a specific test with --filter=testName.

When should I use RefreshDatabase?

Use RefreshDatabase for tests that modify the database to ensure a clean state between tests and avoid cross-test interference.