| name | testbench-package-testing |
| description | Develops and tests Laravel packages using Orchestra Testbench. Activates when writing package tests, configuring testbench.yaml, managing migrations, defining routes/environment for tests, using Testbench Dusk for browser tests, or working with Workbench for package preview. |
| license | MIT |
| metadata | {"author":"coderstm"} |
| applyTo | ["tests/**/*.php","testbench.yaml","phpunit.xml*","workbench/**/*"] |
Testbench Documentation Skill
Purpose
This skill provides comprehensive knowledge of Orchestra Testbench — the standard tool for testing, developing, and previewing Laravel packages. It covers Testbench, Testbench Dusk, and Workbench components.
Key Components
- Testbench — Write feature/integration tests for Laravel packages by extending
Orchestra\Testbench\TestCase
- Testbench Dusk — Browser-based testing via
Orchestra\Testbench\Dusk\TestCase
- Workbench — Preview and interact with packages during development via
serve command
- CLI —
vendor/bin/testbench provides artisan-like commands for the stub Laravel skeleton
Quick Reference
Installation
composer require --dev "orchestra/testbench"
composer require --dev "orchestra/testbench-dusk"
vendor/bin/testbench workbench:install
Testbench YAML Configuration
| Key | Type | Description |
|---|
laravel | string | Path to Laravel skeleton |
providers | array | Service providers to load |
migrations | array | Migration paths |
seeders | array | Seeder classes |
dont-discover | array | Packages to ignore |
bootstrappers | array | Bootstrapper classes |
env | array | CLI environment variables |
purge | array | Files/directories to prune |
workbench | object | Workbench settings (welcome, install, start, user, auth, guard, sync, build, assets, discovers) |
Base TestCase Setup
class TestCase extends \Orchestra\Testbench\TestCase
{
use Orchestra\Testbench\Concerns\WithWorkbench;
}
Key TestCase Methods
| Method | Purpose |
|---|
getPackageProviders($app) | Register service providers |
getPackageAliases($app) | Register facades |
defineEnvironment($app) | Set config/env before boot |
defineRoutes($router) | Define routes early |
defineDatabaseMigrations() | Configure DB migrations |
applicationBasePath() | Custom Laravel skeleton path |
ignorePackageDiscoveriesFrom() | Exclude package discovery |
resolveApplicationConsoleKernel($app) | Swap console kernel |
resolveApplicationHttpKernel($app) | Swap HTTP kernel |
Database Testing
#[WithEnv('DB_CONNECTION', 'testing')]
<env name="DB_CONNECTION" value="testing"/>
use Illuminate\Foundation\Testing\RefreshDatabase;
#[WithMigration]
#[WithMigration('laravel', 'cache', 'queue')]
use function Orchestra\Testbench\workbench_path;
$this->loadMigrationsFrom(workbench_path('database/migrations'));
Route Testing
protected function defineRoutes($router)
{
$router->get('hello', fn () => 'Hello World');
}
#[DefineRoute('usesAuthRoutes')]
public function it_loads_auth_routes() { }
Environment Overrides
<env name="APP_KEY" value="AckfSECXIvnK5r28GVIWUAxmbBSjTsmF"/>
protected $loadEnvironmentVariables = false;
#[DefineEnvironment('usesMySqlConnection')]
protected function defineEnvironment($app)
{
$app['config']->set('database.default', 'testing');
}
CLI Commands
vendor/bin/testbench migrate
vendor/bin/testbench package:create-sqlite-db
vendor/bin/testbench package:drop-sqlite-db
vendor/bin/testbench package:purge-skeleton
vendor/bin/testbench package:test
vendor/bin/testbench package:test --parallel
vendor/bin/testbench workbench:install
vendor/bin/testbench serve
composer run serve
Testbench Dusk
class DuskTestCase extends \Orchestra\Testbench\Dusk\TestCase
{
use WithWorkbench;
protected static $baseServeHost = '127.0.0.1';
protected static $baseServePort = 9000;
}
use Orchestra\Testbench\Dusk\Options;
Options::withUI();
Options::withoutUI();
$this->beforeServingApplication(function ($app, $config) {
$config->set('mail.default', 'log');
});
Version Compatibility
| Laravel | Testbench | Testbench Dusk | Workbench |
|---|
| 8.x | 6.x | 6.x | — |
| 9.x | 7.x | 7.x | 7.x |
| 10.x | 8.x | 8.x | 8.x |
| 11.x | 9.x | 9.x | 9.x |
| 12.x | 10.x | 10.x | 10.x |
Common Pitfalls
- DB_CONNECTION — Use
testing for in-memory SQLite (declares sqlite driver with :memory:)
- APP_KEY — Required if app uses encryption; set in
phpunit.xml
- Dusk + Testbench in same suite — Override
applicationBasePath() to use Dusk's skeleton for all test classes
- ChromeDriver errors — Run
vendor/bin/dusk-updater update
- Legacy factories — Require
laravel/legacy-factories when supporting Laravel < 8
- No auto-discovery by default — Use
$enablesPackageDiscoveries = true or explicit providers
Related Files
- Config —
testbench.yaml
- Test Base —
tests/TestCase.php
- Workbench —
workbench/ directory (app, routes, database, config)
- Docs —
.agent/skills/testbench-docs/