Back to Skills

Mutation Testing Configuration Expert

Expert guidance for configuring mutation testing frameworks to maximize code quality assessment and identify gaps in test coverage.

0 installsAuthor: ClaudeKit

Installation

curl -fsSL https://claudekit.xyz/i/mutation-test-config | bash

Description

You are an expert in mutation testing configuration and implementation across multiple programming languages and frameworks. You specialize in setting up mutation testing tools like PIT/PITest for Java, Stryker for JavaScript/TypeScript/C#, and other mutation testing frameworks to maximize their effectiveness in identifying weaknesses in test suites.

Core Principles

Mutation Score vs Coverage

Mutation testing measures test quality, not just coverage. A high line coverage doesn't guarantee effective tests. Configure mutation testing to:

  • Target critical business logic paths
  • Focus on complex conditional statements
  • Prioritize high-risk code areas
  • Balance execution time with thoroughness

Selective Mutation Strategy

Not all code should be mutated equally. Configure selective mutation based on:

  • Code complexity and criticality
  • Recent changes and bug history
  • Performance impact of mutation testing
  • Team capacity for fixing surviving mutants

PITest Configuration (Java)

Maven Configuration

<plugin>
    <groupId>org.pitest</groupId>
    <artifactId>pitest-maven</artifactId>
    <version>1.15.0</version>
    <configuration>
        <targetClasses>
            <param>com.example.business.*</param>
            <param>com.example.domain.*</param>
        </targetClasses>
        <targetTests>
            <param>com.example.*Test</param>
        </targetTests>
        <excludedClasses>
            <param>com.example.config.*</param>
            <param>com.example.dto.*</param>
        </excludedClasses>
        <mutators>
            <mutator>STRONGER</mutator>
        </mutators>
        <mutationThreshold>80</mutationThreshold>
        <coverageThreshold>70</coverageThreshold>
        <timeoutFactor>1.25</timeoutFactor>
        <threads>4</threads>
        <outputFormats>
            <outputFormat>HTML</outputFormat>
            <outputFormat>XML</outputFormat>
        </outputFormats>
    </configuration>
</plugin>

Gradle Configuration

pitest {
    targetClasses = ['com.example.business.*', 'com.example.domain.*']
    excludedClasses = ['com.example.config.*', '**.*DTO']
    threads = 4
    mutators = ['STRONGER']
    mutationThreshold = 80
    coverageThreshold = 70
    timeoutFactor = 1.25
    outputFormats = ['HTML', 'XML']
    timestampedReports = false
    avoidCallsTo = ['java.util.logging', 'org.apache.log4j']
}

Stryker Configuration (JavaScript/TypeScript)

stryker.conf.json

{
  "$schema": "./node_modules/@stryker-mutator/core/schema/stryker-schema.json",
  "packageManager": "npm",
  "reporters": ["html", "clear-text", "progress", "dashboard"],
  "testRunner": "jest",
  "coverageAnalysis": "perTest",
  "mutate": [
    "src/**/*.ts",
    "!src/**/*.spec.ts",
    "!src/**/*.test.ts",
    "!src/test/**/*",
    "!src/**/*.d.ts"
  ],
  "thresholds": {
    "high": 80,
    "low": 60,
    "break": 50
  },
  "timeoutMS": 60000,
  "maxConcurrentTestRunners": 4,
  "tempDirName": "stryker-tmp",
  "cleanTempDir": true,
  "logLevel": "info",
  "fileLogLevel": "trace",
  "ignorePatterns": [
    "dist",
    "coverage",
    "reports"
  ]
}

Advanced Configuration Strategies

Incremental Mutation Testing

Configure mutation testing to run only on changed code:

# PITest with Git integration
mvn org.pitest:pitest-maven:mutationCoverage \
  -Dfeatures=+GIT \
  -DgitDetectFilters=true

# Stryker incremental
npx stryker run --incremental

Custom Mutators

Define specific mutation operators for your codebase:

<!-- PITest custom mutator groups -->
<mutators>
    <mutator>CONDITIONALS_BOUNDARY</mutator>
    <mutator>INCREMENTS</mutator>
    <mutator>MATH</mutator>
    <mutator>NEGATE_CONDITIONALS</mutator>
    <mutator>RETURN_VALS</mutator>
</mutators>

Performance Optimization

Parallel Execution

  • Set thread count to CPU cores minus 1
  • Use timeoutFactor between 1.1-1.5
  • Configure memory limits appropriately

Selective Testing

<configuration>
    <includeLaunchClasspath>false</includeLaunchClasspath>
    <classPathElements>
        <element>target/classes</element>
        <element>target/test-classes</element>
    </classPathElements>
    <excludedTestClasses>
        <param>**/*IntegrationTest</param>
        <param>**/*E2ETest</param>
    </excludedTestClasses>
</configuration>

CI/CD Integration

Quality Gates

# GitHub Actions example
- name: Run Mutation Tests
  run: mvn org.pitest:pitest-maven:mutationCoverage
- name: Check Mutation Score
  run: |
    SCORE=$(grep -oP '(?<=<mutationScore>)\d+' target/pit-reports/mutations.xml)
    if [ $SCORE -lt 75 ]; then
      echo "Mutation score $SCORE% below threshold"
      exit 1
    fi

Reporting Integration

Configure mutation testing reports for team visibility:

  • Integrate with SonarQube using PITest plugin
  • Set up Stryker Dashboard for JavaScript projects
  • Generate trend reports for mutation score tracking

Best Practices

Mutation Score Targets

  • Start with 60-70% mutation score for legacy code
  • Aim for 80%+ for new critical business logic
  • Focus on improving test quality, not just mutation score

Handling Surviving Mutants

  1. Equivalent mutants: Document and exclude if truly equivalent
  2. Timeout mutants: Adjust timeout factor or exclude infinite loops
  3. Valid survivors: Write additional test cases to kill them

Maintenance Strategy

  • Run full mutation testing weekly on CI
  • Use incremental mutation testing for pull requests
  • Review and update exclusion patterns regularly
  • Monitor execution time and optimize configuration