NEWS
muttest 0.3.0 (2026-07-21)
- ✨ New
JSONMutationReporter writes a report conforming to the mutation-testing-elements schema, a cross-language standard shared by StrykerJS/.NET/Scala — so muttest output can be fed to any schema-compatible tooling.
- ✨ New
report() renders a self-contained, source-annotated HTML report (overall score, per-file breakdown, per-line mutant diffs, status filtering, keyboard navigation) from a JSONMutationReporter file.
- ✨ New
MultiReporter fans reporter events out to several reporters at once, e.g. a live ProgressMutationReporter alongside a JSONMutationReporter.
- ❗️ A mutant that makes tests error (rather than fail an expectation) is now scored as killed, matching PIT/Stryker/mutmut. Previously it was counted as survived.
- ❗️ Mutants with no test coverage (no matching test file under
FileTestStrategy) are now reported as a separate no coverage category and excluded from the score, so untested code no longer looks like escaped mutants.
- ✨
PackageCopyStrategy gained a symlink argument. When TRUE, only the mutated file's top-level directory is copied and everything else is symlinked to the original, avoiding a full project copy per mutant (helpful for packages with large inst//data/). Defaults to FALSE; unsafe if the test suite writes into the package's own directories.
- 🐛
FileTestStrategy now matches test files by exact name instead of an unanchored regex, so a source file like mod.R no longer runs test-model.R and filenames with regex metacharacters are handled correctly.
- 🐛 Added missing
digest and tools to Imports.
muttest 0.2.1 (2026-06-24)
- Update treesitter queries to work with treesitter >= 1.3.0.
muttest 0.2.0 (2026-05-14)
- ❗️ Renamed
plan() to muttest_plan().
- ✨ Add new mutators:
boolean_literal(), na_literal() — literal replacement mutators.
negate_condition(), remove_condition_negation() — condition mutators.
numeric_increment(), numeric_decrement(), index_increment(), index_decrement() — increment/decrement mutators.
string_empty(), string_fill() — string mutators.
call_name() — call name mutator.
remove_negation() — unary negation mutator.
replace_return_value() — return value mutator.
delete_statement() — removes assignments and standalone calls one at a time to catch untested side effects and dead assignments.
- ✨ Add preset collections for all major mutator groups:
boolean_literals() — flips TRUE/FALSE and T/F.
na_literals() — swaps NA, NULL, and typed NA variants.
numeric_literals() — increments and decrements numeric constants.
index_mutations() — shifts subscript indices up and down by one.
string_literals() — empties non-empty strings and fills empty ones.
condition_mutations() — negates conditions and removes existing negations.
arithmetic_operators() — mutates arithmetic operators (+, -, *, /, ^, %%, %/%).
comparison_operators() — mutates comparison operators (<, >, <=, >=, ==, !=).
logical_operators() — mutates logical operators (&, |, &&, ||).
- ✨ Mutators are now parametrized and accept configuration arguments.
- ✨
ProgressMutationReporter now reports survived mutants.
- ✨ Expose
Mutator base class for building custom mutators.
- ✨
muttest() supports parallel execution of mutants.
- ✨
muttest() supports per-mutant timeouts to avoid hanging test runs.
- 🥅 Improved error handling when test execution fails.
muttest 0.1.0 (2025-05-30)
- ✨ Create a testing plan with
plan.
- ✨ Run mutation testing with
muttest.
- ✨ Support mutating operators with
operator.
- ✨ Control copying project to temporary directory with
CopyStrategy:
PackageCopyStrategy implemented for copying package files.
- ✨ Control test execution for each mutant with
TestStrategy:
FullTestStrategy for running all tests for each mutant.
FileTestStrategy for running only test files matching mutant files.
- ✨ See test results with
MutationReporter.
ProgressMutationReporter for printing progress to the console.