mirror of
https://github.com/pestphp/pest.git
synced 2026-03-06 07:47:22 +01:00
chore(cleanup): Tidy-up and tweaks of Pest Parallel integration.
This commit is contained in:
File diff suppressed because one or more lines are too long
@ -7,7 +7,6 @@ use ParaTest\WrapperRunner\WrapperWorker;
|
|||||||
use Pest\ConfigLoader;
|
use Pest\ConfigLoader;
|
||||||
use Pest\Kernel;
|
use Pest\Kernel;
|
||||||
use Pest\Plugins\Actions\CallsHandleArguments;
|
use Pest\Plugins\Actions\CallsHandleArguments;
|
||||||
use Pest\TestCaseMethodFilters\TodoTestCaseFilter;
|
|
||||||
use Pest\TestSuite;
|
use Pest\TestSuite;
|
||||||
use Symfony\Component\Console\Input\ArgvInput;
|
use Symfony\Component\Console\Input\ArgvInput;
|
||||||
use Symfony\Component\Console\Output\ConsoleOutput;
|
use Symfony\Component\Console\Output\ConsoleOutput;
|
||||||
@ -15,7 +14,6 @@ use Symfony\Component\Console\Output\OutputInterface;
|
|||||||
|
|
||||||
$bootPest = (static function (): void {
|
$bootPest = (static function (): void {
|
||||||
$workerArgv = new ArgvInput();
|
$workerArgv = new ArgvInput();
|
||||||
$masterArgv = new ArgvInput(json_decode($_SERVER['PEST_PARALLEL_ARGV']));
|
|
||||||
|
|
||||||
$rootPath = dirname(PHPUNIT_COMPOSER_INSTALL, 2);
|
$rootPath = dirname(PHPUNIT_COMPOSER_INSTALL, 2);
|
||||||
$testSuite = TestSuite::getInstance($rootPath, $workerArgv->getParameterOption(
|
$testSuite = TestSuite::getInstance($rootPath, $workerArgv->getParameterOption(
|
||||||
@ -23,10 +21,6 @@ $bootPest = (static function (): void {
|
|||||||
(new ConfigLoader($rootPath))->getTestsDirectory()
|
(new ConfigLoader($rootPath))->getTestsDirectory()
|
||||||
));
|
));
|
||||||
|
|
||||||
if ($masterArgv->hasParameterOption('--todo')) {
|
|
||||||
$testSuite->tests->addTestCaseMethodFilter(new TodoTestCaseFilter());
|
|
||||||
}
|
|
||||||
|
|
||||||
$input = new ArgvInput();
|
$input = new ArgvInput();
|
||||||
|
|
||||||
$output = new ConsoleOutput(OutputInterface::VERBOSITY_NORMAL, true);
|
$output = new ConsoleOutput(OutputInterface::VERBOSITY_NORMAL, true);
|
||||||
|
|||||||
@ -4,7 +4,6 @@ declare(strict_types=1);
|
|||||||
|
|
||||||
namespace Pest\Plugins;
|
namespace Pest\Plugins;
|
||||||
|
|
||||||
use JsonException;
|
|
||||||
use ParaTest\ParaTestCommand;
|
use ParaTest\ParaTestCommand;
|
||||||
use Pest\Contracts\Plugins\HandlesArguments;
|
use Pest\Contracts\Plugins\HandlesArguments;
|
||||||
use Pest\Plugins\Actions\CallsAddsOutput;
|
use Pest\Plugins\Actions\CallsAddsOutput;
|
||||||
@ -30,6 +29,16 @@ final class Parallel implements HandlesArguments
|
|||||||
Parallel\Handlers\Laravel::class,
|
Parallel\Handlers\Laravel::class,
|
||||||
];
|
];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Whether the given command line arguments indicate that the test suite should be run in parallel.
|
||||||
|
*/
|
||||||
|
public static function isEnabled(): bool
|
||||||
|
{
|
||||||
|
$argv = new ArgvInput();
|
||||||
|
|
||||||
|
return $argv->hasParameterOption('--parallel') || $argv->hasParameterOption('-p');
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* If this code is running in a worker process rather than the main process.
|
* If this code is running in a worker process rather than the main process.
|
||||||
*/
|
*/
|
||||||
@ -47,7 +56,11 @@ final class Parallel implements HandlesArguments
|
|||||||
*/
|
*/
|
||||||
public function handleArguments(array $arguments): array
|
public function handleArguments(array $arguments): array
|
||||||
{
|
{
|
||||||
if ($this->argumentsContainParallelOptions($arguments)) {
|
if ($this->hasArgumentsThatWouldBeFasterWithoutParallel()) {
|
||||||
|
return $this->runTestSuiteInSeries($arguments);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (self::isEnabled()) {
|
||||||
exit($this->runTestSuiteInParallel($arguments));
|
exit($this->runTestSuiteInParallel($arguments));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -58,26 +71,10 @@ final class Parallel implements HandlesArguments
|
|||||||
return $arguments;
|
return $arguments;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Whether the given command line arguments indicate that the test suite should be run in parallel.
|
|
||||||
*
|
|
||||||
* @param array<int, string> $arguments
|
|
||||||
*/
|
|
||||||
private function argumentsContainParallelOptions(array $arguments): bool
|
|
||||||
{
|
|
||||||
if ($this->hasArgument('--parallel', $arguments)) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
return $this->hasArgument('-p', $arguments);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Runs the test suite in parallel. This method will exit the process upon completion.
|
* Runs the test suite in parallel. This method will exit the process upon completion.
|
||||||
*
|
*
|
||||||
* @param array<int, string> $arguments
|
* @param array<int, string> $arguments
|
||||||
*
|
|
||||||
* @throws JsonException
|
|
||||||
*/
|
*/
|
||||||
private function runTestSuiteInParallel(array $arguments): int
|
private function runTestSuiteInParallel(array $arguments): int
|
||||||
{
|
{
|
||||||
@ -87,8 +84,6 @@ final class Parallel implements HandlesArguments
|
|||||||
return Command::FAILURE;
|
return Command::FAILURE;
|
||||||
}
|
}
|
||||||
|
|
||||||
$_ENV['PEST_PARALLEL_ARGV'] = json_encode($_SERVER['argv'], JSON_THROW_ON_ERROR);
|
|
||||||
|
|
||||||
$handlers = array_filter(
|
$handlers = array_filter(
|
||||||
array_map(fn ($handler): object|string => Container::getInstance()->get($handler), self::HANDLERS),
|
array_map(fn ($handler): object|string => Container::getInstance()->get($handler), self::HANDLERS),
|
||||||
fn ($handler): bool => $handler instanceof HandlesArguments,
|
fn ($handler): bool => $handler instanceof HandlesArguments,
|
||||||
@ -154,4 +149,35 @@ final class Parallel implements HandlesArguments
|
|||||||
|
|
||||||
return $command;
|
return $command;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Whether the command line arguments contain any arguments that are
|
||||||
|
* not supported or are suboptimal when running in parallel.
|
||||||
|
*/
|
||||||
|
private function hasArgumentsThatWouldBeFasterWithoutParallel(): bool
|
||||||
|
{
|
||||||
|
$unsupportedArguments = ['--todo', '--retry'];
|
||||||
|
$arguments = new ArgvInput();
|
||||||
|
|
||||||
|
foreach ($unsupportedArguments as $unsupportedArgument) {
|
||||||
|
if ($arguments->hasParameterOption($unsupportedArgument)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Removes any parallel arguments.
|
||||||
|
*
|
||||||
|
* @param array<int, string> $arguments
|
||||||
|
* @return array<int, string>
|
||||||
|
*/
|
||||||
|
private function runTestSuiteInSeries(array $arguments): array
|
||||||
|
{
|
||||||
|
$arguments = $this->popArgument('--parallel', $arguments);
|
||||||
|
|
||||||
|
return $this->popArgument('-p', $arguments);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -5,7 +5,6 @@ declare(strict_types=1);
|
|||||||
namespace Pest\Plugins;
|
namespace Pest\Plugins;
|
||||||
|
|
||||||
use Pest\Contracts\Plugins\HandlesArguments;
|
use Pest\Contracts\Plugins\HandlesArguments;
|
||||||
use Pest\Exceptions\InvalidOption;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @internal
|
* @internal
|
||||||
@ -19,18 +18,16 @@ final class Retry implements HandlesArguments
|
|||||||
*/
|
*/
|
||||||
public function handleArguments(array $arguments): array
|
public function handleArguments(array $arguments): array
|
||||||
{
|
{
|
||||||
if ($this->hasArgument('--retry', $arguments)) {
|
if (! $this->hasArgument('--retry', $arguments)) {
|
||||||
if ($this->hasArgument('--parallel', $arguments)) {
|
return $arguments;
|
||||||
throw new InvalidOption('The --retry option is not supported when running in parallel.');
|
|
||||||
}
|
|
||||||
|
|
||||||
$arguments = $this->popArgument('--retry', $arguments);
|
|
||||||
|
|
||||||
$arguments = $this->pushArgument('--order-by=defects', $arguments);
|
|
||||||
|
|
||||||
$arguments = $this->pushArgument('--stop-on-failure', $arguments);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$arguments = $this->popArgument('--retry', $arguments);
|
||||||
|
|
||||||
|
$arguments = $this->pushArgument('--order-by=defects', $arguments);
|
||||||
|
|
||||||
|
$arguments = $this->pushArgument('--stop-on-failure', $arguments);
|
||||||
|
|
||||||
return $arguments;
|
return $arguments;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user