A more general definition of mutation analysis is using well-defined rules defined on syntactic structures to make systematic changes to software artifacts.
[9] Recently, with the availability of massive computing power, there has been a resurgence of mutation analysis within the computer science community, and work has been done to define methods of applying mutation testing to object oriented programming languages and non-procedural languages such as XML, SMV, and finite-state machines.
In 2004, a company called Certess Inc. (now part of Synopsys) extended many of the principles into the hardware verification domain.
This extension means that all three stages of verification, namely: activation, propagation, and detection are evaluated.
Codenomicon[10] (2001) and Mu Dynamics (2005) evolved fuzzing concepts to a fully stateful mutation testing platform, complete with monitors for thoroughly exercising protocol implementations.
Equivalent mutants detection is one of biggest obstacles for practical usage of mutation testing.
[17] A 2014 systematic literature review of a wide range of approaches to overcome the Equivalent Mutant Problem[18] identified 17 relevant techniques (in 22 articles) and three categories of techniques: detecting (DEM); suggesting (SEM); and avoiding equivalent mutant generation (AEMG).
The experiment indicated that Higher Order Mutation in general and JudyDiffOp strategy in particular provide a promising approach to the Equivalent Mutant Problem.
To make syntactic changes to a program, a mutation operator serves as a guideline that substitutes portions of the source code.
There are also mutation operators for object-oriented languages,[22] for concurrent constructions,[23] complex objects like containers,[24] etc.
Operators at the class level alter the program's structure by adding, removing, or changing the expressions being examined.
[26] This technique is crucial in software testing as it helps identify potential weaknesses or errors in the code.
By deliberately making changes to the code and observing how it behaves, developers can uncover hidden bugs or flaws that might go unnoticed during regular testing.
[27] Statement mutation is like a diagnostic tool that provides insights into the code's robustness and resilience, helping programmers improve the overall quality and reliability of their software.
It helps ensure that the code can accurately and efficiently process these larger values without encountering errors or unexpected issues.
Ensuring that the code performs correctly with smaller values is essential to prevent unforeseen problems or errors when dealing with such input data.
[26] For example: Decision mutation testing centers on the identification of design errors within the code, with a particular emphasis on detecting flaws or weaknesses in the program's decision-making logic.
This method involves deliberately altering arithmetic and logical operators to expose potential issues.
[26] By manipulating these operators, developers can systematically evaluate how the code responds to different decision scenarios.
This process helps ensure that the program's decision-making pathways are robust and accurate, preventing costly errors that could arise from faulty logic.