Compare commits

...

25 Commits

Author SHA1 Message Date
44c04bfce1 chore: bumps paratest 2026-04-06 14:41:38 +01:00
271c680d3c Merge branch '4.x' into 5.x 2026-04-06 11:24:05 +01:00
9797a71dbc feat(ai): allow temporary namesapce 2026-04-03 14:43:28 +01:00
c1a54df233 feat: --ai work in progress 2026-04-03 14:04:20 +01:00
4a1d8d27b8 chore: bumps dependencies 2026-04-03 12:12:27 +01:00
0f6924984c Merge branch '4.x' into 5.x 2026-04-03 12:02:36 +01:00
ce05ee9aad release: v4.4.4 2026-04-03 12:00:04 +01:00
3d2ebdb273 bump: dependencies 2026-04-03 11:59:54 +01:00
668ca9f5de feat: adds pao 2026-04-02 15:45:13 +01:00
f47b74445b Merge pull request #1657 from morpheus7CS/pint-formatting-rules-applied-to-stubs 2026-04-02 13:04:00 +01:00
6c42e7f4ea Laravel Pint default formatting applied to Pest-php.stub 2026-04-01 16:48:14 +02:00
a087555383 bump: dependencies 2026-03-26 14:30:03 +00:00
f659a45311 Merge branch '4.x' into 5.x 2026-03-21 13:20:25 +00:00
e6ab897594 release: v4.4.3 2026-03-21 13:14:39 +00:00
a753b41409 chore: bumps phpunit 2026-03-21 13:14:35 +00:00
12c1da29ee Merge branch '4.x' into 5.x 2026-03-10 21:21:24 +00:00
fa27c8daef chore: version 2026-02-17 17:52:40 +00:00
f0a08f0503 chore: missing types 2026-02-17 17:52:00 +00:00
2c040c5b1f chore: style 2026-02-17 17:45:50 +00:00
a9ce1fd739 chore: code refactor 2026-02-17 17:45:34 +00:00
3533356262 chore: updates snapshots 2026-02-17 17:44:56 +00:00
4aa41d0b14 chore: bumps dependencies 2026-02-17 17:41:38 +00:00
e4ed60085c chore: bumps dependencies 2026-02-17 17:18:45 +00:00
e2b119655d chore: point pestphp dependencies to ^5.0.0 2026-02-17 17:13:36 +00:00
fcf5baf0a9 chore: start preparing for pest 5.x 2026-02-17 16:55:03 +00:00
23 changed files with 108 additions and 87 deletions

View File

@ -2,7 +2,7 @@ name: Static Analysis
on: on:
push: push:
branches: [4.x] branches: [5.x]
pull_request: pull_request:
schedule: schedule:
- cron: '0 0 * * *' - cron: '0 0 * * *'
@ -29,7 +29,7 @@ jobs:
- name: Setup PHP - name: Setup PHP
uses: shivammathur/setup-php@v2 uses: shivammathur/setup-php@v2
with: with:
php-version: 8.3 php-version: 8.4
tools: composer:v2 tools: composer:v2
coverage: none coverage: none
extensions: sockets extensions: sockets
@ -43,10 +43,10 @@ jobs:
uses: actions/cache@v4 uses: actions/cache@v4
with: with:
path: ${{ steps.composer-cache.outputs.dir }} path: ${{ steps.composer-cache.outputs.dir }}
key: static-php-8.3-${{ matrix.dependency-version }}-composer-${{ hashFiles('**/composer.json') }} key: static-php-8.4-${{ matrix.dependency-version }}-composer-${{ hashFiles('**/composer.json') }}
restore-keys: | restore-keys: |
static-php-8.3-${{ matrix.dependency-version }}-composer- static-php-8.4-${{ matrix.dependency-version }}-composer-
static-php-8.3-composer- static-php-8.4-composer-
- name: Install Dependencies - name: Install Dependencies
run: composer update --${{ matrix.dependency-version }} --no-interaction --no-progress --ansi run: composer update --${{ matrix.dependency-version }} --no-interaction --no-progress --ansi

View File

@ -2,7 +2,7 @@ name: Tests
on: on:
push: push:
branches: [4.x] branches: [5.x]
pull_request: pull_request:
concurrency: concurrency:
@ -18,12 +18,9 @@ jobs:
fail-fast: true fail-fast: true
matrix: matrix:
os: [ubuntu-latest, macos-latest] # windows-latest os: [ubuntu-latest, macos-latest] # windows-latest
symfony: ['7.4', '8.0'] symfony: ['8.0']
php: ['8.3', '8.4', '8.5'] php: ['8.4', '8.5']
dependency_version: [prefer-stable] dependency_version: [prefer-stable]
exclude:
- php: '8.3'
symfony: '8.0'
name: PHP ${{ matrix.php }} - Symfony ^${{ matrix.symfony }} - ${{ matrix.os }} - ${{ matrix.dependency_version }} name: PHP ${{ matrix.php }} - Symfony ^${{ matrix.symfony }} - ${{ matrix.os }} - ${{ matrix.dependency_version }}

View File

@ -17,20 +17,20 @@
} }
], ],
"require": { "require": {
"php": "^8.3.0", "php": "^8.4",
"brianium/paratest": "^7.19.0", "brianium/paratest": "^7.22.0",
"nunomaduro/collision": "^8.9.1", "nunomaduro/collision": "^8.9.2",
"nunomaduro/termwind": "^2.4.0", "nunomaduro/termwind": "^2.4.0",
"pestphp/pest-plugin": "^4.0.0", "pestphp/pest-plugin": "^5.0.0",
"pestphp/pest-plugin-arch": "^4.0.0", "pestphp/pest-plugin-arch": "^5.0.0",
"pestphp/pest-plugin-mutate": "^4.0.1", "pestphp/pest-plugin-mutate": "^5.0.0",
"pestphp/pest-plugin-profanity": "^4.2.1", "pestphp/pest-plugin-profanity": "^5.0.0",
"phpunit/phpunit": "^12.5.12", "phpunit/phpunit": "^13.1.0",
"symfony/process": "^7.4.5|^8.0.5" "symfony/process": "^8.1.0"
}, },
"conflict": { "conflict": {
"filp/whoops": "<2.18.3", "filp/whoops": "<2.18.3",
"phpunit/phpunit": ">12.5.12", "phpunit/phpunit": ">13.1.0",
"sebastian/exporter": "<7.0.0", "sebastian/exporter": "<7.0.0",
"webmozart/assert": "<1.11.0" "webmozart/assert": "<1.11.0"
}, },
@ -55,10 +55,11 @@
] ]
}, },
"require-dev": { "require-dev": {
"pestphp/pest-dev-tools": "^4.1.0", "nunomaduro/pao": "0.x-dev",
"pestphp/pest-plugin-browser": "^4.3.0", "pestphp/pest-dev-tools": "^5.0.0",
"pestphp/pest-plugin-type-coverage": "^4.0.3", "pestphp/pest-plugin-browser": "^5.0.0",
"psy/psysh": "^0.12.21" "pestphp/pest-plugin-type-coverage": "^5.0.0",
"psy/psysh": "^0.12.22"
}, },
"minimum-stability": "dev", "minimum-stability": "dev",
"prefer-stable": true, "prefer-stable": true,

View File

@ -33,7 +33,7 @@ final readonly class Configuration
*/ */
public function in(string ...$targets): UsesCall public function in(string ...$targets): UsesCall
{ {
return (new UsesCall($this->filename, []))->in(...$targets); return new UsesCall($this->filename, [])->in(...$targets);
} }
/** /**
@ -60,7 +60,7 @@ final readonly class Configuration
*/ */
public function group(string ...$groups): UsesCall public function group(string ...$groups): UsesCall
{ {
return (new UsesCall($this->filename, []))->group(...$groups); return new UsesCall($this->filename, [])->group(...$groups);
} }
/** /**
@ -68,7 +68,7 @@ final readonly class Configuration
*/ */
public function only(): void public function only(): void
{ {
(new BeforeEachCall(TestSuite::getInstance(), $this->filename))->only(); new BeforeEachCall(TestSuite::getInstance(), $this->filename)->only();
} }
/** /**

View File

@ -237,7 +237,7 @@ final class Expectation
if ($callbacks[$index] instanceof Closure) { if ($callbacks[$index] instanceof Closure) {
$callbacks[$index](new self($value), new self($key)); $callbacks[$index](new self($value), new self($key));
} else { } else {
(new self($value))->toEqual($callbacks[$index]); new self($value)->toEqual($callbacks[$index]);
} }
$index = isset($callbacks[$index + 1]) ? $index + 1 : 0; $index = isset($callbacks[$index + 1]) ? $index + 1 : 0;
@ -864,15 +864,7 @@ final class Expectation
return Targeted::make( return Targeted::make(
$this, $this,
function (ObjectDescription $object) use ($interfaces): bool { fn (ObjectDescription $object): bool => array_all($interfaces, fn (string $interface): bool => isset($object->reflectionClass) && $object->reflectionClass->implementsInterface($interface)),
foreach ($interfaces as $interface) {
if (! isset($object->reflectionClass) || ! $object->reflectionClass->implementsInterface($interface)) {
return false;
}
}
return true;
},
"to implement '".implode("', '", $interfaces)."'", "to implement '".implode("', '", $interfaces)."'",
FileLineFinder::where(fn (string $line): bool => str_contains($line, 'class')), FileLineFinder::where(fn (string $line): bool => str_contains($line, 'class')),
); );
@ -1087,8 +1079,8 @@ final class Expectation
$this, $this,
fn (ObjectDescription $object): bool => isset($object->reflectionClass) fn (ObjectDescription $object): bool => isset($object->reflectionClass)
&& $object->reflectionClass->isEnum() && $object->reflectionClass->isEnum()
&& (new ReflectionEnum($object->name))->isBacked() // @phpstan-ignore-line && new ReflectionEnum($object->name)->isBacked() // @phpstan-ignore-line
&& (string) (new ReflectionEnum($object->name))->getBackingType() === $backingType, // @phpstan-ignore-line && (string) new ReflectionEnum($object->name)->getBackingType() === $backingType, // @phpstan-ignore-line
'to be '.$backingType.' backed enum', 'to be '.$backingType.' backed enum',
FileLineFinder::where(fn (string $line): bool => str_contains($line, 'class')), FileLineFinder::where(fn (string $line): bool => str_contains($line, 'class')),
); );

View File

@ -576,15 +576,7 @@ final readonly class OppositeExpectation
return Targeted::make( return Targeted::make(
$original, $original,
function (ObjectDescription $object) use ($traits): bool { fn (ObjectDescription $object): bool => array_all($traits, fn (string $trait): bool => ! (isset($object->reflectionClass) && in_array($trait, $object->reflectionClass->getTraitNames(), true))),
foreach ($traits as $trait) {
if (isset($object->reflectionClass) && in_array($trait, $object->reflectionClass->getTraitNames(), true)) {
return false;
}
}
return true;
},
"not to use traits '".implode("', '", $traits)."'", "not to use traits '".implode("', '", $traits)."'",
FileLineFinder::where(fn (string $line): bool => str_contains($line, 'class')), FileLineFinder::where(fn (string $line): bool => str_contains($line, 'class')),
); );
@ -604,15 +596,7 @@ final readonly class OppositeExpectation
return Targeted::make( return Targeted::make(
$original, $original,
function (ObjectDescription $object) use ($interfaces): bool { fn (ObjectDescription $object): bool => array_all($interfaces, fn (string $interface): bool => ! (isset($object->reflectionClass) && $object->reflectionClass->implementsInterface($interface))),
foreach ($interfaces as $interface) {
if (isset($object->reflectionClass) && $object->reflectionClass->implementsInterface($interface)) {
return false;
}
}
return true;
},
"not to implement '".implode("', '", $interfaces)."'", "not to implement '".implode("', '", $interfaces)."'",
FileLineFinder::where(fn (string $line): bool => str_contains($line, 'class')), FileLineFinder::where(fn (string $line): bool => str_contains($line, 'class')),
); );
@ -852,8 +836,8 @@ final readonly class OppositeExpectation
$original, $original,
fn (ObjectDescription $object): bool => isset($object->reflectionClass) === false fn (ObjectDescription $object): bool => isset($object->reflectionClass) === false
|| ! $object->reflectionClass->isEnum() || ! $object->reflectionClass->isEnum()
|| ! (new \ReflectionEnum($object->name))->isBacked() // @phpstan-ignore-line || ! new \ReflectionEnum($object->name)->isBacked() // @phpstan-ignore-line
|| (string) (new \ReflectionEnum($object->name))->getBackingType() !== $backingType, // @phpstan-ignore-line || (string) new \ReflectionEnum($object->name)->getBackingType() !== $backingType, // @phpstan-ignore-line
'not to be '.$backingType.' backed enum', 'not to be '.$backingType.' backed enum',
FileLineFinder::where(fn (string $line): bool => str_contains($line, 'class')), FileLineFinder::where(fn (string $line): bool => str_contains($line, 'class')),
); );

View File

@ -59,6 +59,11 @@ final class TestCaseFactory
Concerns\Expectable::class, Concerns\Expectable::class,
]; ];
/**
* The namespace for the test case, overrides the path-based namespace when set.
*/
public ?string $namespace = null;
/** /**
* Creates a new Factory instance. * Creates a new Factory instance.
*/ */
@ -127,7 +132,7 @@ final class TestCaseFactory
$partsFQN = explode('\\', $classFQN); $partsFQN = explode('\\', $classFQN);
$className = array_pop($partsFQN); $className = array_pop($partsFQN);
$namespace = implode('\\', $partsFQN); $namespace = $this->namespace ?? implode('\\', $partsFQN);
$baseClass = sprintf('\%s', $this->class); $baseClass = sprintf('\%s', $this->class);
if (trim($className) === '') { if (trim($className) === '') {
@ -192,7 +197,7 @@ final class TestCaseFactory
if ( if (
$method->closure instanceof \Closure && $method->closure instanceof \Closure &&
(new \ReflectionFunction($method->closure))->isStatic() new \ReflectionFunction($method->closure)->isStatic()
) { ) {
throw new TestClosureMustNotBeStatic($method); throw new TestClosureMustNotBeStatic($method);

View File

@ -922,7 +922,7 @@ final class Expectation
if ($exception instanceof Closure) { if ($exception instanceof Closure) {
$callback = $exception; $callback = $exception;
$parameters = (new ReflectionFunction($exception))->getParameters(); $parameters = new ReflectionFunction($exception)->getParameters();
if (count($parameters) !== 1) { if (count($parameters) !== 1) {
throw new InvalidArgumentException('The given closure must have a single parameter type-hinted as the class string.'); throw new InvalidArgumentException('The given closure must have a single parameter type-hinted as the class string.');

View File

@ -53,9 +53,7 @@ final class UsesCall
$this->targets = [$filename]; $this->targets = [$filename];
} }
/** #[\Deprecated(message: 'Use `pest()->printer()->compact()` instead.')]
* @deprecated Use `pest()->printer()->compact()` instead.
*/
public function compact(): self public function compact(): self
{ {
DefaultPrinter::compact(true); DefaultPrinter::compact(true);

View File

@ -6,7 +6,7 @@ namespace Pest;
function version(): string function version(): string
{ {
return '4.4.2'; return '5.0.0-rc.3';
} }
function testDirectory(string $file = ''): string function testDirectory(string $file = ''): string

View File

@ -56,4 +56,31 @@ trait HandleArguments
return array_values(array_flip($arguments)); return array_values(array_flip($arguments));
} }
/**
* Pops the given argument and its value from the arguments, returning the value.
*
* @param array<int, string> $arguments
*/
public function popArgumentValue(string $argument, array &$arguments): ?string
{
foreach ($arguments as $key => $value) {
if (str_contains($value, "$argument=")) {
unset($arguments[$key]);
$arguments = array_values($arguments);
return substr($value, strlen($argument) + 1);
}
if ($value === $argument && isset($arguments[$key + 1])) {
$result = $arguments[$key + 1];
unset($arguments[$key], $arguments[$key + 1]);
$arguments = array_values($arguments);
return $result;
}
}
return null;
}
} }

View File

@ -107,6 +107,13 @@ final readonly class Help implements HandlesArguments
'desc' => 'Initialise a standard Pest configuration', 'desc' => 'Initialise a standard Pest configuration',
]], ...$content['Configuration']]; ]], ...$content['Configuration']];
$content['AI'] = [
[
'arg' => '--ai',
'desc' => 'Run a code snippet as a fully scaffolded test for AI verification',
],
];
$content['Execution'] = [...[ $content['Execution'] = [...[
[ [
'arg' => '--parallel', 'arg' => '--parallel',

View File

@ -176,13 +176,7 @@ final class Parallel implements HandlesArguments
{ {
$arguments = new ArgvInput; $arguments = new ArgvInput;
foreach (self::UNSUPPORTED_ARGUMENTS as $unsupportedArgument) { return array_any(self::UNSUPPORTED_ARGUMENTS, fn (string|array $unsupportedArgument): bool => $arguments->hasParameterOption($unsupportedArgument));
if ($arguments->hasParameterOption($unsupportedArgument)) {
return true;
}
}
return false;
} }
/** /**

View File

@ -83,11 +83,11 @@ final class Shard implements AddsOutput, HandlesArguments
*/ */
private function allTests(array $arguments): array private function allTests(array $arguments): array
{ {
$output = (new Process([ $output = new Process([
'php', 'php',
...$this->removeParallelArguments($arguments), ...$this->removeParallelArguments($arguments),
'--list-tests', '--list-tests',
]))->mustRun()->getOutput(); ])->mustRun()->getOutput();
preg_match_all('/ - (?:P\\\\)?(Tests\\\\[^:]+)::/', $output, $matches); preg_match_all('/ - (?:P\\\\)?(Tests\\\\[^:]+)::/', $output, $matches);

View File

@ -113,6 +113,16 @@ final class TestRepository
$this->testCaseMethodFilters[] = $filter; $this->testCaseMethodFilters[] = $filter;
} }
/**
* Gets the class and traits configured for the given directory path.
*
* @return array<int, string>
*/
public function getUsesForPath(string $path): array
{
return $this->uses[$path][0] ?? [];
}
/** /**
* Gets the test case factory from the given filename. * Gets the test case factory from the given filename.
*/ */

View File

@ -26,6 +26,7 @@ final class ExceptionTrace
return $closure(); return $closure();
} catch (Throwable $throwable) { } catch (Throwable $throwable) {
if (Str::startsWith($message = $throwable->getMessage(), self::UNDEFINED_METHOD)) { if (Str::startsWith($message = $throwable->getMessage(), self::UNDEFINED_METHOD)) {
// @phpstan-ignore-next-line
$class = preg_match('/^Call to undefined method ([^:]+)::/', $message, $matches) === false ? null : $matches[1]; $class = preg_match('/^Call to undefined method ([^:]+)::/', $message, $matches) === false ? null : $matches[1];
$message = str_replace(self::UNDEFINED_METHOD, 'Call to undefined method ', $message); $message = str_replace(self::UNDEFINED_METHOD, 'Call to undefined method ', $message);

View File

@ -50,7 +50,7 @@ final class HigherOrderMessage
} }
if ($this->hasHigherOrderCallable()) { if ($this->hasHigherOrderCallable()) {
return (new HigherOrderCallables($target))->{$this->name}(...$this->arguments); return new HigherOrderCallables($target)->{$this->name}(...$this->arguments);
} }
try { try {

View File

@ -31,7 +31,7 @@ final class HigherOrderMessageCollection
*/ */
public function addWhen(callable $condition, string $filename, int $line, string $name, ?array $arguments): void public function addWhen(callable $condition, string $filename, int $line, string $name, ?array $arguments): void
{ {
$this->messages[] = (new HigherOrderMessage($filename, $line, $name, $arguments))->when($condition); $this->messages[] = new HigherOrderMessage($filename, $line, $name, $arguments)->when($condition);
} }
/** /**

View File

@ -38,7 +38,7 @@ final class HigherOrderTapProxy
return $this->target->{$property}; return $this->target->{$property};
} }
$className = (new ReflectionClass($this->target))->getName(); $className = new ReflectionClass($this->target)->getName();
if (str_starts_with($className, 'P\\')) { if (str_starts_with($className, 'P\\')) {
$className = substr($className, 2); $className = substr($className, 2);
@ -60,7 +60,7 @@ final class HigherOrderTapProxy
$filename = Backtrace::file(); $filename = Backtrace::file();
$line = Backtrace::line(); $line = Backtrace::line();
return (new HigherOrderMessage($filename, $line, $methodName, $arguments)) return new HigherOrderMessage($filename, $line, $methodName, $arguments)
->call($this->target); ->call($this->target);
} }
} }

View File

@ -181,7 +181,7 @@ final class Reflection
*/ */
public static function getFunctionArguments(Closure $function): array public static function getFunctionArguments(Closure $function): array
{ {
$parameters = (new ReflectionFunction($function))->getParameters(); $parameters = new ReflectionFunction($function)->getParameters();
$arguments = []; $arguments = [];
foreach ($parameters as $parameter) { foreach ($parameters as $parameter) {
@ -207,7 +207,7 @@ final class Reflection
public static function getFunctionVariable(Closure $function, string $key): mixed public static function getFunctionVariable(Closure $function, string $key): mixed
{ {
return (new ReflectionFunction($function))->getStaticVariables()[$key] ?? null; return new ReflectionFunction($function)->getStaticVariables()[$key] ?? null;
} }
/** /**

View File

@ -1,5 +1,6 @@
<?php <?php
use Illuminate\Foundation\Testing\RefreshDatabase;
use Tests\TestCase; use Tests\TestCase;
/* /*
@ -14,7 +15,7 @@ use Tests\TestCase;
*/ */
pest()->extend(TestCase::class) pest()->extend(TestCase::class)
// ->use(Illuminate\Foundation\Testing\RefreshDatabase::class) // ->use(RefreshDatabase::class)
->in('Feature'); ->in('Feature');
/* /*

View File

@ -1,5 +1,5 @@
Pest Testing Framework 4.4.2. Pest Testing Framework 5.0.0-rc.3.
USAGE: pest <file> [options] USAGE: pest <file> [options]
@ -44,6 +44,7 @@
--filter [pattern] ............................... Filter which tests to run --filter [pattern] ............................... Filter which tests to run
--exclude-filter [pattern] .. Exclude tests for the specified filter pattern --exclude-filter [pattern] .. Exclude tests for the specified filter pattern
--test-suffix [suffixes] Only search for test in files with specified suffix(es). Default: Test.php,.phpt --test-suffix [suffixes] Only search for test in files with specified suffix(es). Default: Test.php,.phpt
--test-files-file [file] Only run test files listed in file (one file by line)
EXECUTION OPTIONS: EXECUTION OPTIONS:
--parallel ........................................... Run tests in parallel --parallel ........................................... Run tests in parallel
@ -92,7 +93,7 @@
--random-order-seed [N] Use the specified random seed when running tests in random order --random-order-seed [N] Use the specified random seed when running tests in random order
REPORTING OPTIONS: REPORTING OPTIONS:
--colors [flag] ......... Use colors in output ("never", "auto" or "always") --colors=[flag] ......... Use colors in output ("never", "auto" or "always")
--columns [n] ................. Number of columns to use for progress output --columns [n] ................. Number of columns to use for progress output
--columns max ............ Use maximum number of columns for progress output --columns max ............ Use maximum number of columns for progress output
--stderr ................................. Write to STDERR instead of STDOUT --stderr ................................. Write to STDERR instead of STDOUT
@ -119,12 +120,12 @@
LOGGING OPTIONS: LOGGING OPTIONS:
--log-junit [file] .......... Write test results in JUnit XML format to file --log-junit [file] .......... Write test results in JUnit XML format to file
--log-otr [file] Write test results in Open Test Reporting XML format to file --log-otr [file] Write test results in Open Test Reporting XML format to file
--include-git-information Include Git information in Open Test Reporting XML logfile
--log-teamcity [file] ........ Write test results in TeamCity 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-html [file] .. Write test results in TestDox format (HTML) to file
--testdox-text [file] Write test results in TestDox format (plain text) 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-text [file] ............... Stream events as plain text to file
--log-events-verbose-text [file] Stream events as plain text with extended information to file --log-events-verbose-text [file] Stream events as plain text with extended information to file
--include-git-information ..... Include Git information in supported formats
--no-logging ....... Ignore logging configured in the XML configuration file --no-logging ....... Ignore logging configured in the XML configuration file
CODE COVERAGE OPTIONS: CODE COVERAGE OPTIONS:
@ -147,6 +148,9 @@
--disable-coverage-ignore ...... Disable metadata for ignoring code coverage --disable-coverage-ignore ...... Disable metadata for ignoring code coverage
--no-coverage Ignore code coverage reporting configured in the XML configuration file --no-coverage Ignore code coverage reporting configured in the XML configuration file
AI OPTIONS:
--ai ..... Run a code snippet as a fully scaffolded test for AI verification
MUTATION TESTING OPTIONS: MUTATION TESTING OPTIONS:
--mutate .... Runs mutation testing, to understand the quality of your tests --mutate .... Runs mutation testing, to understand the quality of your tests
--mutate --parallel ...................... Runs mutation testing in parallel --mutate --parallel ...................... Runs mutation testing in parallel

View File

@ -1,3 +1,3 @@
Pest Testing Framework 4.4.2. Pest Testing Framework 5.0.0-rc.3.