Fix parallel dataset reporting and nested fixtures

This commit is contained in:
Aleksandr Štšepelin
2026-03-25 23:59:29 +02:00
parent 07737bc0b2
commit f7175ecfd7
11 changed files with 165 additions and 121 deletions

View File

@ -16,10 +16,17 @@ $run = function () {
test('parallel', function () use ($run) {
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');
})->skipOnWindows();
test('a parallel test can extend another test with same name', function () use ($run) {
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();

View File

@ -2,58 +2,13 @@
use Symfony\Component\Process\Process;
$fixture = function (): array {
$directory = dirname(__DIR__).DIRECTORY_SEPARATOR.'Features'.DIRECTORY_SEPARATOR.'ParallelNestedDatasetRepro';
$datasetsDirectory = $directory.DIRECTORY_SEPARATOR.'Datasets'.DIRECTORY_SEPARATOR.'Nested';
$target = $directory.DIRECTORY_SEPARATOR.'TestFileWithNestedDataset.php';
if (! is_dir($datasetsDirectory)) {
mkdir($datasetsDirectory, 0777, true);
}
file_put_contents($datasetsDirectory.DIRECTORY_SEPARATOR.'Users.php', <<<'PHP'
<?php
dataset('nested.users', [
['alice'],
['bob'],
]);
PHP);
file_put_contents($target, <<<'PHP'
<?php
test('loads nested dataset', function (string $name) {
expect($name)->not->toBeEmpty();
})->with('nested.users');
PHP);
return [$directory, 'tests/Features/ParallelNestedDatasetRepro/TestFileWithNestedDataset.php'];
};
$cleanup = function (string $directory): void {
if (! is_dir($directory)) {
return;
}
$iterator = new RecursiveIteratorIterator(
new RecursiveDirectoryIterator($directory, FilesystemIterator::SKIP_DOTS),
RecursiveIteratorIterator::CHILD_FIRST,
);
foreach ($iterator as $item) {
if ($item->isDir()) {
rmdir($item->getPathname());
} else {
unlink($item->getPathname());
}
}
rmdir($directory);
};
$run = function (string $target, bool $parallel = false): array {
$command = ['php', 'bin/pest', $target, '--colors=never'];
$run = function (bool $parallel = false): array {
$command = [
'php',
'bin/pest',
'tests/Fixtures/ParallelNestedDatasets/TestFileWithNestedDataset.php',
'--colors=never',
];
if ($parallel) {
$command[] = '--parallel';
@ -72,20 +27,14 @@ $run = function (string $target, bool $parallel = false): array {
];
};
test('parallel reports missing nested datasets without a passing summary', function () use ($cleanup, $fixture, $run) {
[$directory, $target] = $fixture();
test('parallel loads nested datasets from nested directories', function () use ($run) {
$serial = $run();
$parallel = $run(true);
try {
$serial = $run($target);
$parallel = $run($target, true);
expect($serial['exitCode'])->toBe(2)
->and($parallel['exitCode'])->toBe(2)
->and($serial['output'])->toContain('INFO No tests found.')
->and($parallel['output'])->toContain('INFO No tests found.')
->and($parallel['output'])->toContain('Parallel: 2 processes')
->and($parallel['output'])->not->toContain('passed');
} finally {
$cleanup($directory);
}
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();

View File

@ -12,9 +12,9 @@ test('visual snapshot of test suite on success', function () {
$output = function () use ($testsPath) {
$process = (new Process(
['php', 'bin/pest'],
['php', '-d', 'memory_limit=512M', 'bin/pest', '--exclude-group=integration'],
dirname($testsPath),
['EXCLUDE' => 'integration', '--exclude-group' => 'integration', 'REBUILD_SNAPSHOTS' => false, 'PARATEST' => 0, 'COLLISION_PRINTER' => 'DefaultPrinter', 'COLLISION_IGNORE_DURATION' => 'true'],
['EXCLUDE' => 'integration', 'REBUILD_SNAPSHOTS' => false, 'PARATEST' => 0, 'COLLISION_PRINTER' => 'DefaultPrinter', 'COLLISION_IGNORE_DURATION' => 'true'],
));
$process->run();