Mutation Testing Baselines

Audience: engineers raising test quality on critical Stella Ops modules, and reviewers tracking mutation-score progress against targets.

Mutation testing (via Stryker.NET) measures test effectiveness: it injects small code changes (“mutants”) and checks whether the test suite catches them. A high score means the tests genuinely assert behavior rather than merely executing code. This document tracks the agreed baselines and targets for critical modules; for how to write and run the tests, see the Mutation Testing Guide.

Sprint: SPRINT_0353_0001_0001_mutation_testing_integration Task: MUT-0353-005

Baseline Scores

These are point-in-time baselines, not live scores — re-run Stryker for current numbers. Initial Score is the value recorded when the baseline was established; Target Score is the gate the module is working toward.

ModuleInitial ScoreTarget ScoreDate Established
Scanner.Core72%≥ 80%2025-12-16
Policy.Engine68%≥ 80%2025-12-16
Authority.Core75%≥ 85%2025-12-16
Signer.Core70%≥ 80%TBD
Attestor.Core65%≥ 80%TBD
Reachability.Core60%≥ 75%TBD

Threshold Configuration

See stryker-thresholds.json for per-module threshold configuration.

Mutation Operators Applied

OperatorDescriptionEnabled
ArithmeticReplace +, -, *, /, %
BooleanFlip true/false
ComparisonReplace <, >, <=, >=, ==, !=
LogicalReplace &&,
StringMutate string literals
LinqMutate LINQ methods
NullCoalescingMutate ?? operators
AssignmentMutate assignment operators

Exclusions

The following patterns are excluded from mutation testing:

Running Mutation Tests

Local Execution

# Run mutation tests for a specific module
cd src/Scanner/__Libraries/StellaOps.Scanner.Core
dotnet stryker

# Run with specific configuration
dotnet stryker -f stryker-config.json --reporter html

# Quick mode (fewer mutations, faster feedback)
dotnet stryker --since:main

CI Execution

Mutation tests run on:

Results are uploaded as artifacts and published to the mutation testing dashboard.

Improving Mutation Score

  1. Add missing test cases - Cover edge cases revealed by surviving mutants
  2. Strengthen assertions - Replace weak assertions with specific ones
  3. Test boundary conditions - Cover off-by-one and boundary scenarios
  4. Add negative tests - Test that invalid inputs are rejected

References