NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
Packagist · #1693 most downloaded on Packagist
PHP library for property-based testing. Integrates with PHPUnit.
Last release 8 days ago
30 Sep 2026
Ships fairly regularly
a new release about every 11 months
Nearly every release is documented
notes for 19 of 19 stable releases
Nothing withdrawn
no release was ever pulled
12 years old
21 releases · first in 2014
Generic type annotations for the values that generators produce ( #208 ), thanks @sebastianbergmann .
src/, composer.json, LICENSE, README.md and CHANGELOG.md: development files (test/, examples/, docs/, tooling configuration, etc.) are excluded via export-ignore rules in .gitattributes. If you relied on any of them being installed in vendor/, install with --prefer-source or open an issue.choose() can generate every integer of a range wider than mt_getrandmax() instead of only some of them, and generates only integers inside a range wider than PHP_INT_MAX instead of floats below its lower limit; a broken random source raises a RuntimeException instead of looping forever (#207), thanks @sebastianbergmann.Error (such as DivisionByZeroError or TypeError) raised by a property is reported as itself instead of as an OutOfBoundsException about the evaluation ratio, and listeners are notified of it (#206), thanks @sebastianbergmann.One column per quarter.
Support for PHPUnit 11, 12, and 13 ( #202 ), thanks @tob-scott-a .
icomefromthenet/reverse-regex dependency. Only ilario-pierbattista/reverse-regex is now supported for the regex() generator (other forks are welcome).Added Support for PHP 8.2, 8.3, 8.4 Removed Support for PHP < 8.1 Support for PHPUnit < 10
* Solve own deprecations. Update test matrix for CI
chore: Promote annotations @before and @beforeClass to attributes (#175)
* chore: Promote annotations @before and @beforeClass to attributes
* Solve own deprecations. Update test matrix for CI
* Update matrix to reflect the fact that PHPUnit11 cannot run on PHP 8.1
* Reinstate docblock, now properly parametrized
* Modify phpstan-baseline to reflect 1 less error in codebase
chore: (bc) Update PHP and PHPUnit minimum version requirements
chore: (bc) Update PHP and PHPUnit minimum version requirements (#164)
* chore: (bc) Update PHP and PHPUnit minimum version requirements
- Use attributes to handle what was previously handled through annotations
---------
Co-authored-by: Ilario Pierbattista <987038+ilario-pierbattista@users.noreply.github.com>
Fixed #153 oneOf check failure with PSalm
oneOf check failure with PSalmilario-pierbattista/reverse-regex as substitute peer dependency of icomefromthenet/reverse-regex .
ilario-pierbattista/reverse-regex as substitute peer dependency of icomefromthenet/reverse-regex.ilario-pierbattista/reverse-regex as substitute peer dependency of icomefromthenet/reverse-regex.The generator constructors implemented as simple functions now call the static methods of Eris\Generators . They will be deprecated.
Eris\Generators contains all the generator constructors as static methods.Eris\Generators. They will be deprecated.Eris\Generators contains all the generator constructors as static methods.Eris\Generators. They will be deprecated.Visibility of TestTrait's methods in Facade is now public ( #110 , #141 ). Thanks, @bekh6ex .
CI support for testing end to end suite also with Phpunit 8.x and 9.x
shrink() to receive GeneratedValueOptions (#127).sample() (#128)BooleanGenerator::shrink() to return a GeneratedValueSingle (#131)Prepare ChangeLog for release
Prepare ChangeLog for release
@eris-method, @eris-shrink, @eris-ratio, @eris-repeat, @eris-durationBC: dropped the deprecated Shrinker\Random.
Eris\Facade.suchThat() fails to generated good values when all those from generator size 0 are exclude (#100).Shrinker\Random.Generator::contains().Using new multiple deterministic shrinking instead of random, being abandoned (#87).
multiple deterministic shrinking instead of random, being abandoned (#87).Listener::onAttempt()pos() and neg() can shrink to 0 (#96).minimumEvaluationRatio is now a method to be called, not a private field. Defaults to 0.5.GeneratedValue is now an interface and not a class.Listener::endPropertyVerification() with additional parameters $iterations and optional $exception.Updated dependency on icomefromthenet/reverse-regex to solve warnings on PHP 7.
icomefromthenet/reverse-regex to solve warnings on PHP 7.bind Generator.Listener\collectFrequencies().hook(Listener\log($filename)).disableShrinking() option.limitTo() accepts a DateInterval too.rand, mt_rand, and a pure PHP Mersenne Twister.suchThat Generator accepts PHPUnit constraints like when().Generator\constant() utility function.frequency generator only accepts variadics args, not an array anymore.strictlyPos and strictlyNeg Generators as duplicated of pos and neg ones.andAlso, theCondition, andTheCondition, implies, imply aliases which no one uses. Added and for multiple preconditions.associative, map, subSet, suchThat Generators.
associative, map, subSet, suchThat Generators.limitTo().hook(Listener\collectFrequencies()).startPropertyVerification, newGeneration and endPropertyVerification events.GeneratedValue objects.forAll().Generators are now based on size, an increasing random parameter.
choose() new Generator to get integers inside a fixed range.set new Generator.pos, nat, neg Generators.Showing generated input with ERIS_ORIGINAL_INPUT=1.
ERIS_ORIGINAL_INPUT=1.names and date (DateTime) new Generators.tuple Generator supports variadic arguments.when() clauses.forAll() accepts multiple arguments instead of an array.
forAll() accepts multiple arguments instead of an array.byte Generator.frequency and oneOf Generators that combine other Generators.
frequency and oneOf Generators that combine other Generators.sequence Generator for lists of constant type and variable size.char Generators with printableCharacter Antecedent.int, pos, neg and float Generators.regex Generator to build strings satisfying a regular expression.$this->shrinkingtimeLimit).Generators now use the Generator\nat(...) syntax.
bool, constant, elements, string, tuple Generators.sample() and sampleShrink() for Generators.
forAll() and then() syntax.natural and vector Generators.when() for constraints.sample() and sampleShrink() for Generators.Your coding agent can read these notes before it upgrades. Set up the MCP server →