Skip to content

Comparison

irradiate vs mutmut

mutmut is irradiate's direct ancestor. They share trampoline architecture, naming conventions, and config format. The differences are in execution model and feature set.

mutmut irradiate
Execution pytest.main() per mutant (~200ms each) Fork-per-mutant inside pre-warmed workers
Parser LibCST (Python, sequential) tree-sitter (Rust, parallel via rayon)
Operators ~20 categories 27 categories
Cache mtime-based (breaks on rebase, touch) Content-addressable (SHA-256)
Orchestration Python multiprocessing Rust + tokio async
Incremental -- --diff with merge-base resolution
Reports Terminal only JSON (Stryker v2), HTML, GitHub Actions annotations
Decorator support Skip all @property/@classmethod/@staticmethod handled
CI integration Manual --fail-under, inline annotations, step summary
Isolation Fork only Warm-session + --isolate + --verify-survivors
Config [tool.mutmut] [tool.irradiate] (mutmut section accepted with deprecation warning)

The speedup depends on pytest startup overhead. For projects where pytest takes 200ms+ to start, irradiate is typically 10-50x faster.

Python ecosystem

cosmic-ray

Parso-based. Generates all pairwise operator permutations rather than curated swap tables. Supports non-pytest test runners via its session/worker model. Good choice if you need a custom test runner or want exhaustive operator coverage over speed.

mutpy

Python ast-based. Follows academic mutation operator naming (AOR, ROR, etc.). Has object-oriented mutation operators not found elsewhere: inheritance manipulation, self.x to x, slice index removal. Largely unmaintained.

Other ecosystems

cargo-mutants (Rust)

Closest equivalent in design philosophy. Primary strategy is function body replacement — replace the entire body with a type-appropriate default. Simpler to reason about than fine-grained operator swaps but produces fewer total mutations.

Stryker (JS/TS)

The most feature-rich JS/TS mutation tester. JS-specific operators: optional chaining removal, array/object emptying, regex mutation. Runs as a Node.js process.

PIT / pitest (Java)

Most widely-used JVM mutation tester. Operates on bytecode, making it language-agnostic across JVM languages. Elaborate operator tier system (DEFAULTS vs STRONGER vs ALL) and a commercial extension (Arcmutate).

Infection (PHP)

The most operator-dense framework, with 200+ distinct mutation operators. PHP-specific mutations: function unwrapping (strip a call, return its argument), type cast removal, visibility reduction.