Vary
A readable, statically-typed programming language that measures test strength.
Why Vary
A lie detector for tests. Tests can lie. Mutation testing exposes the ones that do. vary mutate shows which tests are weak, which mutations survived, and exactly what to fix.
Contracts and assertions. Contracts (in / out) declare what a function expects and what it promises. observe assertions check behaviour at runtime. Both are part of the language, not annotations you bolt on.
One CLI for the entire workflow. Run, check, test, format, and mutate from a single binary. Everything ships with the compiler. No plugins or extra tools required. Get started in minutes.
Fast JVM execution. Vary compiles to JVM bytecode and runs on any JVM. Mutation testing uses bytecode patching, so mutants run without recompiling.
Recent Articles
- What's new in Vary v122-alpha.1 — v122-alpha.1 ships vary var for adaptive review, a rewritten mutation engine with reachability tracing and a hot-swap backend, Frugal (a Parsimonious port for parsing), Dict generic codegen with operator overloading, fourteen new vary check rules, and vary explain.
- Vary mutation testing speed: comparing to AST and PIT — Vary does regular mutation-performance testing, not just feature work. On the current project-scale Frugal benchmark, the checked-in result is a stable 27-second run over 1,857 mutants with an 82.18 percent mutation score. On the current PIT-style comparison fixture, Vary measures at 0.92x of PIT's wall time, which falls within the acceptance target.
- Inside PIT, Part 2: Why It Stays Fast — PIT is good because it avoids repeated work at every layer: compact mutant representation, targeted execution, early exit, warm workers, and disciplined incremental reuse.
- Inside PIT, Part 1: The Execution Model — PIT is fast because it mutates bytecode, gathers coverage first, runs only relevant tests, stops on first kill, and uses warm worker JVMs with strong recovery behaviour.