What's new?The ChangeLog for 0.9 contains one big new feature, multiple shrinking. While minimization of failing test cases is usually performed with a single linear search, multiple shrinking features a series of different options for shrinking a value.
For example, the integer 1234 was usually shrunk to 1233, 1232, 1231 and so on. With multiple shrinking, there are a series of options to explore that make the search logarithmic, such as 617, 925, 1080, 1157, 1195, 1214, 1224, 1129, and 1231. If the simplest failing values is below 617 for example, at least (1234-617) runs of the test will be skipped by this optimization, just in the first step.
This feature is the equivalent of QuickCheck's (and other property-based testing libraries') Rose Trees, but implemented here with an object-oriented approach that makes use of `GeneratedValueSingle` and `GeneratedValueOptions` as part of a Composite pattern.
This release also features support for the latest versions of basic dependencies:
- PHPUnit 6.x is now supported
- PHP 7.1 is officially supported (I expect there were mostly no issues in previous releases, but not the test suite fully passes.)
- the pos() and neg() generators should not shrink to 0.
- float generation should never divide by 0.
- shrinking of dates fell into a case of wrong operator precedence.
- reproducible PHPUnit commands were not escaped correctly in presence of namespaced classes.
- minimumEvaluationRatio is now a method to be called, not a private field.
- GeneratedValue is now an interface and not a class. This is supposed to be an internal value: project code should never depend on it and it should build custom generators with map() and other composite generators rather than implementing the Generator interface, which is much more complex.
- the Listener::endPropertyVerification() method now takes the additional parameters $iterations and the optional $exception. When creating listeners should always subclass EmptyListener in order not to have to modify the not implemented methods, which will be inherited.
What's next?My Trello board says:
- still decoupling from PHPUnit, for usage in scripts, mainly as a programmable source of randomness.
- more advanced Generators for finite state machines and in general a more stateful approach, for testing stateful systems.
- faster feedback for developers, like having the option to run fewer test cases in a development environment but the full set in Continuous Integration.
As always, if you feel there is a glaring feature missing in Eris, feel free to request it on the Github's project issues.