Although itās often called Mutation Testing itās not actually Testing, itās more an analysis ā therefore itās sometimes also referred to as āMutation Analysisā ā because it analyzes your Unit Test Suite, if itās capable of finding bugs by injecting modifications based on a ruleset (mutation operators) into your product code and run your unit test suite against it to see if itās capable of finding this modification (= killing the mutant).
Itās completely automated, so you donāt have to do anything for this, but you need to interpret the results and eventually derive actions from them.
There are two statistics,
The first sets the goal for the Unit Test foundation of every test automation pyramid. And the second validates, that mutation testing is a valid way of verifying how close we are to that goal (if its capable of killing a mutant, itās also capable of killing a bug coupled to that mutant).
Q1
If youāre on Java, pitest.org is certainly the way to go, mature tooling, well documented, active community. Applying it to your project is pretty straight forward:
And youāll get a nice report, which mutations your unit test suite was not able to kill. Further you get a āMutation Scoreā, which is a percentage of how many mutants got killed. This is a far better indicator of your test coverage than line or branch coverage. If you achieve a high 90%, youāre pretty close to the 77% goal mentioned above.
In case your project is big (i.e. > 20kloc) you should consider limiting the scope (i.e. by applying a package filter) because Mutation Testing requires much processing power which increases exponentially with the size of the code base.
If youāre on JavaScript or TypeScript, https://github.com/stryker-mutator/stryker-mutator.github.io is the tool, though I donāt have much practical experience with it (I donāt do much JS dev)
Q2
Yes, once I started with mutation testing, I use it in all my (Java) projects for some reasons.
- Itās conducting an automated review of my unit test. No human could provide me the same information in the same amount of time.
- Because itās automated, itās very easy to apply (at least for Java, donāt know about the other languages), apart from a strong CPU it doesnāt need much effort from my side.
- It totally changed the way I create my Unit Test Suites, how I write those tests. I do it in a much more systematic way than I did before.
- It effectively helps me close the gaps in my Unit Test Suites, I use Line/Branch Coverage only as weak indicators, once Iām at ~70-80% Line or Branch Coverage, I start mutation testing, sometimes even a bit earlier, especially if I have some unit tests for more complicated code.
- In some cases it actually found a gap in my unit test suite, that didnāt find a bug which was actually there. Although I had Line/Branch Coverage on that part.
- When Iām on a tester role, it gives much better confidence on the quality of the unit test suite the programmers wrote, so I can concentrate on more interesting matters to test
- I donāt do code reviews for unit tests anymore. If I do, I only look on style aspects, but not the functionality (brains are not made to run the code, we computers for that)
Q3
see Q1, stryker and pitest are the tools do conduct mutation testing in JavaScript respectively Java.
My (incomplete) List of Mutation Testing tools
Java
- Pitest http://pitest.org/ <-- use this one, best you can get for free, also for Scala & Kotlin
For Java, I would avoid the following one, because there are more from academic research and most of them are no longer maintained
- muJava
- Jester
- Judy
- Javalanche
- Jumble
- Major
JavaScript
Ruby
.Net/Mono/C#
PHP
Haskel
(and sorry for the link obfuscations, as newbie Iām only allowed to add 2 links)