rector / behastan
Static analysis for Behat definitions and context files
Fund package maintenance!
tomasvotruba
www.paypal.me/rectorphp
Installs: 15 317
Dependents: 0
Suggesters: 0
Security: 0
Stars: 10
Watchers: 1
Forks: 0
Open Issues: 0
pkg:composer/rector/behastan
Requires
- php: ^8.2
- illuminate/container: ^11.41|^12.37
- nette/utils: ^4.0
- nikic/php-parser: ^5.6
- symfony/console: ^6.4|^7.0|^8.0
- symfony/finder: ^6.4|^7.0|^8.0
- webmozart/assert: ^1.12
Requires (Dev)
- phpecs/phpecs: ^2.2
- phpstan/extension-installer: ^1.4
- phpstan/phpstan: ^2.1
- phpunit/phpunit: ^11.5
- rector/rector: ^2.2
- tomasvotruba/class-leak: ^2.0
- tracy/tracy: ^2.10
README
Find unused and duplicated definitions easily – without running Behat tests.
Install
composer require behastan/behastan --dev
Usage
vendor/bin/behastan analyse tests
Do you want to skip some rule? You can:
vendor/bin/behastan analyse tests --skip=<rule-identifier> # e.g. vendor/bin/behastan analyse tests --skip=duplicated-contents
Here are the available rules:
1. Find duplicated definitions contents (duplicated-contents)
Some definitions have similar masks, even identical contents:
use Behat\Step\When; #[When('load a user profile')] public function loadAUserProfile() { $this->loadRoute('/user-profile'); } #[When('load user profile')] public function loadUserProfile() { $this->loadRoute('/user-profile'); }
Better use a one definition with single mask, to make your tests more precise and easier to maintain.
2. Find duplicated masks (duplicated-masks)
Same as services, there should be unique definition masks:
use Behat\Step\When; #[When('load homepage')] public function loadUserProfile() { $this->loadRoute('/homepage'); } #[When('load homepage')] public function loadUserProfile() { $this->loadRoute('/homepage/default'); }
Make them unique with different behavior, or merge them and use one definition instead.
3. Find unused definitions (unused-definitions)
Behat uses @When(), @Then() and @Given() annotations or attributes to define a class method that is called in *.feature files. Sometimes test change and lines from *.feature files are deleted. But what about definitions?
# some *.feature file Scenario: Load admin dashboard - When load admin dashboard + When load homepage
↓
use Behat\Step\When; #[When('load admin dashboard')] public function loadAdminDashboard() { $this->loadRoute('/admin/dashboard'); }
This rule spots definitions that are no longer needed, so you can remove them.
Protip: Add this command to your CI, to get instant feedback of any changes in every pull-request.
That's it!
Happy coding!