adachsoft / phpunit-runner-tool
Flexible PHPUnit runner tool for adachsoft/ai-tool-call (SPI tool for running tests with filters, coverage and safe paths)
Installs: 7
Dependents: 0
Suggesters: 0
Security: 0
Stars: 0
Forks: 0
pkg:composer/adachsoft/phpunit-runner-tool
Requires
- php: ^8.3
- adachsoft/ai-tool-call: ^2.0.0
- adachsoft/command-executor-lib: ^2.0
- adachsoft/normalized-safe-path: ^0.1.0
- adachsoft/php-code-style: 0.3.2
Requires (Dev)
- friendsofphp/php-cs-fixer: ^3.89
- phpstan/phpstan: 2.1.34
- phpunit/phpunit: ^12.4
- rector/rector: 2.3.3
README
Flexible PHPUnit runner tool for adachsoft/ai-tool-call. This library provides a single, versatile tool to run PHPUnit tests in various project configurations.
⚠️ Breaking Changes in v0.2.0
Configuration keys changed from camelCase to snake_case to comply with adachsoft/ai-tool-call 2.0.0 standards:
basePath→base_pathphpunitPath→phpunit_pathdefaultCoverage→default_coveragedefaultMaxErrors→default_max_errorsdefaultTimeout→default_timeout
Installation
composer require adachsoft/phpunit-runner-tool
Quick Start
Register the tool with adachsoft/ai-tool-call:
use AdachSoft\AiToolCall\AiToolCallFacadeBuilder;
use AdachSoft\AiToolCall\SPI\Collection\ConfigMap;
use AdachSoft\PhpUnitRunnerTool\Tool\PhpUnitRunnerToolFactory;
$facade = (new AiToolCallFacadeBuilder())
->withSpiFactories([new PhpUnitRunnerToolFactory()])
->withToolConfigs([
'phpunit_runner' => new ConfigMap([
'base_path' => '/path/to/your/project',
'phpunit_path' => 'vendor/bin/phpunit',
]),
])
->build();
Usage Examples
Run All Tests
$result = $facade->callTool('phpunit_runner', []);
// Runs all tests with default configuration
// Internally, PHPUnit is invoked with flags like --display-phpunit-notices and --display-skipped by default.
Run Single Test File
$result = $facade->callTool('phpunit_runner', [
'path' => 'tests/Unit/UserServiceTest.php',
]);
Run Tests in Directory
$result = $facade->callTool('phpunit_runner', [
'path' => 'tests/Integration',
]);
With Custom Configuration
$result = $facade->callTool('phpunit_runner', [
'path' => 'tests/Unit',
'phpunit_xml' => 'custom-phpunit.xml',
'filter' => 'testUserCreation',
'coverage' => false,
'max_errors' => 3,
'timeout' => 60,
]);
Configuration Options
| Parameter | Type | Default | Description |
|---|---|---|---|
path | string | null | Path to test file or directory (relative to base_path or absolute). Empty string is treated as null and runs all tests. |
phpunit_xml | string | null | Custom PHPUnit configuration file (relative to base_path or absolute). |
filter | string | null | Test method name or pattern filter. |
coverage | bool | true | Enable code coverage. |
max_errors | int | 5 | Maximum detailed errors to return. |
timeout | int | null | Execution timeout in seconds for this call. Cannot exceed configured max_timeout (if set). |
Configuration in ToolFactory
When registering the tool, you can configure:
new ConfigMap([
'base_path' => '/absolute/path/to/project',
'phpunit_path' => 'vendor/bin/phpunit', // Relative to base_path or absolute
'default_coverage' => true,
'default_max_errors' => 5,
'default_timeout' => null, // Default timeout when per-call timeout is not provided
'max_timeout' => null, // Optional hard cap for per-call timeout (int > 0 or null for no limit)
'display_notices' => false, // Display notices during test execution (adds --display-notices)
'display_warnings' => false, // Display warnings during test execution (adds --display-warnings)
'display_deprecations' => false, // Display deprecations during test execution (adds --display-deprecations)
])
By default, the underlying runner always passes --display-phpunit-notices and --display-skipped to PHPUnit so that framework-level notices and skipped tests are visible without additional configuration.
Response Format
The tool returns an array with:
[
'stdout' => 'PHPUnit output...',
'stderr' => 'Error output...',
'exit_code' => 0, // 0 for success, >0 for failure
'success' => true, // Boolean based on exit code
]
Error Handling
The tool throws ToolExecutionException for:
- Non-existent test paths
- Invalid PHPUnit configuration
- Command execution failures
- Timeout errors
- Permission issues
Additionally, the tool throws InvalidArgumentException when:
pathpoints to an excluded folder configured viaexcluded_folderstimeoutormax_errorsparameters are of invalid typestimeoutexceeds the configuredmax_timeoutlimit when such a limit is set
Static Analysis & Code Style
This project uses the shared adachsoft/php-code-style configuration for:
- PHP-CS-Fixer ruleset (imported via
.php-cs-fixer.php→vendor/adachsoft/php-code-style/.php-cs-fixer.dist.php), - PHPStan configuration (via
phpstan.neonincludingvendor/adachsoft/php-code-style/phpstan.neon.dist), - Rector base config (imported via
rector.php→vendor/adachsoft/php-code-style/rector.dist.php).
Recommended Composer scripts:
"scripts": {
"cs:check": "php-cs-fixer fix --dry-run --diff --config=.php-cs-fixer.php",
"cs:fix": "php-cs-fixer fix --config=.php-cs-fixer.php",
"stan": "phpstan analyse",
"rector": "rector"
}
Run tools via:
composer cs:check # check coding style
composer cs:fix # auto-fix coding style
composer stan # run PHPStan analysis
composer rector # run Rector refactoring
Requirements
- PHP >= 8.3
- PHPUnit installed in target project
- adachsoft/ai-tool-call ^2.0.0
- adachsoft/command-executor-lib ^2.0
License
MIT