Changes for version 0.47 - 2026-10-07
- Enhancements
- Bump actions-setup-perl to 1.44.0
- Add --function NAME (-F NAME) option to bin/extract-schemas. When set, all schemas are extracted as normal, then every .yml except NAME.yml is deleted from the output directory and every other routine is removed from the in-memory schema map, so the fuzz run and summary table cover only that one routine. If NAME is not found in the file the script prints the available routine names and exits 1. Useful for isolating a single t/self-fuzz.t failure: extract-schemas --function bugs --output-dir /tmp/dbg \ lib/App/Test/Generator/CoverageGuidedFuzzer.pm fuzz-harness-generator -r /tmp/dbg/bugs.yml
- Improve t/self-fuzz.t end-of-run summary table. Previously only successfully fuzz-tested routines appeared (skipped ones, including those in %no_fuzz such as 'generate', were invisible). The table now covers every processed routine with two columns: Module (derived from the .pm path, e.g. App::Test::Generator::CoverageGuidedFuzzer) and Routine, plus a Tests column showing the test count for fuzz-tested routines or a plain-English reason for skipped ones: "skipped (internal helper)" — name starts with _ "skipped (excluded from fuzz list)" — in %no_fuzz "skipped (instance method, needs $self)" — schema has new: key "skipped (object param without can:)" — mandatory object, no can: hint "FAILED" — harness exited non-zero The subtest name for each .pm now uses the module name rather than the raw file path.
- Documentation
- Enhanced the MUTANT_SKIP examples
- Bug fixes
- Fix SchemaExtractor treating $pkg (and $proto, $klass) as a user-facing input parameter instead of a class invocant. The invocant-skip filter previously only covered $self and $class; $pkg (used in import()), $proto (older constructor idiom), and $klass (alternate class spelling) were all passed through as position-0 string parameters, producing schema entries like "pkg: {type: string}" for import() subroutines. The fix extends every invocant regex — ten extraction-loop guards, the _validate_pod_code_agreement special-case block, and the inline body guard — to the full set (self|class|pkg|proto|klass). The position-0 detection logic in _analyze_code Style 1/2/3 is also simplified to a single regex rather than separate eq-'class'/eq-'self' branches. Three regression tests added to t/SchemaExtractor_unit.t.
Documentation
Generate Benchmark harnesses from ATG schema files
Demonstrate the schema extractor
Deploy ATG GitHub Actions workflows to a CPAN module repository
Extract test schemas from Perl modules
Generate fuzzing + corpus-based test harnesses from test schemas
Generate round-trip tests from POD code examples
Test coverage dashboard generator
Run mutation testing against a Perl test suite
Modules
Fuzz Testing, Mutation Testing, LCSAJ Metrics and Test Dashboard for Perl modules
Generate Benchmark harnesses from ATG schemas
AFL-style coverage-guided fuzzing for App::Test::Generator
Serialise a test plan to YAML
Static LCSAJ extraction for Perl
Merge LCSAJ path data with runtime hits
Evidence-based model of a single method under test
Negate boolean return expressions to expose missing assertion coverage
Replace return expressions with undef to expose missing undef-return checks in the test suite
Generate and apply mutation tests
Extract runnable code examples from a Perl module's POD
Example module for schema extraction testing
Extract test schemas from Perl modules
Template for the test files generated by App::Test::Generator
Debugger backend for LCSAJ coverage
Provides
in lib/App/Test/Generator/Analyzer/Complexity.pm
in lib/App/Test/Generator/Analyzer/Return.pm
in lib/App/Test/Generator/Analyzer/ReturnMeta.pm
in lib/App/Test/Generator/Analyzer/SideEffect.pm
in lib/App/Test/Generator/Emitter/Perl.pm
in lib/App/Test/Generator/Mutant.pm
in lib/App/Test/Generator/Mutation/Base.pm
in lib/App/Test/Generator/Mutation/ConditionalInversion.pm
in lib/App/Test/Generator/Mutation/NumericBoundary.pm
in lib/App/Test/Generator/Planner.pm
in lib/App/Test/Generator/Planner/Fixture.pm
in lib/App/Test/Generator/Planner/Grouping.pm
in lib/App/Test/Generator/Planner/Isolation.pm
in lib/App/Test/Generator/Planner/Mock.pm
in lib/App/Test/Generator/TestStrategy.pm