Testland
Browse all skills & agents

qa-mutation-testing

Mutation testing across languages: 5 skills (mull-mutation, mutmut-mutation, pitest-mutation, stryker-mutation, stryker-net-mutation) and 2 agents (mutation-survivor-explainer, mutation-tool-selector).

Install this plugin

/plugin install qa-mutation-testing@testland-qa
View source

Part of role bundle: qa-role-sdet

qa-mutation-testing

Mutation testing across the major language ecosystems. Mutation testing inserts small bugs (mutants) into production code; if tests pass, they don't actually catch the regressions. Surviving mutants reveal weak assertions and missing edge-case tests that coverage hides.

Components

TypeNameDescription
Skillstryker-mutationConfigures StrykerJS for mutation testing of JavaScript / TypeScript / React / Vue / Svelte / Node - picks the test-runner plugin (@stryker-mutator/jest-runner, mocha-runner, vitest-runner, karma-runner), authors stryker.conf.json with mutate globs + thresholds, runs incremental mode for PRs (only mutate changed files), and reports the mutation score. Use when a JS/TS test suite has ≥80% line coverage and the team wants to verify the tests actually catch bugs (not just touch lines).
Skillstryker-net-mutationConfigures Stryker.NET for mutation testing of .NET Core / .NET Framework projects - installs dotnet-stryker global tool, scopes mutation to specific csproj, supports xUnit / NUnit / MSTest, authors stryker-config.json with thresholds, runs in CI. Use when a .NET test suite needs mutation-quality verification - closes the .NET ecosystem gap left by Stryker.NET being newer than the JS variant.
Skillpitest-mutationConfigures PIT (PITest) for mutation testing of JVM projects (Java, Kotlin via the Kotlin plugin) - wires the pitest-maven or pitest-gradle-plugin with mutationThreshold, coverageThreshold, target classes/tests filtering, runs mvn pitest:mutationCoverage, parses the HTML + XML reports. Use when the JVM suite needs mutation-quality verification - the canonical Java mutation testing tool, fast (PIT analyzes "in minutes rather than days").
Skillmutmut-mutationConfigures mutmut for Python mutation testing - pip install mutmut, runs via mutmut run, browses results via mutmut browse or mutmut results, applies surviving mutants to disk via mutmut apply <id>, suppresses with # pragma: no mutate annotations. Configures via setup.cfg / pyproject.toml with source_paths + per-test selection. Use for Python codebases needing mutation-quality verification of pytest / unittest suites.
Skillmull-mutationConfigures Mull for mutation testing of C / C++ (and via LLVM IR, Swift / Rust to a lesser extent) - LLVM-based, requires building the project with Mull-compatible LLVM toolchain, runs via mull-runner against the test binary. Use when a C/C++ project needs mutation-quality verification - the canonical native-language LLVM-IR-level mutation tool.
Skillmutant-survival-triageExplains why a mutant survived across StrykerJS, PIT, mutmut and Mull - the full read-only investigation workflow (read the mutated line + covering tests, classify the cause, draft the test that would kill it; never auto-rewrites tests). Treats equivalence as undecidable in general.

Choosing a tool

One canonical mutation tool per language - detect the language from the project root and pick the matching row:

Project signalLanguageToolSkill
package.json (with or without TypeScript)JavaScript / TypeScriptStrykerstryker-mutation
*.csproj / *.sln.NETStryker.NETstryker-net-mutation
pom.xml / build.gradle* / *.javaJVM (Java, Kotlin)PIT (PITest)pitest-mutation
pyproject.toml / setup.py / requirements.txtPythonMutmutmutmut-mutation
CMakeLists.txt / Makefile with C/C++ sourcesC / C++Mull (needs an existing test binary)mull-mutation

Notes: polyglot repos run one tool per language as separate CI jobs (Stryker and Stryker.NET are separate codebases with separate mutator catalogs). Languages outside this table (Rust, Go, Ruby, PHP, Elixir) are not covered - look for language-native alternatives. Start with the 1-2 most critical modules, not the whole codebase; gate CI at the team's baseline + N%, not 100% (scores plateau at 70-85% for well-tested code - see mutant-survival-triage on equivalent mutants).

Install

/plugin marketplace add testland/qa
/plugin install qa-mutation-testing@testland-qa

Skills

mull-mutation

Runs Mull, the LLVM-IR mutation testing tool, against C/C++ test binaries built with Clang: covers install (the version-matched mull-NN package), the -fpass-plugin build flags for the Mull IR frontend, mull-runner invocation, the mutator catalog, path filtering, and GitHub Actions CI. Use when a C or C++ project needs mutation-score verification with the tool already chosen. Does not select among mutation tools and does not cover other languages (stryker-mutation for JS/TS, stryker-net-mutation for .NET, pitest-mutation for the JVM, mutmut-mutation for Python).

mutant-survival-triage

Normalizes a surviving-mutant record across StrykerJS, PIT, mutmut, and Mull into one shape, classifies why it survived (missing case, weak assertion, equivalent mutant, unreachable code, flaky killer), applies per-mutator heuristics for conditional-boundary, arithmetic-operator, statement-removal, and constant mutations, and drafts the specific test that would kill it. Includes the full read-only investigation workflow: take a mutation report (Stryker JSON / PIT XML / mutmut output / Mull JSON) plus the repo at the same commit, read each survivor's mutated line and covering tests, classify, and propose - never auto-rewriting tests. Treats equivalence as a judgment call, because deciding whether a mutant is equivalent to the original is undecidable in general, so a residual survivor rate is expected rather than a defect. Use when a mutation run has finished and the report lists surviving mutants (typically 5+) that nobody has yet explained or turned into concrete test cases.

mutmut-mutation

Configures mutmut for Python mutation testing - `pip install mutmut`, runs via `mutmut run`, browses results via `mutmut browse` or `mutmut results`, applies surviving mutants to disk via `mutmut apply {id}`, suppresses with `# pragma: no mutate` annotations. Configures via `setup.cfg` / `pyproject.toml` with `source_paths` + per-test selection. Use for Python codebases needing mutation-quality verification of pytest / unittest suites.

pitest-mutation

Configures PIT (PITest) for mutation testing of JVM projects (Java, Kotlin via the Kotlin plugin) - wires the `pitest-maven` or `pitest-gradle-plugin` with `mutationThreshold`, `coverageThreshold`, target classes/tests filtering, runs `mvn pitest:mutationCoverage`, parses the HTML + XML reports. Use when the JVM suite needs mutation-quality verification - the canonical Java mutation testing tool, fast (PIT analyzes "in minutes rather than days").

stryker-mutation

Configures StrykerJS for mutation testing of JavaScript / TypeScript / React / Vue / Svelte / Node - picks the test-runner plugin (`@stryker-mutator/jest-runner`, `mocha-runner`, `vitest-runner`, `karma-runner`), authors `stryker.conf.json` with mutate globs + thresholds, runs incremental mode for PRs (only mutate changed files), and reports the mutation score. Use when a JS/TS test suite has ≥80% line coverage and the team wants to verify the tests actually catch bugs (not just touch lines).

stryker-net-mutation

Configures Stryker.NET for mutation testing of .NET Core / .NET Framework projects - installs `dotnet-stryker` global tool, scopes mutation to specific csproj, supports xUnit / NUnit / MSTest, authors `stryker-config.json` with thresholds, runs in CI. Use when a .NET test suite needs mutation-quality verification - closes the .NET ecosystem gap left by Stryker.NET being newer than the JS variant.