スキル一覧に戻る
jmagly

mutation-test

by jmagly

mutation-testは、other分野における実用的なスキルです。複雑な課題への対応力を強化し、業務効率と成果の質を改善します。

70🍴 7📅 2026年1月23日
GitHubで見るManusで実行

SKILL.md


name: mutation-test description: Run mutation testing to validate test quality beyond code coverage. Use when assessing test effectiveness, finding weak tests, or validating test suite quality.

Mutation Test Skill

Purpose

Run mutation testing to measure test suite effectiveness. Mutation testing introduces small changes (mutants) to code and checks if tests catch them. High coverage with low mutation score indicates weak tests.

Research Foundation

ConceptSourceReference
Mutation Testing TheoryIEEE TSE (2019)Papadakis et al. "Mutation Testing Advances"
ICST Mutation WorkshopIEEE AnnualMutation 2024
Stryker MutatorIndustry Toolstryker-mutator.io
PITestJava Toolpitest.org
mutmutPython Toolgithub.com/boxed/mutmut

When This Skill Applies

  • User asks to "validate test quality" or "check test effectiveness"
  • User mentions "mutation testing" or "mutation score"
  • User wants to know if tests are "actually testing anything"
  • High coverage but bugs still escaping
  • Assessing test suite health
  • Pre-release quality validation

Trigger Phrases

Natural LanguageAction
"Run mutation testing"Execute mutation analysis
"Check if my tests are effective"Run mutation + analyze
"Validate test quality"Mutation score report
"Are my tests catching real bugs?"Mutation analysis
"Find weak tests"Identify low-score tests
"Why did this bug escape tests?"Mutation analysis on module

Mutation Testing Concepts

What is a Mutant?

A mutant is a small code change that should cause tests to fail:

// Original
if (age >= 18) { return "adult"; }

// Mutant 1: Changed >= to >
if (age > 18) { return "adult"; }

// Mutant 2: Changed >= to ==
if (age == 18) { return "adult"; }

// Mutant 3: Changed "adult" to ""
if (age >= 18) { return ""; }

Mutation Operators

OperatorExampleTests
Arithmetic+-Math operations
Relational>=>Boundary conditions
Logical&&||Boolean logic
LiteraltruefalseConstant handling
Returnreturn xreturn nullReturn value handling

Mutation Score

Mutation Score = (Killed Mutants / Total Mutants) × 100
ScoreQualityInterpretation
90%+ExcellentTests are highly effective
80-89%GoodTarget for production
60-79%AdequateRoom for improvement
<60%PoorTests need significant work

Implementation Process

1. Detect Project and Install Tool

def setup_mutation_tool(project_type):
    if project_type == "javascript":
        # Install Stryker
        return "npx stryker init"
    elif project_type == "python":
        # Install mutmut
        return "pip install mutmut"
    elif project_type == "java":
        # PITest via Maven/Gradle
        return "Add pitest plugin to pom.xml"

2. Configure Mutation Testing

Stryker (JavaScript):

// stryker.config.json
{
  "mutate": ["src/**/*.ts", "!src/**/*.test.ts"],
  "testRunner": "vitest",
  "reporters": ["html", "progress"],
  "coverageAnalysis": "perTest",
  "thresholds": {
    "high": 80,
    "low": 60,
    "break": 50
  }
}

mutmut (Python):

# setup.cfg
[mutmut]
paths_to_mutate=src/
tests_dir=tests/
runner=pytest

PITest (Java):

<!-- pom.xml -->
<plugin>
    <groupId>org.pitest</groupId>
    <artifactId>pitest-maven</artifactId>
    <version>1.15.0</version>
    <configuration>
        <targetClasses>
            <param>com.example.*</param>
        </targetClasses>
        <mutationThreshold>80</mutationThreshold>
    </configuration>
</plugin>

3. Run Mutation Analysis

# JavaScript
npx stryker run

# Python
mutmut run

# Java
mvn org.pitest:pitest-maven:mutationCoverage

4. Parse and Report Results

def parse_mutation_results(report_path):
    """Parse mutation testing report"""
    return {
        "total_mutants": 150,
        "killed": 120,
        "survived": 25,
        "timeout": 5,
        "mutation_score": 80.0,
        "survivors": [
            {
                "file": "src/auth/validate.ts",
                "line": 45,
                "mutator": "RelationalOperator",
                "original": "age >= 18",
                "mutant": "age > 18",
                "status": "survived"
            }
            # ... more survivors
        ]
    }

Output Format

## Mutation Testing Report

**Module**: src/auth/
**Test Suite**: test/auth/

### Summary

| Metric | Value |
|--------|-------|
| Total Mutants | 150 |
| Killed | 120 (80%) |
| Survived | 25 (17%) |
| Timeout | 5 (3%) |
| **Mutation Score** | **80%** |

### Status: PASSED (threshold: 80%)

### Survived Mutants (Highest Priority)

#### 1. `src/auth/validate.ts:45`
```diff
- if (age >= 18) { return "adult"; }
+ if (age > 18) { return "adult"; }

Problem: Boundary condition not tested Fix: Add test case for age = 18

2. src/auth/login.ts:23

- if (attempts < maxAttempts) { allow(); }
+ if (attempts <= maxAttempts) { allow(); }

Problem: Off-by-one boundary not tested Fix: Add test for attempts = maxAttempts

  1. Add boundary tests for validate.ts (3 survivors)
  2. Add error path tests for login.ts (2 survivors)
  3. Test null/undefined cases in session.ts (1 survivor)

Coverage vs Mutation Score

FileLine CoverageMutation ScoreGap
validate.ts95%72%23%
login.ts88%85%3%
session.ts100%91%9%

High coverage with low mutation score indicates weak assertions


## Integration with CI

### GitHub Actions Integration

```yaml
- name: Run mutation testing
  run: npx stryker run --reporters json

- name: Check mutation threshold
  run: |
    SCORE=$(jq '.metrics.mutationScore' reports/mutation/stryker-incremental.json)
    if (( $(echo "$SCORE < 80" | bc -l) )); then
      echo "::error::Mutation score $SCORE% below 80% threshold"
      exit 1
    fi

Optimization Tips

Incremental Mutation Testing

Only test changed code:

# Stryker incremental
npx stryker run --incremental

# PITest history
mvn pitest:mutationCoverage -DwithHistory

Target Critical Modules First

{
  "mutate": [
    "src/auth/**/*.ts",
    "src/payment/**/*.ts",
    "src/validation/**/*.ts"
  ]
}
  • tdd-enforce - Enforce test-first development
  • flaky-detect - Identify unreliable tests
  • test-sync - Maintain test-code alignment

Script Reference

mutation_runner.py

Run mutation testing for project:

python scripts/mutation_runner.py --module src/auth

mutation_analyzer.py

Analyze and prioritize survivors:

python scripts/mutation_analyzer.py --report stryker-report.json

スコア

総合スコア

75/100

リポジトリの品質指標に基づく評価

SKILL.md

SKILL.mdファイルが含まれている

+20
LICENSE

ライセンスが設定されている

+10
説明文

100文字以上の説明がある

+10
人気

GitHub Stars 100以上

0/15
最近の活動

3ヶ月以内に更新

+5
フォーク

10回以上フォークされている

0/5
Issue管理

オープンIssueが50未満

+5
言語

プログラミング言語が設定されている

+5
タグ

1つ以上のタグが設定されている

+5

レビュー

💬

レビュー機能は近日公開予定です