friends-of-behat/suite-settings-extension
Installation
composer require --dev friends-of-behat/suite-settings-extension
Configure in behat.yml
Add the extension to your default suite configuration:
default:
extensions:
FriendsOfBehat\SuiteSettingsExtension:
paths:
- "%paths.base%/features" # Override default paths
contexts:
- "FeatureContext" # Override default contexts
First Use Case
Define a new suite in behat.yml that inherits these defaults:
my_suite:
extends: default
suites:
my_suite:
paths: [ "%paths.base%/custom-features" ] # Overrides only paths
Run with:
./vendor/bin/behat -c behat.yml --suite=my_suite
Suite Inheritance
Use extends: default to inherit settings from the configured extension.
Override only what’s needed (e.g., paths, contexts, or tags).
Environment-Specific Suites Dynamically set suite-specific configs via environment variables:
# behat.yml
test_suite:
extends: default
contexts:
- "TestContext"
suites:
test_suite:
paths: [ "%paths.base%/tests/features" ]
tags: "@test"
Context Isolation
Group contexts by feature type (e.g., AuthContext, PaymentContext) and reference them in suites:
auth_suite:
extends: default
contexts:
- "AuthContext"
suites:
auth_suite:
paths: [ "%paths.base%/auth/features" ]
CLI Overrides Temporarily override settings via CLI:
./vendor/bin/behat -c behat.yml --suite=my_suite --contexts="FeatureContext,DebugContext"
Dynamic Paths
Use Laravel’s base_path() in behat.yml:
default:
extensions:
FriendsOfBehat\SuiteSettingsExtension:
paths:
- "%paths.base%/tests/Feature" # Laravel's test features dir
Service Container Contexts
Register Behat contexts as Laravel services (e.g., AuthContext) and reference them in suites:
auth_suite:
contexts:
- "App\Services\AuthContext"
Environment-Based Suites
Load suites conditionally based on Laravel’s .env:
# behat.yml
%env(APP_ENV) == 'testing'%:
test_suite:
extends: default
contexts:
- "TestContext"
Path Resolution
"features" resolve relative to behat.yml, not the project root.%paths.base% or absolute paths:
paths:
- "%paths.base%/features" # Correct
- "features" # May fail if behat.yml isn’t in root
Context Loading Order
default may conflict with suite-specific contexts.Extension Configuration Overlap
FriendsOfBehat\SuiteSettingsExtension with other extensions (e.g., Behat\MinkExtension) may cause duplicate settings.paths or contexts are defined in multiple extensions.Deprecated Syntax
%env() syntax.parameters in behat.yml for dynamic values:
default:
extensions:
FriendsOfBehat\SuiteSettingsExtension:
paths:
- "%paths.base%/features/%behat.environment%"
Validate Suite Settings
Run with --dry-run to inspect resolved settings:
./vendor/bin/behat --dry-run --suite=my_suite
Check Context Loading Enable verbose output to debug context loading:
./vendor/bin/behat -v --suite=my_suite
Isolate Suite Issues Test suites in isolation by creating minimal configs:
# behat.minimal.yml
my_suite:
extensions:
FriendsOfBehat\SuiteSettingsExtension:
paths: [ "features" ]
suites:
my_suite:
contexts: [ "FeatureContext" ]
Custom Suite Factories Extend the extension to support dynamic suite generation (e.g., per-module suites):
// CustomExtension.php
use FriendsOfBehat\SuiteSettingsExtension\SuiteSettingsExtension;
class CustomSuiteSettingsExtension extends SuiteSettingsExtension {
public function load(Loader $loader, array $config) {
parent::load($loader, $config);
// Add logic to generate suites dynamically
}
}
Environment-Aware Paths
Override getPaths() in a custom extension to resolve paths based on Laravel’s storage paths:
public function getPaths(array $config) {
return [
base_path('tests/Feature'),
storage_path('features'),
];
}
Tag-Based Suite Filtering
Use the extension to enforce tag-based suite separation (e.g., @smoke, @regression):
smoke_suite:
extends: default
suites:
smoke_suite:
tags: "@smoke"
How can I help you explore Laravel packages today?