协作头脑风暴
brainstorming
在实现前澄清需求、探索设计选择,并形成清晰的开发方向。
running-mutation-tests【开发与工程】Execute mutation testing to evaluate test suite effectiveness. Use when performing specialized testing. Trigger with phrases like "run mutation tests", "test the tests", or "validate test effectiveness".
独立 GitHub 快照 · 自动分类 · 以原作者文档为准
name: running-mutation-tests description: 'Execute mutation testing to evaluate test suite effectiveness.
Use when performing specialized testing.
Trigger with phrases like "run mutation tests", "test the tests", or "validate test effectiveness".
' allowed-tools: Read, Write, Edit, Grep, Glob, Bash(test:mutation-*) version: 1.27.0 author: Jeremy Longshore jeremy@intentsolutions.io license: MIT tags:
Execute mutation testing to evaluate the effectiveness of a test suite by systematically introducing small code changes (mutants) and checking whether existing tests detect them. A killed mutant means the tests caught the change; a surviving mutant reveals a testing gap.
stryker.config.mjs with mutate patterns, test runner, and thresholds.setup.cfg or pyproject.toml with [mutmut] section.npx stryker run, mutmut run, or mvn pitest:mutationCoverage.| Error | Cause | Solution |
|---|---|---|
| Mutation run takes hours | Too many files in scope or slow test suite | Narrow mutate scope to critical modules; use --incremental mode; parallelize with --concurrency |
| All mutants survive | Tests only check for truthiness, not specific values | Strengthen assertions -- use toBe(42) instead of toBeTruthy(); add boundary checks |
| Equivalent mutant false positive | Mutation produces functionally identical code (e.g., x >= 0 vs x > -1) | Mark as equivalent in config; ignore in score calculation; document rationale |
| Out of memory during run | Too many concurrent mutation workers | Reduce --concurrency setting; increase Node.js --max-old-space-size; reduce shard size |
| Stryker "initial test run failed" | Test suite does not pass cleanly before mutations begin | Fix all failing tests first; ensure npm test exits 0; check test runner configuration |
Stryker configuration for TypeScript project:
// stryker.config.mjs
export default {
mutate: ['src/**/*.ts', '!src/**/*.d.ts', '!src/**/index.ts'],
testRunner: 'jest',
jest: { configFile: 'jest.config.ts' },
reporters: ['html', 'clear-text', 'progress'],
thresholds: { high: 80, low: 60, break: 50 },
concurrency: 4,
timeoutMS: 10000, # 10000: 10 seconds in ms
};
Example surviving mutant and fix:
Mutant: src/utils/discount.ts:15 -- ConditionalExpression
Original: if (total > 100)
Mutant: if (total >= 100)
Status: SURVIVED
Fix -- add boundary test:
it('does not apply discount at exactly 100', () => {
expect(calculateDiscount(100)).toBe(0);
});
it('applies discount above 100', () => {
expect(calculateDiscount(101)).toBe(10.1);
});
mutmut for Python:
# Run mutation testing
mutmut run --paths-to-mutate=src/ --tests-dir=tests/
# View surviving mutants
mutmut results
# Inspect a specific mutant
mutmut show 42