Monday, 23 February 2015

Mutation Testing


Mutation Testing in details

In Mutation Testing, we mutate (change) certain statements in the source code and check if the test cases are able to find the errors. It is a type of white box testing which is mainly used for unit testing. The changes in mutant program are kept extremely small, so it does not affect the overall objective of the program.
The goal of Mutation Testing is to assess the quality of the test cases which should be robust enough to fail mutant code. This method is also called as Fault based testing strategy as it involves creating fault in the program
Mutation was originally proposed in 1971 but lost fervor due to high costs involved. Now, again it has picked steam and is widely used for languages such as Java and XML.

 

How to execute mutation testing?

Following are the steps to execute mutation testing:
Step 1: Faults are introduced into the source code of the program by creating many versions called mutants. Each mutant should contain a single fault, and the goal is to cause the mutant version to fail which demonstrates the effectiveness of the test cases.
Step 2: Test cases are applied to the original program and also to the mutant program. A test case should be adequate, and it is tweaked to detect faults in a program.
Step 3: Compare the results of original and mutant program.
Step 4: If the original program and mutant programs generate the same output, then that the mutant is killed by the test case. Hence the test case is good enough to detect the change between the original and the mutant program.
Step 5: If the original program and mutant program generate different output, Mutant is kept alive. In such cases , more effective test cases need to be created that  kill all mutants.

 

How to Create Mutant Programs?

A mutation is nothing but a single syntactic change that is made to the program statement. Each mutant program should differ from the original program by one mutation.


Original Program 
Mutant Program 
If (x>y)
Print "Hello"
Else
Print "Hi"

If(x< strong="">)
Print "Hello"
Else
Print "Hi"


What to change in a Mutant Program?

There are several techniques that could be used to generate mutant programs. Let's look at them 
Operand 
replacement
 operators 
Expression 
Modification 
Operators 
Statement
modification 
Operators 
Replace the 
operand with 
another 
 operand(x with 
y or y with x) or 
with the 
constant value.

Replace an 
operator or 
insertion
 of new 
operators in 
a program 
statement.

Programmatic
 statements are 
modified to 
create mutant 
programs.

Example-
If(x>y) replace x 
and y values
If(5>y) replace x
 by constant 5

Example-
If(x==y)
We can 
replace == 
into >= and have
 mutant program 
as
If(x>=y) and
 inserting ++ in 
the statement
If(x==++y)

Example-
Delete the else
 part in an if-else 
statement
Delete the entire 
if-else statement
 to check
 how program 
behaves
Some of sample 
mutation operators:
· GOTO label 
replacement
· Return statement
 replacement
· Statement 
deletion
· Unary operator 
insertion(Like - and ++)
· Logical connector
 replacement
· Comparable array 
name replacement
· Removing of else 
part in the if-else statement
· Adding or replacement 
of operators
· Statement replacement by
 changing the data
· Data Modification for the
 variables
· Modification of data types
 in the program



Automation of Mutation Testing:
Mutation testing is extremely time consuming and complicated to execute manually. To speed up the process, it is advisable to go for automation tools. Automation tools reduce cost of testing as well.

List of tools available -
Ninja Turtles- .net mutation testing tool
MutagenesisPHP mutation testing framework
Jester- Mutation Testing Tool for Java

 

Mutation Score:

The mutation score is defined as the percentage of killed mutants with the total number of mutants.
· Mutation Score = (Killed Mutants / Total number of Mutants) * 100

Test cases are mutation adequate if the score is 100%. Experimental results have shown that mutation testing is an effective approach for the measuring the adequacy of the test cases. But, the main drawback is that the high cost of generating the mutants and executing each test case against that mutant program.

 

Advantages and Disadvantages of Mutation Testing:

Following are the advantages of Mutation Testing:
· It is a powerful approach to attain high coverage of the source program.
· This testing is capable comprehensively testing the mutant program.
· Mutation testing brings a good level of error detection to the software developer.
· This method uncovers ambiguities in the source code, and has the capacity to  detect all the faults in the program.
· Customers are benefited from this testing by getting most reliable and stable system.
On the other side, following are the disadvantages of Mutant testing:
· Mutation testing is extremely costly and time consuming since there are many mutant programs that need to be generated.
· Since its time consuming, it's fair to say that this testing cannot be done without an automation tool.
· Each mutation will have the same number of test cases than that of the original program. So, a large number of mutant programs may need to be tested against the original test suite.
· As this method involves source code changes, it is not at all applicable for black box testing.

 

Conclusion:

Do you want an exhaustive testing of your application? Answer is Mutation testing. It is the most comprehensive technique to test a program. This is the method which checks for the effectiveness and accuracy of a testing program to detect the faults or errors in the system.

No comments:

Post a Comment