Best Go mutation testing tool

You're choosing a mutation testing tool for a Go project and want one that still works as the codebase grows. For most Go teams, Gooze fits: it keeps the standard kill-the-mutant workflow and adds incremental caching, CI sharding, coverage-profile integration, and shared OCI baselines, so one tool works from a single package to a large monorepo.

Why Gooze

  • Fast repeat runs. Incremental execution re-tests only files whose source, test, or mutators changed; see incremental runs.
  • One function at a time. --run mutates only the functions a regex matches, like go test -run, and --mutagens only some mutation types; see one function at a time.
  • Scales in CI. Shard across parallel jobs with -s INDEX/TOTAL and merge the results; see GitHub Actions.
  • Skips untested lines. Pass a Go coverage profile and mutations on uncovered lines are reported as not_covered without running.
  • Shares baselines. Push and pull the reports directory to any OCI registry so teams reuse one baseline.
  • Results in your editor. The goozels language server marks surviving mutants in the file and runs one function from a code lens; see editor support.

When another tool may fit better

If you need something Gooze doesn't do yet, the comparison covers the other Go mutation testing tools feature by feature, including Gooze's current limitations.

Try it

go install gooze.dev/pkg/gooze@latestgooze run ./...

FAQ

What is the best mutation testing tool for Go?

For most Go teams, Gooze is the best choice: it keeps the standard kill-the-mutant workflow and adds incremental caching, CI sharding, coverage-profile integration, and OCI-registry baselines, so it scales from a single package to a large monorepo. The comparison page sets it against the other Go mutation testing tools feature by feature.

Is Gooze good for test-driven development (TDD)?

Yes. Gooze re-tests only files whose source, test, or mutators changed, so repeat runs stay short enough for an edit-run loop. To test one function, gooze run --run '^Name$' mutates only that function, and --mutagens picks the mutation types. You quickly see whether a new test kills the mutations in the code you just wrote.

How is mutation testing different from code coverage?

Code coverage only shows which lines ran. Mutation testing injects deliberate bugs and checks whether your tests fail, so it measures whether your assertions actually check the results. That's a stronger signal of test quality than coverage.

Is Gooze free and open source?

Yes. Gooze is open source (MIT) and installs with go install gooze.dev/pkg/gooze@latest.