| Install | |
|---|---|
composer require grazulex/laravel-tddraft |
|
| Latest Version: | v1.2.0 |
| PHP: | ^8.3 |
A Laravel package that enables safe Test-Driven Development with isolated draft testing, unique reference tracking, and powerful filtering options for professional TDD workflows.
Laravel TDDraft enables true Test-Driven Development in Laravel applications by providing a separate, isolated testing environment where you can practice the Red-Green-Refactor cycle without affecting your CI pipeline or breaking team builds.
The key innovation is the five-command workflow that separates experimental draft tests from production tests, with powerful filtering and status tracking to manage your TDD process professionally.
Laravel TDDraft creates a completely separate testing environment that doesn't interfere with your existing test suite:
tests/
├── Feature/ # 🟢 Your production CI tests (unchanged)
├── Unit/ # 🟢 Your production CI tests (unchanged)
└── TDDraft/ # 🔵 Isolated draft tests (new - never affects CI)
├── Feature/ # Draft feature tests
├── Unit/ # Draft unit tests
└── .status.json # Status tracking (auto-generated)
tests/TDDraft/ are completely excluded from your main test suitestests/Unit/ and tests/Feature/ continue working exactly as beforeStandard PHPUnit/Pest Configuration:
<testsuites>
<testsuite name="Unit">
<directory suffix="Test.php">tests/Unit</directory> <!-- Production tests -->
</testsuite>
<testsuite name="Feature">
<directory suffix="Test.php">tests/Feature</directory> <!-- Production tests -->
</testsuite>
<!-- tests/TDDraft/ is intentionally NOT included -->
</testsuites>
TDDraft Tests Run Separately:
# Your CI pipeline (unchanged)
pest # Runs only tests/Unit + tests/Feature
phpunit # Runs only tests/Unit + tests/Feature
# TDDraft workflow (isolated)
php artisan tdd:test # Runs only tests/TDDraft/**
pest --testsuite=tddraft # Alternative access to draft tests
This architectural separation ensures that failing TDDraft tests never break your CI builds while you practice the Red-Green-Refactor cycle.
TDD is hard to practice in real projects because:
Laravel TDDraft solves these problems with:
tests/TDDraft/ directory completely separate from tests/Unit/ and tests/Feature/ - never affects CItdd-YYYYMMDDHHMMSS-RANDOM ID for precise trackingInstall the package via Composer:
composer require grazulex/laravel-tddraft --dev
💡 Auto-Discovery
The service provider will be automatically registered thanks to Laravel's package auto-discovery.
Publish configuration:
php artisan vendor:publish --tag=tddraft-config
php artisan tdd:init
This sets up the isolated draft testing environment with PHPUnit/Pest configuration.
php artisan tdd:make "User can register"
Creates a draft test with unique reference tracking:
/**
* TDDraft Test: User can register
* Reference: tdd-20250727142530-Abc123
* Type: feature
*/
it('user can register', function (): void {
// TODO: Implement your test scenario here
expect(true)->toBeTrue('Replace this with your actual test implementation');
})
->group('tddraft', 'feature', 'tdd-20250727142530-Abc123');
# Run all draft tests
php artisan tdd:test
# Filter by test name
php artisan tdd:test --filter="user registration"
# Run with coverage
php artisan tdd:test --coverage
# List all draft tests
php artisan tdd:list
# Filter by type
php artisan tdd:list --type=feature
# Filter by path
php artisan tdd:list --path=Auth
# Show detailed view with status information
php artisan tdd:list --details
# Find reference from listing
php artisan tdd:list
# Promote specific test
php artisan tdd:promote tdd-20250727142530-Abc123
Laravel TDDraft is built around a structured five-command workflow that enables professional TDD practice:
tdd:init - Setup Phasephp artisan tdd:init
tests/TDDraft/ directory structuretdd:make - Red Phase (Create Failing Tests)php artisan tdd:make "Feature description" [options]
Options:
--type=feature|unit - Specify test type (default: feature)--path=Auth/Api - Custom subdirectory path--class=CustomTestName - Custom class nameCreates draft test with unique tracking reference.
tdd:test - Green Phase (Run and Iterate)php artisan tdd:test [options]
Options:
--filter="test name" - Filter tests by name pattern--coverage - Generate coverage report--parallel - Run tests in parallel--stop-on-failure - Stop on first failureRuns draft tests with automatic status tracking.
tdd:list - Review Phase (Manage Tests)php artisan tdd:list [options]
Options:
--type=feature|unit - Filter by test type--path=directory - Filter by directory path--details - Show detailed view with status historyView and filter all draft tests with their current status.
tdd:promote - Graduation Phase (Move to CI)php artisan tdd:promote <reference> [options]
Options:
--target=Feature|Unit - Target directory override--new-file=TestName - Custom file name--class=ClassName - Custom class name--keep-draft - Keep original draft file--force - Overwrite without confirmationPromotes mature tests to main test suite with audit trail preservation.
Laravel TDDraft provides powerful filtering capabilities across all commands:
tdd:list Command Filters# Filter by test type
php artisan tdd:list --type=feature
php artisan tdd:list --type=unit
# Filter by directory path
php artisan tdd:list --path=Auth
php artisan tdd:list --path=Api/V1
# Show detailed view with status history
php artisan tdd:list --details
# Combine filters
php artisan tdd:list --type=feature --path=Auth --details
tdd:test Command Filters# Filter by test name pattern
php artisan tdd:test --filter="user registration"
php artisan tdd:test --filter="login"
# Filter by specific reference
php artisan tdd:test --filter="tdd-20250727142530-Abc123"
# Run with additional options
php artisan tdd:test --filter="api" --coverage --parallel
Every draft test is automatically tagged with multiple groups for flexible filtering:
it('user can register', function (): void {
// Test implementation
})
->group('tddraft', 'feature', 'tdd-20250727142530-Abc123');
tddraft - Identifies all TDDraft testsfeature/unit - Test type classificationtdd-YYYYMMDDHHMMSS-RANDOM - Unique reference for individual test tracking# Run only draft tests (all)
pest --testsuite=tddraft
# Run only feature draft tests
pest --testsuite=tddraft --group=feature
# Run only unit draft tests
pest --testsuite=tddraft --group=unit
# Run specific test by reference
pest --testsuite=tddraft --group=tdd-20250727142530-Abc123
# Run multiple groups
pest --testsuite=tddraft --group=feature,unit
Use the status tracking system to filter by test stability:
# List tests and check their status
php artisan tdd:list --details
# Example output shows status information:
# 📊 ✅ Passed - Ready for promotion
# 📊 ❌ Failed - Needs attention
# 📊 ⏭️ Skipped - Review implementation
# 📊 🎯 Promoted - Already moved to CI
Each test gets a unique reference for precise operations:
# Create test (generates reference)
php artisan tdd:make "User login validation"
# Output: Reference: tdd-20250727142530-Abc123
# Run specific test by reference
php artisan tdd:test --filter="tdd-20250727142530-Abc123"
# Promote specific test
php artisan tdd:promote tdd-20250727142530-Abc123
# List to find references
php artisan tdd:list | grep "tdd-"
# Find all authentication-related tests
php artisan tdd:list --path=Auth --details
# Run only feature tests for API
php artisan tdd:test --filter="api"
pest --testsuite=tddraft --group=feature | grep -i api
# Batch operations on specific test types
php artisan tdd:list --type=unit | grep "✅ Passed" # Find unit tests ready for promotion
# Status tracking analysis
php artisan tdd:list --details | grep "❌ Failed" # Find tests needing attention
For detailed documentation, examples, and advanced usage, please visit our comprehensive wiki:
🌟 Complete Documentation & Examples Wiki
# 1. Setup (one-time)
php artisan tdd:init
# 2. Create failing test (Red phase)
php artisan tdd:make "User can register with valid email"
# 3. Run tests and implement code (Green phase)
php artisan tdd:test --filter="register"
# 4. List and manage your tests
php artisan tdd:list --details
# 5. Promote stable tests to CI
php artisan tdd:promote tdd-20250727142530-Abc123
For comprehensive examples including:
👉 Visit our Examples Wiki
Laravel TDDraft follows its own philosophy - all tests are organized using the TDD workflow with complete isolation between test environments:
tests/
├── Feature/ # Package's production tests (for CI)
├── Unit/ # Package's production tests (for CI)
└── TDDraft/ # Draft tests (isolated, never affects CI)
# Install dependencies
composer install
# Run the main CI test suite (production tests only)
pest # Runs tests/Unit + tests/Feature
pest --coverage # With coverage for production tests
# Run specific production test groups
pest --group=unit # Unit tests only
pest --group=feature # Feature tests only
# TDDraft workflow (completely separate)
php artisan tdd:test # Runs only tests/TDDraft/** tests
php artisan tdd:list # Manage draft tests
For Package Development:
tests/Unit/, tests/Feature/) ensure package stabilityFor Package Users:
tests/Unit/ and tests/Feature/ remain unchangedtests/TDDraft/ for safe TDD practiceIf you're contributing to Laravel TDDraft itself, follow the same TDD principles:
The package tests itself using the standard Laravel/Pest approach, while providing TDDraft workflow for users.
We welcome contributions! Please see our Contributing Guide for details.
If you discover a security vulnerability, please review our Security Policy before disclosing it.
Laravel TDDraft is open-sourced software licensed under the MIT license.
Made with ❤️ for the Laravel community