A Laravel package that enables safe Test-Driven Development with isolated draft testing, unique reference tracking, and powerful filtering options for professional TDD workflows.
- Overview
- β¨ Features
- π¦ Installation
- π Quick Start
- π§ Five-Command TDD Workflow
- π Filter and Group Options
- π Documentation
- π‘ Examples
- π§ͺ Testing
- π§ Requirements
- π€ Contributing
- π Security
- π License
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)
- π« Zero CI Interference: TDDraft tests in
tests/TDDraft/are completely excluded from your main test suites - π Independent Operation: Your existing
tests/Unit/andtests/Feature/continue working exactly as before - π Separate Test Suites: PHPUnit/Pest configuration keeps TDDraft isolated via test suite definitions
- β‘ Parallel Development: Teams can practice TDD in the draft environment while CI runs production tests
Standard 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 testsThis 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:
- Writing failing tests breaks CI builds and affects the team
- Experimental tests clutter your main test suite
- There's no easy way to track test evolution during TDD cycles
- Promoting draft tests to production requires manual work
Laravel TDDraft solves these problems with:
- β Isolated Draft Testing - Separate test environment that never affects CI
- β Unique Reference Tracking - Every test gets a trackable ID for evolution monitoring
- β Powerful Filtering - Advanced options to filter tests by type, path, status, and reference
- β Status Tracking - Automatic monitoring of test results and history
- β Automated Promotion - Easy graduation from draft to production tests
- β Professional Workflow - Structured five-command process for TDD adoption
- ποΈ Complete Test Isolation -
tests/TDDraft/directory completely separate fromtests/Unit/andtests/Feature/- never affects CI - π Unique Reference Tracking - Every test gets a
tdd-YYYYMMDDHHMMSS-RANDOMID for precise tracking - π Advanced Filtering - Filter tests by type, path, reference, status, and more
- π Automatic Status Tracking - Monitor test results and history during TDD cycles
- π― Professional Test Management - List, filter, and manage draft tests with detailed views
- π Automated Promotion - Graduate mature tests to CI suite with preserved audit trails
- π True TDD Workflow - Safe Red-Green-Refactor cycles without breaking builds
- π Group-Based Organization - Pest groups for flexible test filtering and execution
- β‘ Five-Command Simplicity - Complete TDD workflow with just five intuitive commands
- π§ͺ Zero Interference Design - Your existing Unit/Feature tests continue working unchanged
Install 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-configphp artisan tdd:initThis 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-Abc123Laravel TDDraft is built around a structured five-command workflow that enables professional TDD practice:
php artisan tdd:init- Creates
tests/TDDraft/directory structure - Configures PHPUnit/Pest for isolated draft testing
- Sets up status tracking system
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 name
Creates draft test with unique tracking reference.
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 failure
Runs draft tests with automatic status tracking.
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 history
View and filter all draft tests with their current status.
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 confirmation
Promotes mature tests to main test suite with audit trail preservation.
Laravel TDDraft provides powerful filtering capabilities across all commands:
# 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# 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 --parallelEvery 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,unitUse 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 CIEach 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 attentionFor detailed documentation, examples, and advanced usage, please visit our comprehensive wiki:
π Complete Documentation & Examples Wiki
- οΏ½ Full Documentation
- π Quick Start Guide
- π§ Configuration
- π‘ Advanced Examples
- π― Best Practices
- π§ͺ Test Templates
- π Coverage & Reporting
# 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-Abc123For comprehensive examples including:
- Real-world TDD workflows
- Advanced filtering techniques
- Team collaboration patterns
- Integration with CI/CD
- Performance optimization
π 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 testsFor Package Development:
- Production tests (
tests/Unit/,tests/Feature/) ensure package stability - CI pipeline only runs production tests - never broken by experimental code
- Draft tests demonstrate package capabilities without affecting main suite
For Package Users:
- Your existing
tests/Unit/andtests/Feature/remain unchanged - TDDraft adds
tests/TDDraft/for safe TDD practice - No interference between production and draft test environments
If you're contributing to Laravel TDDraft itself, follow the same TDD principles:
- Write failing tests first
- Implement minimal code to make them pass
- Refactor while keeping tests green
The package tests itself using the standard Laravel/Pest approach, while providing TDDraft workflow for users.
- PHP: ^8.3
- Laravel: ^12.0
- Pest: ^3.0 (for testing framework)
- PHPUnit: ^11.0 (alternative to Pest)
- Docker: For containerized development (optional)
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
- CODE_OF_CONDUCT.md - Our code of conduct
- CONTRIBUTING.md - How to contribute
- SECURITY.md - Security policy
- RELEASES.md - Release notes and changelog
