Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
56 changes: 56 additions & 0 deletions docs/core/testing/mutation-testing.md
Original file line number Diff line number Diff line change
Expand Up @@ -110,6 +110,62 @@ Stryker supports several types of mutations:

For additional mutation types, see the [Stryker.NET: Mutations](https://stryker-mutator.io/docs/stryker-net/mutations) documentation.

## Interpret mutation testing results

After running Stryker.NET, you'll receive a report that categorizes mutants as **killed**, **survived**, or **timeout**. Here's how to interpret and act on these results:

- **Killed**: These are changes that your tests successfully caught. A high number of killed mutants indicates that your test suite effectively detects logic errors.

- **Survived**: These changes weren't caught by your tests. Review them to identify gaps in test coverage or assertions that are too weak. Focus on adding targeted unit tests that would fail if the mutant were real.
Comment on lines +117 to +119
Copy link

Copilot AI Dec 28, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

According to the Markdown writing style guidelines, lists should use complete sentences with proper punctuation. The list items on lines 117-121 are complete sentences but only the last item has a period. Add periods to the end of lines 117 and 119 for consistency.

Copilot generated this review using guidance from repository custom instructions.

- **Timeout**: These mutations caused your code to hang or exceed the allowed time. This can happen with infinite loops or unoptimized paths. Investigate the code logic or increase the timeout threshold if needed.

> [!NOTE]
> Don't chase a 100% mutation score. Instead, focus on high-risk or business-critical areas where undetected bugs would be most costly.

## Adding mutation testing to your CI/CD workflow

You can seamlessly integrate mutation testing into your continuous integration and delivery workflows. For instance, Stryker.NET can be configured to run within your Azure Pipelines or GitHub Actions setup, allowing you to enforce quality thresholds as part of your automated testing process.
Copy link

Copilot AI Dec 28, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The phrase "can be configured" is passive voice. According to the Markdown writing style guidelines, use active voice. Consider rephrasing to "You can configure Stryker.NET to run within your Azure Pipelines or GitHub Actions setup" or "Configure Stryker.NET to run within your Azure Pipelines or GitHub Actions setup".

Copilot generated this review using guidance from repository custom instructions.

Add the following to your `stryker-config.json` file to set mutation score thresholds:

```json
{
"thresholds": {
"high": 85,
"low": 65,
"break": 0
}
}
```

## Customization

Besides setting thresholds for your pipeline, Stryker.NET offers the possibility of having different configurations for each of your project needs. You can do this customization of behavior using the _stryker-config.json_ file.
Copy link

Copilot AI Dec 28, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The phrase "offers the possibility of having different configurations" is unnecessarily wordy. Following the guideline to use simpler, more direct language, rephrase to "supports different configurations" or "allows different configurations".

Copilot generated this review using guidance from repository custom instructions.
Copy link

Copilot AI Dec 28, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The file reference "stryker-config.json" should use code formatting according to the .NET documentation guidelines. Change "stryker-config.json" to "stryker-config.json" for proper file name formatting.

Copilot generated this review using guidance from repository custom instructions.

```json
{
"ignore-mutations": [
"ToString",
"Equals",
"GetHashCode"
],
"ignore-methods": [
"*Logs"
]
Copy link

Copilot AI Dec 28, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The JSON configuration is missing a comma after the closing bracket of the "ignore-methods" array. This will cause a JSON parsing error. Add a comma after line 155 before "mutate".

Suggested change
]
],

Copilot uses AI. Check for mistakes.
Copy link

Copilot AI Dec 28, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The JSON configuration is missing a comma after the closing bracket of the "ignore-mutations" array. This will cause a JSON parsing error. Add a comma after line 152 before "ignore-methods".

Suggested change
]
],

Copilot uses AI. Check for mistakes.
"mutate": [
"!**/Migrations/*",
"!**/*.Designer.cs"
]
}
```

- **ignore-mutations**: These are the methods or expressions that you want to ignore because they are noisy, or you consider not needed based on your application logic needs. They will show up in your reports as `Ignored`.
Copy link

Copilot AI Dec 28, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The phrase "or you consider not needed" is grammatically incorrect. Change it to "or you consider them not needed" or better yet, simplify to "or aren't needed" to follow the guideline of using contractions and simpler language.

Copilot uses AI. Check for mistakes.
- **ignore-methods**: You can use this to skip entire methods based on their signatures. Also, those will appear in your reports as Ignored. In our example, we ignore all methods ending in "Logs".
Copy link

Copilot AI Dec 28, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The description list items should use consistent punctuation. Since these are complete sentences, add a period at the end of line 164 to match the style of line 165.

Copilot generated this review using guidance from repository custom instructions.
Copy link

Copilot AI Dec 28, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This sentence has a grammatical error and doesn't follow the guideline to use simple, concise language. Consider rephrasing to: "Also, these appear in your reports as Ignored." or better yet, "These also appear in your reports as Ignored." using active voice.

Copilot generated this review using guidance from repository custom instructions.
- **mutate**: Without this option, Stryker will try to mutate all the files in your project. With this, you can ignore files or entire folders. In the example above, we ignore everything inside a _Migrations_ folder and all _.Designer.cs_ files (which are usually autogenerated) .
Copy link

Copilot AI Dec 28, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The phrase "everything inside a Migrations folder" is missing proper Markdown formatting. According to the guidelines, file names and folders should use code formatting. Change "Migrations" to "Migrations" for consistency with the code formatting convention.

Copilot generated this review using guidance from repository custom instructions.
Copy link

Copilot AI Dec 28, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The phrase "all .Designer.cs files" should use code formatting instead of italic. According to the guidelines, file names should use code formatting. Change ".Designer.cs" to ".Designer.cs" for consistency.

Copilot generated this review using guidance from repository custom instructions.
Copy link

Copilot AI Dec 28, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

There's an extra space before the closing parenthesis. Remove the space before the period in "(which are usually autogenerated) ." to make it "(which are usually autogenerated)."

Suggested change
- **mutate**: Without this option, Stryker will try to mutate all the files in your project. With this, you can ignore files or entire folders. In the example above, we ignore everything inside a _Migrations_ folder and all _.Designer.cs_ files (which are usually autogenerated) .
- **mutate**: Without this option, Stryker will try to mutate all the files in your project. With this, you can ignore files or entire folders. In the example above, we ignore everything inside a _Migrations_ folder and all _.Designer.cs_ files (which are usually autogenerated).

Copilot uses AI. Check for mistakes.

For more information, see [Stryker: Configuration](https://stryker-mutator.io/docs/stryker-net/configuration/).

## Incremental improvement

If, after changing your code, the unit tests pass successfully, then they aren't sufficiently robust, and the mutant survived.
Expand Down