use of org.evosuite.testcase.statements.Statement in project evosuite by EvoSuite.
the class AbstractMOSA method removeUnusedVariables.
/**
* When a test case is changed via crossover and/or mutation, it can contains some
* primitive variables that are not used as input (or to store the output) of method calls.
* Thus, this method removes all these "trash" statements.
* @param chromosome
* @return true or false depending on whether "unused variables" are removed
*/
public boolean removeUnusedVariables(T chromosome) {
int sizeBefore = chromosome.size();
TestCase t = ((TestChromosome) chromosome).getTestCase();
List<Integer> to_delete = new ArrayList<Integer>(chromosome.size());
boolean has_deleted = false;
int num = 0;
for (Statement s : t) {
VariableReference var = s.getReturnValue();
boolean delete = false;
delete = delete || s instanceof PrimitiveStatement;
delete = delete || s instanceof ArrayStatement;
delete = delete || s instanceof StringPrimitiveStatement;
if (!t.hasReferences(var) && delete) {
to_delete.add(num);
has_deleted = true;
}
num++;
}
Collections.sort(to_delete, Collections.reverseOrder());
for (Integer position : to_delete) {
t.remove(position);
}
int sizeAfter = chromosome.size();
if (has_deleted)
logger.debug("Removed {} unused statements", (sizeBefore - sizeAfter));
return has_deleted;
}
use of org.evosuite.testcase.statements.Statement in project evosuite by EvoSuite.
the class AbstractMOSA method mutate.
/**
* Method used to mutate an offspring
*/
private void mutate(T offspring, T parent) {
offspring.mutate();
TestChromosome tch = (TestChromosome) offspring;
if (!offspring.isChanged()) {
// if offspring is not changed, we try
// to mutate it once again
offspring.mutate();
}
if (!hasMethodCall(offspring)) {
tch.setTestCase(((TestChromosome) parent).getTestCase().clone());
boolean changed = tch.mutationInsert();
if (changed) {
for (Statement s : tch.getTestCase()) s.isValid();
}
offspring.setChanged(changed);
}
notifyMutation(offspring);
}
use of org.evosuite.testcase.statements.Statement in project evosuite by EvoSuite.
the class AbstractMOSA method hasMethodCall.
/**
* This method checks whether the test has only primitive type statements. Indeed,
* crossover and mutation can lead to tests with no method calls (methods or constructors call),
* thus, when executed they will never cover something in the class under test.
*
* @param test to check
* @return true if the test has at least one method or constructor call (i.e., the test may
* cover something when executed; false otherwise
*/
private boolean hasMethodCall(T test) {
boolean flag = false;
TestCase tc = ((TestChromosome) test).getTestCase();
for (Statement s : tc) {
if (s instanceof MethodStatement) {
MethodStatement ms = (MethodStatement) s;
boolean isTargetMethod = ms.getDeclaringClassName().equals(Properties.TARGET_CLASS);
if (isTargetMethod)
return true;
}
if (s instanceof ConstructorStatement) {
ConstructorStatement ms = (ConstructorStatement) s;
boolean isTargetMethod = ms.getDeclaringClassName().equals(Properties.TARGET_CLASS);
if (isTargetMethod)
return true;
}
}
return flag;
}
use of org.evosuite.testcase.statements.Statement in project evosuite by EvoSuite.
the class MethodCoverageTestFitness method getFitness.
/**
* {@inheritDoc}
*
* Calculate fitness
*
* @param individual
* a {@link org.evosuite.testcase.ExecutableChromosome} object.
* @param result
* a {@link org.evosuite.testcase.execution.ExecutionResult} object.
* @return a double.
*/
@Override
public double getFitness(TestChromosome individual, ExecutionResult result) {
double fitness = 1.0;
List<Integer> exceptionPositions = asSortedList(result.getPositionsWhereExceptionsWereThrown());
for (Statement stmt : result.test) {
if (!isValidPosition(exceptionPositions, stmt.getPosition())) {
break;
}
if ((stmt instanceof MethodStatement || stmt instanceof ConstructorStatement)) {
EntityWithParametersStatement ps = (EntityWithParametersStatement) stmt;
String className = ps.getDeclaringClassName();
String methodDesc = ps.getDescriptor();
String methodName = ps.getMethodName() + methodDesc;
if (this.className.equals(className) && this.methodName.equals(methodName)) {
fitness = 0.0;
break;
}
}
}
updateIndividual(this, individual, fitness);
if (fitness == 0.0) {
individual.getTestCase().addCoveredGoal(this);
}
if (Properties.TEST_ARCHIVE) {
Archive.getArchiveInstance().updateArchive(this, individual, fitness);
}
return fitness;
}
use of org.evosuite.testcase.statements.Statement in project evosuite by EvoSuite.
the class MethodNoExceptionCoverageTestFitness method getFitness.
/**
* {@inheritDoc}
*
* Calculate fitness
*
* @param individual
* a {@link org.evosuite.testcase.ExecutableChromosome} object.
* @param result
* a {@link org.evosuite.testcase.execution.ExecutionResult} object.
* @return a double.
*/
@Override
public double getFitness(TestChromosome individual, ExecutionResult result) {
double fitness = 1.0;
List<Integer> exceptionPositions = new ArrayList<Integer>();
if (Properties.BREAK_ON_EXCEPTION) {
// we consider only the first thrown exception
if (!result.getPositionsWhereExceptionsWereThrown().isEmpty()) {
int firstPosition = Collections.min(result.getPositionsWhereExceptionsWereThrown());
exceptionPositions.add(firstPosition);
}
} else {
// we consider all thrown exceptions (if any)
exceptionPositions.addAll(result.getPositionsWhereExceptionsWereThrown());
}
for (Statement stmt : result.test) {
if (exceptionPositions.contains(stmt.getPosition())) {
if (Properties.BREAK_ON_EXCEPTION)
// if we look at the first exception, then no need to iterate over the remaining statements
break;
else
// otherwise we simple skip statements throwing an exception
continue;
}
if ((stmt instanceof MethodStatement || stmt instanceof ConstructorStatement)) {
EntityWithParametersStatement ps = (EntityWithParametersStatement) stmt;
String className = ps.getDeclaringClassName();
String methodDesc = ps.getDescriptor();
String methodName = ps.getMethodName() + methodDesc;
if (this.className.equals(className) && this.methodName.equals(methodName)) {
fitness = 0.0;
break;
}
}
}
updateIndividual(this, individual, fitness);
if (fitness == 0.0) {
individual.getTestCase().addCoveredGoal(this);
}
if (Properties.TEST_ARCHIVE) {
Archive.getArchiveInstance().updateArchive(this, individual, fitness);
}
return fitness;
}
Aggregations