Changelog
v0.9.0 — 2026-05-25
Spec-tree runner with hooks, mocks, custom matchers, and parallel execution.
Added
- Documentation
- Core DSL
describe / it / specify with arbitrary nesting on a spec treebefore / after / around hooks, including metadata-keyed and inherited variantslet / let! (eager) / subject / is-expected one-liner syntax- Shared contexts and shared examples
- Tags, focus, and skip
- Example filtering by name or metadata
- Pending examples, dry-run, and example listing
- Run by file, directory, line number, or a single block
- Expectations
- Custom and composable matcher DSL
- Matchers for equality, comparison,
be-between / be-within, boolean, nil, type checking, respond-to, have-attributes, include, all, sequence, match, string content, change / change-by / change-from-to, junctions, exceptions (raise-error with attribute matching), promises, supplies/channels, and eventually for async aggregate_failures block plus auto-aggregation
- Mocks
- Doubles, method stubbing, spies with call verification, and partial mocking
- Runner & CLI
- Parallel execution with queue distribution, a discovery subprocess, per-shard retry on worker crash, and aggregated memory / profile / benchmark output
--fail-fast, --watch, --progress-total, retry, seed control, and bisect for flaky specs- Code coverage metrics, compatible with
--parallel
- Formatters
- Progress (default), TAP, JUnit, JSON, JsonEvents, HTML, Tree, and Documentation
- Diagnostics
- Junction-aware, shape-detecting diffs
- Timing profiling, memory profiling, and benchmarking with baselines
- Time mocking
- Configuration
- File-based configuration with CLI precedence
Changed
- Migrated files from Perl 6 file extensions to Raku throughout
- Reworked expectations to accept actual values
- Replaced the grammar-driven core with an in-memory spec tree (
Suite → ExampleGroup → Example / Hook) walked by the runner - Regrouped
lib/, t/, and specs/ by feature area (core/, expectations/, parallel/, etc.) - Default formatter is now Progress
v0.0.3 — 2019-09-14
Grammar-driven runner with a small DSL.
Added
describe / context / it blocks with nestinglet(:name) => { ... } with block-scoped overridesexpect(x).to.be(y) equality matcher, with .to.not for negation- Variable interpolation in expectations (
expect(:foo).to.be(42), expect(42).to.be(:foo)) - CLI
behave [path] runner; auto-discovers specs/*spec.p6 when no path is given - Colorized output and failure reporting with file and line numbers