--- id: spatie/freek.dev/pest-testing version: "da67b7a3" license: MIT install: manual updated: 2026-07-22 --- # pest-testing — This skill guides you through testing Laravel applications with Pest 4, covering unit and feature tests, browser testing with real browsers, and architecture validation. It handles test organization, assertions, mocking, datasets, and debugging—activating whenever you're writing tests, adding assertions, or verifying functionality. Publisher: spatie · Stars: 651 · Updated: 2026-07-22 Install (manual): `git clone https://github.com/spatie/freek.dev` ## SKILL.md # 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 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()`: 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.): it('has emails', function (string $email) { expect($email)->not->toBeEmpty(); })->with([ 'james' => 'james@laravel.com', 'taylor' => 'taylor@laravel.com', ]); ## 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. 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', 'nuno@laravel.com') ->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: $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): 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 [View on SkillFed](https://skillfed.io/spatie/freek.dev/pest-testing) · [View on GitHub](https://github.com/spatie/freek.dev)