feat: --bail

This commit is contained in:
Nuno Maduro
2023-03-16 11:55:42 +00:00
parent b93bf82be6
commit 30b151f927
6 changed files with 117 additions and 35 deletions

View File

@ -83,6 +83,7 @@
"extra": {
"pest": {
"plugins": [
"Pest\\Plugins\\Bail",
"Pest\\Plugins\\Cache",
"Pest\\Plugins\\Coverage",
"Pest\\Plugins\\Init",

View File

@ -23,8 +23,9 @@ final class BootSubscribers implements Bootstrapper
private const SUBSCRIBERS = [
Subscribers\EnsureConfigurationIsValid::class,
Subscribers\EnsureConfigurationIsAvailable::class,
Subscribers\EnsureTeamCityEnabled::class,
Subscribers\EnsureIgnorableTestCasesAreIgnored::class,
Subscribers\EnsureKernelDumpIsFlushed::class,
Subscribers\EnsureTeamCityEnabled::class,
];
/**

30
src/Plugins/Bail.php Normal file
View File

@ -0,0 +1,30 @@
<?php
declare(strict_types=1);
namespace Pest\Plugins;
use Pest\Contracts\Plugins\HandlesArguments;
use Pest\Plugins\Concerns\HandleArguments;
/**
* @internal
*/
final class Bail implements HandlesArguments
{
use HandleArguments;
/**
* Handles the arguments, adding the `--stop-on-defect` when the `--bail` argument is present.
*/
public function handleArguments(array $arguments): array
{
if ($this->hasArgument('--bail', $arguments)) {
$arguments = $this->popArgument('--bail', $arguments);
$arguments = $this->pushArgument('--stop-on-defect', $arguments);
}
return $arguments;
}
}

View File

@ -58,6 +58,8 @@ final class Help implements HandlesArguments
'desc' => $description,
] = $option;
assert(is_string($argument));
View::render('components.two-column-detail', [
'left' => $this->colorizeOptions($argument),
'right' => preg_replace(['/</', '/>/'], ['[', ']'], $description),
@ -78,7 +80,7 @@ final class Help implements HandlesArguments
*/
private function colorizeOptions(string $argument): string
{
return preg_replace(
return (string) preg_replace(
['/</', '/>/', '/(-+[\w-]+)/'],
['[', ']', '<fg=blue;options=bold>$1</>'],
$argument
@ -95,12 +97,12 @@ final class Help implements HandlesArguments
/** @var array<string, array<int, array{arg: string, desc: string}>> $content */
$content = $helpReflection->getConstant('HELP_TEXT');
$content['Configuration'] = [[
$content['Configuration'] = [...[[
'arg' => '--init',
'desc' => 'Initialise a standard Pest configuration',
], $content['Configuration']];
]], ...$content['Configuration']];
$content['Selection'] = [
$content['Selection'] = array_merge([
[
'arg' => '--todos',
'desc' => 'Output to standard output the list of todos',
@ -109,7 +111,7 @@ final class Help implements HandlesArguments
'arg' => '--retry',
'desc' => 'Run non-passing tests first and stop execution upon first error or failure',
],
] + $content['Selection'];
], $content['Selection']);
$content['Reporting'] = [...$content['Reporting'], ...[
[

View File

@ -0,0 +1,42 @@
<?php
declare(strict_types=1);
namespace Pest\Subscribers;
use PHPUnit\Event\TestRunner\Started;
use PHPUnit\Event\TestRunner\StartedSubscriber;
use PHPUnit\Event\TestRunner\WarningTriggered;
use PHPUnit\TestRunner\TestResult\Collector;
use PHPUnit\TestRunner\TestResult\Facade;
use ReflectionClass;
/**
* @internal
*/
final class EnsureIgnorableTestCasesAreIgnored implements StartedSubscriber
{
/**
* Runs the subscriber.
*/
public function notify(Started $event): void
{
$reflection = new ReflectionClass(Facade::class);
$property = $reflection->getProperty('collector');
$property->setAccessible(true);
$collector = $property->getValue();
assert($collector instanceof Collector);
$reflection = new ReflectionClass($collector);
$property = $reflection->getProperty('testRunnerTriggeredWarningEvents');
$property->setAccessible(true);
/** @var array<int, WarningTriggered> $testRunnerTriggeredWarningEvents */
$testRunnerTriggeredWarningEvents = $property->getValue($collector);
$testRunnerTriggeredWarningEvents = array_values(array_filter($testRunnerTriggeredWarningEvents, fn (WarningTriggered $event): bool => $event->message() !== 'No tests found in class "Pest\TestCases\IgnorableTestCase".'));
$property->setValue($collector, $testRunnerTriggeredWarningEvents);
}
}

View File

@ -5,28 +5,31 @@
CONFIGURATION OPTIONS:
--init ............................ Initialise a standard Pest configuration
-c|--configuration <file> ....................... Read configuration from XML file
--bootstrap [file] ...... A PHP script that is included before the tests run
-c|--configuration [file] ................. Read configuration from XML file
--no-configuration ......... Ignore default configuration file (phpunit.xml)
--no-extensions ............................. Do not load PHPUnit extensions
--include-path <path(s)> ..... Prepend PHP's include_path with given path(s)
-d <key[=value]> ...................................... Sets a php.ini value
--cache-directory <dir> ................................. Specify cache directory
--include-path [path(s)] ..... Prepend PHP's include_path with given path(s)
-d [key[=value]] ...................................... Sets a php.ini value
--cache-directory [dir] ............................ Specify cache directory
--generate-configuration Generate configuration file with suggested settings
--migrate-configuration ....... Migrate configuration file to current format
SELECTION OPTIONS:
--todos ........................ Output to standard output the list of todos
--retry Run non-passing tests first and stop execution upon first error or failure
--exclude-testsuite <name> ........ Exclude tests from the specified test suite(s)
--list-suites ................................... List available test suites
--testsuite [name] ......... Only run tests from the specified test suite(s)
--exclude-testsuite [name] .. Exclude tests from the specified test suite(s)
--list-groups ................................... List available test groups
--group <name> ........................ Only run tests from the specified group(s)
--exclude-group <name> ................. Exclude tests from the specified group(s)
--covers <name> ............................. Only run tests that intend to cover <name>
--uses <name> ................................. Only run tests that intend to use <name>
--group [name] .................. Only run tests from the specified group(s)
--exclude-group [name] ........... Exclude tests from the specified group(s)
--covers [name] ................. Only run tests that intend to cover [name]
--uses [name] ..................... Only run tests that intend to use [name]
--list-tests .......................................... List available tests
--list-tests-xml <file> ....................... List available tests in XML format
--filter <pattern> ........................................ Filter which tests to run
--test-suffix <suffixes> Only search for test in files with specified suffix(es). Default: Test.php,.phpt
--list-tests-xml [file] ................. List available tests in XML format
--filter [pattern] ............................... Filter which tests to run
--test-suffix [suffixes] Only search for test in files with specified suffix(es). Default: Test.php,.phpt
EXECUTION OPTIONS:
--process-isolation ................ Run each test in a separate PHP process
@ -36,7 +39,7 @@
--strict-global-state .............. Be strict about changes to global state
--disallow-test-output ................. Be strict about output during tests
--enforce-time-limit ................. Enforce time limit based on test size
--default-time-limit <sec> Timeout in seconds for tests that have no declared size
--default-time-limit [sec] Timeout in seconds for tests that have no declared size
--dont-report-useless-tests .. Do not report tests that do not test anything
--stop-on-defect ................. Stop execution upon first not-passed test
--stop-on-error ............................ Stop execution upon first error
@ -51,12 +54,12 @@
--fail-on-warning .................... Treat tests with warnings as failures
--cache-result ............................ Write test results to cache file
--do-not-cache-result .............. Do not write test results to cache file
--order-by <order> Run tests in order: default|defects|depends|duration|no-depends|random|reverse|size
--random-order-seed <N> Use the specified random seed when running tests in random order
--order-by [order] Run tests in order: default|defects|depends|duration|no-depends|random|reverse|size
--random-order-seed [N] Use the specified random seed when running tests in random order
REPORTING OPTIONS:
--colors <flag> ............... Use colors in output ("never", "auto" or "always")
--columns <n> .................... Number of columns to use for progress output
--colors [flag] ......... Use colors in output ("never", "auto" or "always")
--columns [n] ................. Number of columns to use for progress output
--columns max ............ Use maximum number of columns for progress output
--stderr ................................. Write to STDERR instead of STDOUT
--no-progress .................... Disable output of test execution progress
@ -71,26 +74,29 @@
--reverse-list .............................. Print defects in reverse order
--teamcity . Replace default progress and result output with TeamCity format
--testdox ................ Replace default result output with TestDox format
--compact ................ Replace default result output with Compact format
LOGGING OPTIONS:
--log-junit <file> ................ Write test results in JUnit XML format to file
--log-teamcity <file> .............. Write test results in TeamCity format to file
--testdox-html <file> ........ Write test results in TestDox format (HTML) to file
--testdox-text <file> .. Write test results in TestDox format (plain text) to file
--log-events-text <file> ..................... Stream events as plain text to file
--log-events-verbose-text <file> Stream events as plain text (with telemetry information) to file
--log-junit [file] .......... Write test results in JUnit XML format to file
--log-teamcity [file] ........ Write test results in TeamCity format to file
--testdox-html [file] .. Write test results in TestDox format (HTML) to file
--testdox-text [file] Write test results in TestDox format (plain text) to file
--log-events-text [file] ............... Stream events as plain text to file
--log-events-verbose-text [file] Stream events as plain text (with telemetry information) to file
--no-logging ....... Ignore logging configured in the XML configuration file
CODE COVERAGE OPTIONS:
--coverage ..... Generate code coverage report and output to standard output
--coverage --min Set the minimum required coverage percentage, and fail if not met
--coverage-crap4j <file> . Write code coverage report in Crap4J XML format to file
--coverage-html <dir> .... Write code coverage report in HTML format to directory
--coverage-php <file> ................ Write serialized code coverage data to file
--coverage-text=<file> Write code coverage report in text format to file [default: standard output]
--coverage-xml <dir> ...... Write code coverage report in XML format to directory
--coverage-clover [file] Write code coverage report in Clover XML format to file
--coverage-cobertura [file] Write code coverage report in Cobertura XML format to file
--coverage-crap4j [file] Write code coverage report in Crap4J XML format to file
--coverage-html [dir] Write code coverage report in HTML format to directory
--coverage-php [file] .......... Write serialized code coverage data to file
--coverage-text=[file] Write code coverage report in text format to file [default: standard output]
--coverage-xml [dir] . Write code coverage report in XML format to directory
--warm-coverage-cache ........................... Warm static analysis cache
--coverage-filter <dir> ..................... Include <dir> in code coverage reporting
--coverage-filter [dir] ........... Include [dir] in code coverage reporting
--path-coverage .......... Report path coverage in addition to line coverage
--disable-coverage-ignore ...... Disable metadata for ignoring code coverage
--no-coverage Ignore code coverage reporting configured in the XML configuration file