Installation:
composer require --dev nyholm/symfony-bundle-test
Add to your composer.json under require-dev:
"extra": {
"symfony-bundle-test": {
"bundles": ["App\\MyBundle\\MyBundle"]
}
}
First Use Case: Run a basic smoke test to verify your bundle loads correctly:
./vendor/bin/symfony-bundle-test
This checks if your bundle can be instantiated and registered in a Symfony kernel.
Where to Look First:
config/packages/test.yaml (if using Symfony Flex)tests/Bundle/ (for custom test configurations)vendor/nyholm/symfony-bundle-test/src/ (core logic and CLI commands)CI/CD Pipeline: Add to your GitHub Actions/GitLab CI:
- name: Test Bundle
run: ./vendor/bin/symfony-bundle-test
Run before PHPUnit/Behat to fail fast if the bundle is broken.
Local Development:
Use as a pre-commit hook (via husky or pre-commit) to catch bundle issues early:
npx husky add .husky/pre-commit 'php vendor/bin/symfony-bundle-test'
Multi-Bundle Projects:
Configure extra.symfony-bundle-test.bundles in composer.json to test multiple bundles in one command:
"extra": {
"symfony-bundle-test": {
"bundles": [
"App\\Bundle1\\Bundle1",
"App\\Bundle2\\Bundle2"
]
}
}
Custom Test Environments: Extend the default test kernel by creating a custom test class:
// tests/Bundle/CustomTestKernel.php
use Nyholm\SymfonyBundleTest\TestKernel;
class CustomTestKernel extends TestKernel
{
protected function getBundleClassNames(): array
{
return ['App\\MyBundle\\MyBundle', 'Symfony\\Bundle\\FrameworkBundle\\FrameworkBundle'];
}
}
Then run:
./vendor/bin/symfony-bundle-test --kernel=CustomTestKernel
Missing Dependencies:
The test fails silently if required bundles (e.g., FrameworkBundle) are missing. Fix: Ensure composer.json includes all dependencies listed in your bundle’s Resources/config/services.yaml.
Kernel Configuration:
If your bundle relies on environment variables (e.g., .env), the test runs in a clean environment. Fix: Mock dependencies or use a custom kernel with preloaded config:
// tests/Bundle/CustomTestKernel.php
protected function getEnv(): array
{
return ['APP_ENV' => 'test', 'DATABASE_URL' => 'sqlite:///:memory:'];
}
Circular Dependencies:
The test may hang or fail if bundles have circular dependencies. Fix: Reorder bundles in getBundleClassNames() or refactor dependencies.
Debugging Failures: Enable verbose output for detailed errors:
./vendor/bin/symfony-bundle-test -v
Or run with --debug to see the full kernel boot process.
Test Database Connections: Add a custom assertion to verify database connectivity:
// tests/Bundle/DatabaseTest.php
use Nyholm\SymfonyBundleTest\TestCase;
class DatabaseTest extends TestCase
{
public function testDatabaseConnection()
{
$this->assertTrue($this->getContainer()->get('database_connection')->isConnected());
}
}
Skip Tests: Exclude specific bundles temporarily:
./vendor/bin/symfony-bundle-test --exclude="App\\DebugBundle\\DebugBundle"
Performance: Cache the test kernel to speed up repeated runs:
./vendor/bin/symfony-bundle-test --cache-dir=var/cache/bundle_test
Extension Points: Override the default test case to add assertions:
// tests/Bundle/TestCase.php
use Nyholm\SymfonyBundleTest\TestCase as BaseTestCase;
abstract class TestCase extends BaseTestCase
{
protected function assertServiceExists(string $id): void
{
$this->assertTrue($this->getContainer()->has($id), "Service {$id} not found.");
}
}
Symfony Flex Projects:
If using Symfony Flex, the package auto-detects bundles from config/bundles.php. Tip: Keep this file updated to avoid false negatives.
How can I help you explore Laravel packages today?