mirror of
https://github.com/pestphp/pest.git
synced 2026-04-20 22:20:17 +02:00
Merge pull request #1655 from stsepelin/fix/parallel-empty-suite-reporting
fix: nested dataset discovery and parallel invalid-dataset reporting
This commit is contained in:
@ -170,6 +170,14 @@ final class ResultPrinter
|
|||||||
|
|
||||||
$state = (new StateGenerator)->fromPhpUnitTestResult($this->passedTests, $testResult);
|
$state = (new StateGenerator)->fromPhpUnitTestResult($this->passedTests, $testResult);
|
||||||
|
|
||||||
|
if ($testResult->numberOfTestsRun() === 0 && $state->testSuiteTestsCount() === 0) {
|
||||||
|
$this->output->writeln([
|
||||||
|
'',
|
||||||
|
' <fg=white;options=bold;bg=blue> INFO </> No tests found.',
|
||||||
|
'',
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
$this->compactPrinter->errors($state);
|
$this->compactPrinter->errors($state);
|
||||||
$this->compactPrinter->recap($state, $testResult, $duration, $this->options);
|
$this->compactPrinter->recap($state, $testResult, $duration, $this->options);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -39,6 +39,7 @@ use function dirname;
|
|||||||
use function file_get_contents;
|
use function file_get_contents;
|
||||||
use function max;
|
use function max;
|
||||||
use function realpath;
|
use function realpath;
|
||||||
|
use function str_starts_with;
|
||||||
use function unlink;
|
use function unlink;
|
||||||
use function unserialize;
|
use function unserialize;
|
||||||
use function usleep;
|
use function usleep;
|
||||||
@ -492,14 +493,52 @@ final class WrapperRunner implements RunnerInterface
|
|||||||
private function getTestFiles(SuiteLoader $suiteLoader): array
|
private function getTestFiles(SuiteLoader $suiteLoader): array
|
||||||
{
|
{
|
||||||
/** @var array<string, non-empty-string> $files */
|
/** @var array<string, non-empty-string> $files */
|
||||||
$files = [
|
$files = array_fill_keys(array_values(array_filter(
|
||||||
...array_values(array_filter(
|
$suiteLoader->tests,
|
||||||
$suiteLoader->tests,
|
fn (string $filename): bool => ! str_ends_with($filename, "eval()'d code")
|
||||||
fn (string $filename): bool => ! str_ends_with($filename, "eval()'d code")
|
)), null);
|
||||||
)),
|
|
||||||
...TestSuite::getInstance()->tests->getFilenames(),
|
|
||||||
];
|
|
||||||
|
|
||||||
return $files; // @phpstan-ignore-line
|
foreach (TestSuite::getInstance()->tests->getFilenames() as $filename) {
|
||||||
|
if ($this->shouldIncludeBootstrappedTestFile($filename)) {
|
||||||
|
$files[$filename] = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return array_keys($files); // @phpstan-ignore-line
|
||||||
|
}
|
||||||
|
|
||||||
|
private function shouldIncludeBootstrappedTestFile(string $filename): bool
|
||||||
|
{
|
||||||
|
if (! $this->options->configuration->hasCliArguments()) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
$resolvedFilename = realpath($filename);
|
||||||
|
|
||||||
|
if ($resolvedFilename === false) {
|
||||||
|
$resolvedFilename = realpath($this->options->cwd.DIRECTORY_SEPARATOR.$filename);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($resolvedFilename === false) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach ($this->options->configuration->cliArguments() as $path) {
|
||||||
|
$resolvedPath = realpath($path);
|
||||||
|
|
||||||
|
if ($resolvedPath === false) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($resolvedFilename === $resolvedPath) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (is_dir($resolvedPath) && str_starts_with($resolvedFilename, $resolvedPath.DIRECTORY_SEPARATOR)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -17,7 +17,7 @@ final class DatasetInfo
|
|||||||
|
|
||||||
public static function isInsideADatasetsDirectory(string $file): bool
|
public static function isInsideADatasetsDirectory(string $file): bool
|
||||||
{
|
{
|
||||||
return basename(dirname($file)) === self::DATASETS_DIR_NAME;
|
return in_array(self::DATASETS_DIR_NAME, self::directorySegmentsInsideTestsDirectory($file), true);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static function isADatasetsFile(string $file): bool
|
public static function isADatasetsFile(string $file): bool
|
||||||
@ -32,7 +32,23 @@ final class DatasetInfo
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (self::isInsideADatasetsDirectory($file)) {
|
if (self::isInsideADatasetsDirectory($file)) {
|
||||||
return dirname($file, 2);
|
$scope = [];
|
||||||
|
|
||||||
|
foreach (self::directorySegmentsInsideTestsDirectory($file) as $segment) {
|
||||||
|
if ($segment === self::DATASETS_DIR_NAME) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
$scope[] = $segment;
|
||||||
|
}
|
||||||
|
|
||||||
|
$testsDirectoryPath = self::testsDirectoryPath($file);
|
||||||
|
|
||||||
|
if ($scope === []) {
|
||||||
|
return $testsDirectoryPath;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $testsDirectoryPath.DIRECTORY_SEPARATOR.implode(DIRECTORY_SEPARATOR, $scope);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (self::isADatasetsFile($file)) {
|
if (self::isADatasetsFile($file)) {
|
||||||
@ -41,4 +57,45 @@ final class DatasetInfo
|
|||||||
|
|
||||||
return $file;
|
return $file;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return list<string>
|
||||||
|
*/
|
||||||
|
private static function directorySegmentsInsideTestsDirectory(string $file): array
|
||||||
|
{
|
||||||
|
$directory = dirname(self::pathInsideTestsDirectory($file));
|
||||||
|
|
||||||
|
if ($directory === '.' || $directory === DIRECTORY_SEPARATOR) {
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
|
||||||
|
return array_values(array_filter(
|
||||||
|
explode(DIRECTORY_SEPARATOR, trim($directory, DIRECTORY_SEPARATOR)),
|
||||||
|
static fn (string $segment): bool => $segment !== '',
|
||||||
|
));
|
||||||
|
}
|
||||||
|
|
||||||
|
private static function pathInsideTestsDirectory(string $file): string
|
||||||
|
{
|
||||||
|
$testsDirectory = DIRECTORY_SEPARATOR.trim(testDirectory(), DIRECTORY_SEPARATOR).DIRECTORY_SEPARATOR;
|
||||||
|
$position = strrpos($file, $testsDirectory);
|
||||||
|
|
||||||
|
if ($position === false) {
|
||||||
|
return $file;
|
||||||
|
}
|
||||||
|
|
||||||
|
return substr($file, $position + strlen($testsDirectory));
|
||||||
|
}
|
||||||
|
|
||||||
|
private static function testsDirectoryPath(string $file): string
|
||||||
|
{
|
||||||
|
$testsDirectory = DIRECTORY_SEPARATOR.trim(testDirectory(), DIRECTORY_SEPARATOR).DIRECTORY_SEPARATOR;
|
||||||
|
$position = strrpos($file, $testsDirectory);
|
||||||
|
|
||||||
|
if ($position === false) {
|
||||||
|
return dirname($file);
|
||||||
|
}
|
||||||
|
|
||||||
|
return substr($file, 0, $position + strlen($testsDirectory) - 1);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -11,6 +11,10 @@ use PHPUnit\Event\Code\TestDoxBuilder;
|
|||||||
use PHPUnit\Event\Code\TestMethod;
|
use PHPUnit\Event\Code\TestMethod;
|
||||||
use PHPUnit\Event\Code\ThrowableBuilder;
|
use PHPUnit\Event\Code\ThrowableBuilder;
|
||||||
use PHPUnit\Event\Test\Errored;
|
use PHPUnit\Event\Test\Errored;
|
||||||
|
use PHPUnit\Event\Test\PhpunitDeprecationTriggered;
|
||||||
|
use PHPUnit\Event\Test\PhpunitErrorTriggered;
|
||||||
|
use PHPUnit\Event\Test\PhpunitNoticeTriggered;
|
||||||
|
use PHPUnit\Event\Test\PhpunitWarningTriggered;
|
||||||
use PHPUnit\Event\TestData\TestDataCollection;
|
use PHPUnit\Event\TestData\TestDataCollection;
|
||||||
use PHPUnit\Framework\SkippedWithMessageException;
|
use PHPUnit\Framework\SkippedWithMessageException;
|
||||||
use PHPUnit\Metadata\MetadataCollection;
|
use PHPUnit\Metadata\MetadataCollection;
|
||||||
@ -43,6 +47,8 @@ final class StateGenerator
|
|||||||
));
|
));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$this->addTriggeredPhpunitEvents($state, $testResult->testTriggeredPhpunitErrorEvents(), TestResult::FAIL);
|
||||||
|
|
||||||
foreach ($testResult->testMarkedIncompleteEvents() as $testResultEvent) {
|
foreach ($testResult->testMarkedIncompleteEvents() as $testResultEvent) {
|
||||||
$state->add(TestResult::fromPestParallelTestCase(
|
$state->add(TestResult::fromPestParallelTestCase(
|
||||||
$testResultEvent->test(),
|
$testResultEvent->test(),
|
||||||
@ -99,6 +105,8 @@ final class StateGenerator
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$this->addTriggeredPhpunitEvents($state, $testResult->testTriggeredPhpunitDeprecationEvents(), TestResult::DEPRECATED);
|
||||||
|
|
||||||
foreach ($testResult->notices() as $testResultEvent) {
|
foreach ($testResult->notices() as $testResultEvent) {
|
||||||
foreach ($testResultEvent->triggeringTests() as $triggeringTest) {
|
foreach ($testResultEvent->triggeringTests() as $triggeringTest) {
|
||||||
['test' => $test] = $triggeringTest;
|
['test' => $test] = $triggeringTest;
|
||||||
@ -123,6 +131,8 @@ final class StateGenerator
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$this->addTriggeredPhpunitEvents($state, $testResult->testTriggeredPhpunitNoticeEvents(), TestResult::NOTICE);
|
||||||
|
|
||||||
foreach ($testResult->warnings() as $testResultEvent) {
|
foreach ($testResult->warnings() as $testResultEvent) {
|
||||||
foreach ($testResultEvent->triggeringTests() as $triggeringTest) {
|
foreach ($testResultEvent->triggeringTests() as $triggeringTest) {
|
||||||
['test' => $test] = $triggeringTest;
|
['test' => $test] = $triggeringTest;
|
||||||
@ -135,6 +145,8 @@ final class StateGenerator
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$this->addTriggeredPhpunitEvents($state, $testResult->testTriggeredPhpunitWarningEvents(), TestResult::WARN);
|
||||||
|
|
||||||
foreach ($testResult->phpWarnings() as $testResultEvent) {
|
foreach ($testResult->phpWarnings() as $testResultEvent) {
|
||||||
foreach ($testResultEvent->triggeringTests() as $triggeringTest) {
|
foreach ($testResultEvent->triggeringTests() as $triggeringTest) {
|
||||||
['test' => $test] = $triggeringTest;
|
['test' => $test] = $triggeringTest;
|
||||||
@ -165,4 +177,20 @@ final class StateGenerator
|
|||||||
|
|
||||||
return $state;
|
return $state;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param array<string, list<PhpunitDeprecationTriggered|PhpunitErrorTriggered|PhpunitNoticeTriggered|PhpunitWarningTriggered>> $testResultEvents
|
||||||
|
*/
|
||||||
|
private function addTriggeredPhpunitEvents(State $state, array $testResultEvents, string $type): void
|
||||||
|
{
|
||||||
|
foreach ($testResultEvents as $events) {
|
||||||
|
foreach ($events as $event) {
|
||||||
|
$state->add(TestResult::fromPestParallelTestCase(
|
||||||
|
$event->test(),
|
||||||
|
$type,
|
||||||
|
ThrowableBuilder::from(new TestOutcome($event->message()))
|
||||||
|
));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1490,6 +1490,10 @@
|
|||||||
PASS Tests\Fixtures\ExampleTest
|
PASS Tests\Fixtures\ExampleTest
|
||||||
✓ it example 2
|
✓ it example 2
|
||||||
|
|
||||||
|
PASS Tests\Fixtures\ParallelNestedDatasets\TestFileWithNestedDataset
|
||||||
|
✓ loads nested dataset with ('alice')
|
||||||
|
✓ loads nested dataset with ('bob')
|
||||||
|
|
||||||
WARN Tests\Fixtures\UnexpectedOutput
|
WARN Tests\Fixtures\UnexpectedOutput
|
||||||
- output
|
- output
|
||||||
|
|
||||||
@ -1640,9 +1644,14 @@
|
|||||||
✓ it cannot resolve a parameter without type
|
✓ it cannot resolve a parameter without type
|
||||||
|
|
||||||
PASS Tests\Unit\Support\DatasetInfo
|
PASS Tests\Unit\Support\DatasetInfo
|
||||||
✓ it can check if dataset is defined inside a Datasets directory with ('/var/www/project/tests/Datase…rs.php', true)
|
✓ it can check if dataset is defined inside a Datasets directory with ('/var/www/Datasets/project/tes…rs.php', true) #1
|
||||||
|
✓ it can check if dataset is defined inside a Datasets directory with ('/var/www/Datasets/project/tes…rs.php', true) #2
|
||||||
|
✓ it can check if dataset is defined inside a Datasets directory with ('/var/www/project/tests/Datase…rs.php', true) #1
|
||||||
|
✓ it can check if dataset is defined inside a Datasets directory with ('/var/www/project/tests/Datase…rs.php', true) #2
|
||||||
✓ it can check if dataset is defined inside a Datasets directory with ('/var/www/project/tests/Datasets.php', false)
|
✓ it can check if dataset is defined inside a Datasets directory with ('/var/www/project/tests/Datasets.php', false)
|
||||||
✓ it can check if dataset is defined inside a Datasets directory with ('/var/www/project/tests/Featur…rs.php', true)
|
✓ it can check if dataset is defined inside a Datasets directory with ('/var/www/project/tests/Featur…rs.php', true) #1
|
||||||
|
✓ it can check if dataset is defined inside a Datasets directory with ('/var/www/project/tests/Featur…rs.php', true) #2
|
||||||
|
✓ it can check if dataset is defined inside a Datasets directory with ('/var/www/project/tests/Featur…rs.php', true) #3
|
||||||
✓ it can check if dataset is defined inside a Datasets directory with ('/var/www/project/tests/Featur…rs.php', false)
|
✓ it can check if dataset is defined inside a Datasets directory with ('/var/www/project/tests/Featur…rs.php', false)
|
||||||
✓ it can check if dataset is defined inside a Datasets directory with ('/var/www/project/tests/Featur…ts.php', false)
|
✓ it can check if dataset is defined inside a Datasets directory with ('/var/www/project/tests/Featur…ts.php', false)
|
||||||
✓ it can check if dataset is defined inside a Datasets.php file with ('/var/www/project/tests/Datase…rs.php', false)
|
✓ it can check if dataset is defined inside a Datasets.php file with ('/var/www/project/tests/Datase…rs.php', false)
|
||||||
@ -1650,12 +1659,18 @@
|
|||||||
✓ it can check if dataset is defined inside a Datasets.php file with ('/var/www/project/tests/Featur…rs.php', false) #1
|
✓ it can check if dataset is defined inside a Datasets.php file with ('/var/www/project/tests/Featur…rs.php', false) #1
|
||||||
✓ it can check if dataset is defined inside a Datasets.php file with ('/var/www/project/tests/Featur…rs.php', false) #2
|
✓ it can check if dataset is defined inside a Datasets.php file with ('/var/www/project/tests/Featur…rs.php', false) #2
|
||||||
✓ it can check if dataset is defined inside a Datasets.php file with ('/var/www/project/tests/Featur…ts.php', true)
|
✓ it can check if dataset is defined inside a Datasets.php file with ('/var/www/project/tests/Featur…ts.php', true)
|
||||||
✓ it computes the dataset scope with ('/var/www/project/tests/Datase…rs.php', '/var/www/project/tests')
|
✓ it computes the dataset scope with ('/var/www/Datasets/project/tes…rs.php', '/var/www/Datasets/project/tests')
|
||||||
|
✓ it computes the dataset scope with ('/var/www/Datasets/project/tes…rs.php', '/var/www/Datasets/project/tes…atures')
|
||||||
|
✓ it computes the dataset scope with ('/var/www/project/tests/Datase…rs.php', '/var/www/project/tests') #1
|
||||||
|
✓ it computes the dataset scope with ('/var/www/project/tests/Datase…rs.php', '/var/www/project/tests') #2
|
||||||
✓ it computes the dataset scope with ('/var/www/project/tests/Datasets.php', '/var/www/project/tests')
|
✓ it computes the dataset scope with ('/var/www/project/tests/Datasets.php', '/var/www/project/tests')
|
||||||
✓ it computes the dataset scope with ('/var/www/project/tests/Featur…rs.php', '/var/www/project/tests/Features')
|
✓ it computes the dataset scope with ('/var/www/project/tests/Featur…rs.php', '/var/www/project/tests/Features') #1
|
||||||
|
✓ it computes the dataset scope with ('/var/www/project/tests/Featur…rs.php', '/var/www/project/tests/Features') #2
|
||||||
✓ it computes the dataset scope with ('/var/www/project/tests/Featur…rs.php', '/var/www/project/tests/Featur…rs.php') #1
|
✓ it computes the dataset scope with ('/var/www/project/tests/Featur…rs.php', '/var/www/project/tests/Featur…rs.php') #1
|
||||||
✓ it computes the dataset scope with ('/var/www/project/tests/Featur…ts.php', '/var/www/project/tests/Features')
|
✓ it computes the dataset scope with ('/var/www/project/tests/Featur…ts.php', '/var/www/project/tests/Features')
|
||||||
✓ it computes the dataset scope with ('/var/www/project/tests/Featur…rs.php', '/var/www/project/tests/Featur…ollers')
|
✓ it computes the dataset scope with ('/var/www/project/tests/Featur…rs.php', '/var/www/project/tests/Featur…ollers') #1
|
||||||
|
✓ it computes the dataset scope with ('/var/www/project/tests/Featur…rs.php', '/var/www/project/tests/Featur…ollers') #2
|
||||||
|
✓ it computes the dataset scope with ('/var/www/project/tests/Featur…rs.php', '/var/www/project/tests/Features') #3
|
||||||
✓ it computes the dataset scope with ('/var/www/project/tests/Featur…rs.php', '/var/www/project/tests/Featur…rs.php') #2
|
✓ it computes the dataset scope with ('/var/www/project/tests/Featur…rs.php', '/var/www/project/tests/Featur…rs.php') #2
|
||||||
✓ it computes the dataset scope with ('/var/www/project/tests/Featur…ts.php', '/var/www/project/tests/Featur…ollers')
|
✓ it computes the dataset scope with ('/var/www/project/tests/Featur…ts.php', '/var/www/project/tests/Featur…ollers')
|
||||||
|
|
||||||
@ -1756,6 +1771,10 @@
|
|||||||
PASS Tests\Visual\Parallel
|
PASS Tests\Visual\Parallel
|
||||||
✓ parallel
|
✓ parallel
|
||||||
✓ a parallel test can extend another test with same name
|
✓ a parallel test can extend another test with same name
|
||||||
|
✓ parallel reports invalid datasets as failures
|
||||||
|
|
||||||
|
PASS Tests\Visual\ParallelNestedDatasets
|
||||||
|
✓ parallel loads nested datasets from nested directories
|
||||||
|
|
||||||
PASS Tests\Visual\SingleTestOrDirectory
|
PASS Tests\Visual\SingleTestOrDirectory
|
||||||
✓ allows to run a single test
|
✓ allows to run a single test
|
||||||
@ -1782,4 +1801,4 @@
|
|||||||
✓ pass with dataset with ('my-datas-set-value')
|
✓ pass with dataset with ('my-datas-set-value')
|
||||||
✓ within describe → pass with dataset with ('my-datas-set-value')
|
✓ within describe → pass with dataset with ('my-datas-set-value')
|
||||||
|
|
||||||
Tests: 2 deprecated, 4 warnings, 5 incomplete, 2 notices, 39 todos, 35 skipped, 1188 passed (2813 assertions)
|
Tests: 2 deprecated, 4 warnings, 5 incomplete, 2 notices, 39 todos, 35 skipped, 1203 passed (2835 assertions)
|
||||||
@ -0,0 +1,5 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
test('missing dataset', function (string $value) {
|
||||||
|
expect($value)->toBe('x');
|
||||||
|
})->with('missing.dataset');
|
||||||
3
tests/.tests/ParallelInvalidDataset/PassingTest.php
Normal file
3
tests/.tests/ParallelInvalidDataset/PassingTest.php
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
it('passes')->assertTrue(true);
|
||||||
@ -0,0 +1,6 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
dataset('nested.users', [
|
||||||
|
['alice'],
|
||||||
|
['bob'],
|
||||||
|
]);
|
||||||
@ -0,0 +1,5 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
test('loads nested dataset', function (string $name) {
|
||||||
|
expect($name)->not->toBeEmpty();
|
||||||
|
})->with('nested.users');
|
||||||
@ -5,9 +5,14 @@ use Pest\Support\DatasetInfo;
|
|||||||
it('can check if dataset is defined inside a Datasets directory', function (string $file, bool $inside) {
|
it('can check if dataset is defined inside a Datasets directory', function (string $file, bool $inside) {
|
||||||
expect(DatasetInfo::isInsideADatasetsDirectory($file))->toBe($inside);
|
expect(DatasetInfo::isInsideADatasetsDirectory($file))->toBe($inside);
|
||||||
})->with([
|
})->with([
|
||||||
|
['file' => '/var/www/Datasets/project/tests/Datasets/Nested/Numbers.php', 'inside' => true],
|
||||||
|
['file' => '/var/www/Datasets/project/tests/Features/Datasets/Nested/Numbers.php', 'inside' => true],
|
||||||
['file' => '/var/www/project/tests/Datasets/Numbers.php', 'inside' => true],
|
['file' => '/var/www/project/tests/Datasets/Numbers.php', 'inside' => true],
|
||||||
|
['file' => '/var/www/project/tests/Datasets/Nested/Numbers.php', 'inside' => true],
|
||||||
['file' => '/var/www/project/tests/Datasets.php', 'inside' => false],
|
['file' => '/var/www/project/tests/Datasets.php', 'inside' => false],
|
||||||
['file' => '/var/www/project/tests/Features/Datasets/Numbers.php', 'inside' => true],
|
['file' => '/var/www/project/tests/Features/Datasets/Numbers.php', 'inside' => true],
|
||||||
|
['file' => '/var/www/project/tests/Features/Datasets/Nested/Numbers.php', 'inside' => true],
|
||||||
|
['file' => '/var/www/project/tests/Features/Datasets/Nested/Datasets/Numbers.php', 'inside' => true],
|
||||||
['file' => '/var/www/project/tests/Features/Numbers.php', 'inside' => false],
|
['file' => '/var/www/project/tests/Features/Numbers.php', 'inside' => false],
|
||||||
['file' => '/var/www/project/tests/Features/Datasets.php', 'inside' => false],
|
['file' => '/var/www/project/tests/Features/Datasets.php', 'inside' => false],
|
||||||
]);
|
]);
|
||||||
@ -25,12 +30,18 @@ it('can check if dataset is defined inside a Datasets.php file', function (strin
|
|||||||
it('computes the dataset scope', function (string $file, string $scope) {
|
it('computes the dataset scope', function (string $file, string $scope) {
|
||||||
expect(DatasetInfo::scope($file))->toBe($scope);
|
expect(DatasetInfo::scope($file))->toBe($scope);
|
||||||
})->with([
|
})->with([
|
||||||
|
['file' => '/var/www/Datasets/project/tests/Datasets/Nested/Numbers.php', 'scope' => '/var/www/Datasets/project/tests'],
|
||||||
|
['file' => '/var/www/Datasets/project/tests/Features/Datasets/Nested/Numbers.php', 'scope' => '/var/www/Datasets/project/tests/Features'],
|
||||||
['file' => '/var/www/project/tests/Datasets/Numbers.php', 'scope' => '/var/www/project/tests'],
|
['file' => '/var/www/project/tests/Datasets/Numbers.php', 'scope' => '/var/www/project/tests'],
|
||||||
|
['file' => '/var/www/project/tests/Datasets/Nested/Numbers.php', 'scope' => '/var/www/project/tests'],
|
||||||
['file' => '/var/www/project/tests/Datasets.php', 'scope' => '/var/www/project/tests'],
|
['file' => '/var/www/project/tests/Datasets.php', 'scope' => '/var/www/project/tests'],
|
||||||
['file' => '/var/www/project/tests/Features/Datasets/Numbers.php', 'scope' => '/var/www/project/tests/Features'],
|
['file' => '/var/www/project/tests/Features/Datasets/Numbers.php', 'scope' => '/var/www/project/tests/Features'],
|
||||||
|
['file' => '/var/www/project/tests/Features/Datasets/Nested/Numbers.php', 'scope' => '/var/www/project/tests/Features'],
|
||||||
['file' => '/var/www/project/tests/Features/Numbers.php', 'scope' => '/var/www/project/tests/Features/Numbers.php'],
|
['file' => '/var/www/project/tests/Features/Numbers.php', 'scope' => '/var/www/project/tests/Features/Numbers.php'],
|
||||||
['file' => '/var/www/project/tests/Features/Datasets.php', 'scope' => '/var/www/project/tests/Features'],
|
['file' => '/var/www/project/tests/Features/Datasets.php', 'scope' => '/var/www/project/tests/Features'],
|
||||||
['file' => '/var/www/project/tests/Features/Controllers/Datasets/Numbers.php', 'scope' => '/var/www/project/tests/Features/Controllers'],
|
['file' => '/var/www/project/tests/Features/Controllers/Datasets/Numbers.php', 'scope' => '/var/www/project/tests/Features/Controllers'],
|
||||||
|
['file' => '/var/www/project/tests/Features/Controllers/Datasets/Nested/Numbers.php', 'scope' => '/var/www/project/tests/Features/Controllers'],
|
||||||
|
['file' => '/var/www/project/tests/Features/Datasets/Nested/Datasets/Numbers.php', 'scope' => '/var/www/project/tests/Features'],
|
||||||
['file' => '/var/www/project/tests/Features/Controllers/Numbers.php', 'scope' => '/var/www/project/tests/Features/Controllers/Numbers.php'],
|
['file' => '/var/www/project/tests/Features/Controllers/Numbers.php', 'scope' => '/var/www/project/tests/Features/Controllers/Numbers.php'],
|
||||||
['file' => '/var/www/project/tests/Features/Controllers/Datasets.php', 'scope' => '/var/www/project/tests/Features/Controllers'],
|
['file' => '/var/www/project/tests/Features/Controllers/Datasets.php', 'scope' => '/var/www/project/tests/Features/Controllers'],
|
||||||
]);
|
]);
|
||||||
|
|||||||
@ -16,10 +16,17 @@ $run = function () {
|
|||||||
|
|
||||||
test('parallel', function () use ($run) {
|
test('parallel', function () use ($run) {
|
||||||
expect($run('--exclude-group=integration'))
|
expect($run('--exclude-group=integration'))
|
||||||
->toContain('Tests: 2 deprecated, 4 warnings, 5 incomplete, 2 notices, 39 todos, 26 skipped, 1177 passed (2789 assertions)')
|
->toContain('Tests: 2 deprecated, 4 warnings, 5 incomplete, 3 notices, 39 todos, 26 skipped, 1190 passed (2802 assertions)')
|
||||||
->toContain('Parallel: 3 processes');
|
->toContain('Parallel: 3 processes');
|
||||||
})->skipOnWindows();
|
})->skipOnWindows();
|
||||||
|
|
||||||
test('a parallel test can extend another test with same name', function () use ($run) {
|
test('a parallel test can extend another test with same name', function () use ($run) {
|
||||||
expect($run('tests/Fixtures/Inheritance'))->toContain('Tests: 1 skipped, 2 passed (2 assertions)');
|
expect($run('tests/Fixtures/Inheritance'))->toContain('Tests: 1 skipped, 1 passed (1 assertions)');
|
||||||
});
|
})->skipOnWindows();
|
||||||
|
|
||||||
|
test('parallel reports invalid datasets as failures', function () use ($run) {
|
||||||
|
expect($run('tests/.tests/ParallelInvalidDataset'))
|
||||||
|
->toContain("A dataset with the name `missing.dataset` does not exist. You can create it using `dataset('missing.dataset', ['a', 'b']);`.")
|
||||||
|
->toContain('Tests: 1 failed, 1 passed (1 assertions)')
|
||||||
|
->toContain('Parallel: 3 processes');
|
||||||
|
})->skipOnWindows();
|
||||||
|
|||||||
40
tests/Visual/ParallelNestedDatasets.php
Normal file
40
tests/Visual/ParallelNestedDatasets.php
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
use Symfony\Component\Process\Process;
|
||||||
|
|
||||||
|
$run = function (bool $parallel = false): array {
|
||||||
|
$command = [
|
||||||
|
'php',
|
||||||
|
'bin/pest',
|
||||||
|
'tests/Fixtures/ParallelNestedDatasets/TestFileWithNestedDataset.php',
|
||||||
|
'--colors=never',
|
||||||
|
];
|
||||||
|
|
||||||
|
if ($parallel) {
|
||||||
|
$command[] = '--parallel';
|
||||||
|
$command[] = '--processes=2';
|
||||||
|
}
|
||||||
|
|
||||||
|
$process = new Process($command, dirname(__DIR__, 2),
|
||||||
|
['COLLISION_PRINTER' => 'DefaultPrinter', 'COLLISION_IGNORE_DURATION' => 'true'],
|
||||||
|
);
|
||||||
|
|
||||||
|
$process->run();
|
||||||
|
|
||||||
|
return [
|
||||||
|
'exitCode' => $process->getExitCode(),
|
||||||
|
'output' => removeAnsiEscapeSequences($process->getOutput().$process->getErrorOutput()),
|
||||||
|
];
|
||||||
|
};
|
||||||
|
|
||||||
|
test('parallel loads nested datasets from nested directories', function () use ($run) {
|
||||||
|
$serial = $run();
|
||||||
|
$parallel = $run(true);
|
||||||
|
|
||||||
|
expect($serial['exitCode'])->toBe(0)
|
||||||
|
->and($parallel['exitCode'])->toBe(0)
|
||||||
|
->and($serial['output'])->toContain('Tests: 2 passed (2 assertions)')
|
||||||
|
->and($parallel['output'])->toContain('Tests: 2 passed (2 assertions)')
|
||||||
|
->and($parallel['output'])->toContain('Parallel: 2 processes')
|
||||||
|
->and($parallel['output'])->not->toContain('No tests found.');
|
||||||
|
})->skipOnWindows();
|
||||||
@ -12,7 +12,7 @@ test('visual snapshot of test suite on success', function () {
|
|||||||
|
|
||||||
$output = function () use ($testsPath) {
|
$output = function () use ($testsPath) {
|
||||||
$process = (new Process(
|
$process = (new Process(
|
||||||
['php', 'bin/pest'],
|
['php', '-d', 'memory_limit=256M', 'bin/pest'],
|
||||||
dirname($testsPath),
|
dirname($testsPath),
|
||||||
['EXCLUDE' => 'integration', '--exclude-group' => 'integration', 'REBUILD_SNAPSHOTS' => false, 'PARATEST' => 0, 'COLLISION_PRINTER' => 'DefaultPrinter', 'COLLISION_IGNORE_DURATION' => 'true'],
|
['EXCLUDE' => 'integration', '--exclude-group' => 'integration', 'REBUILD_SNAPSHOTS' => false, 'PARATEST' => 0, 'COLLISION_PRINTER' => 'DefaultPrinter', 'COLLISION_IGNORE_DURATION' => 'true'],
|
||||||
));
|
));
|
||||||
|
|||||||
Reference in New Issue
Block a user