All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.evosuite.testcase.factories.JUnitTestCarvedChromosomeFactory Maven / Gradle / Ivy

The newest version!
/**
 * Copyright (C) 2010-2018 Gordon Fraser, Andrea Arcuri and EvoSuite
 * contributors
 *
 * This file is part of EvoSuite.
 *
 * EvoSuite is free software: you can redistribute it and/or modify it
 * under the terms of the GNU Lesser General Public License as published
 * by the Free Software Foundation, either version 3.0 of the License, or
 * (at your option) any later version.
 *
 * EvoSuite is distributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 * Lesser Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with EvoSuite. If not, see .
 */
package org.evosuite.testcase.factories;

import java.util.ArrayList;
import java.util.List;

import org.evosuite.Properties;
import org.evosuite.coverage.FitnessFunctions;
import org.evosuite.ga.ChromosomeFactory;
import org.evosuite.rmi.ClientServices;
import org.evosuite.rmi.service.ClientNodeLocal;
import org.evosuite.statistics.RuntimeVariable;
import org.evosuite.testcarver.extraction.CarvingManager;
import org.evosuite.testcase.TestCase;
import org.evosuite.testcase.TestChromosome;
import org.evosuite.testsuite.TestSuiteChromosome;
import org.evosuite.testsuite.TestSuiteFitnessFunction;
import org.evosuite.utils.LoggingUtils;
import org.evosuite.utils.Randomness;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class JUnitTestCarvedChromosomeFactory implements
        ChromosomeFactory {

	private static final long serialVersionUID = -569338946355072318L;

	private static final Logger logger = LoggerFactory.getLogger(JUnitTestCarvedChromosomeFactory.class);

	private final List junitTests = new ArrayList();

	private final ChromosomeFactory defaultFactory;

	// These two variables will go once the new statistics frontend is finally finished
	private static int totalNumberOfTestsCarved = 0;

	private static double carvedCoverage = 0.0;

	/**
	 * The carved test cases are used only with a certain probability P. So,
	 * with probability 1-P the 'default' factory is rather used.
	 * 
	 * @param defaultFactory
	 * @throws IllegalStateException
	 *             if Properties are not properly set
	 */
	public JUnitTestCarvedChromosomeFactory(
	        ChromosomeFactory defaultFactory)
	        throws IllegalStateException {
		this.defaultFactory = defaultFactory;
		readTestCases();
	}


	private void readTestCases() throws IllegalStateException {
		CarvingManager manager = CarvingManager.getInstance();
		final Class targetClass = Properties.getTargetClassAndDontInitialise();
		List tests = manager.getTestsForClass(targetClass);
		junitTests.addAll(tests);

		if (junitTests.size() > 0) {
			totalNumberOfTestsCarved = junitTests.size();

			LoggingUtils.getEvoLogger().info("* Using {} carved tests from existing JUnit tests for seeding",
			                                 junitTests.size());
			if (logger.isDebugEnabled()) {
				for (TestCase test : junitTests) {
					logger.debug("Carved Test: {}", test.toCode());
				}
			}

			TestSuiteChromosome suite = new TestSuiteChromosome();
			for (TestCase test : junitTests) {
				suite.addTest(test);
			}

			for (Properties.Criterion pc : Properties.CRITERION) {
				TestSuiteFitnessFunction f = FitnessFunctions.getFitnessFunction(pc);
				f.getFitness(suite);
			}
			carvedCoverage = suite.getCoverage();
		}
		
		ClientNodeLocal client = ClientServices.getInstance().getClientNode();
		client.trackOutputVariable(RuntimeVariable.CarvedTests, totalNumberOfTestsCarved);
		client.trackOutputVariable(RuntimeVariable.CarvedCoverage,carvedCoverage);
	}

	public boolean hasCarvedTestCases() {
		return junitTests.size() > 0;
	}

	public int getNumCarvedTestCases() {
		return junitTests.size();
	}

	public List getCarvedTestCases() {
		return junitTests;
	}

	public TestSuiteChromosome getCarvedTestSuite() {
		TestSuiteChromosome testSuite = new TestSuiteChromosome();
		for (TestCase t : junitTests) {
			testSuite.addTest(t);
		}
		return testSuite;
	}

	@Override
	public TestChromosome getChromosome() {
		final int N_mutations = Properties.SEED_MUTATIONS;
		final double P_clone = Properties.SEED_CLONE;

		double r = Randomness.nextDouble();

		if (r >= P_clone || junitTests.isEmpty()) {
			logger.debug("Using random test");
			return defaultFactory.getChromosome();
		}

		// Cloning
		logger.info("Cloning user test");
		TestCase test = Randomness.choice(junitTests);
		TestChromosome chromosome = new TestChromosome();
		chromosome.setTestCase(test.clone());
		if (N_mutations > 0) {
			int numMutations = Randomness.nextInt(N_mutations);
			logger.debug("Mutations: " + numMutations);

			// Delta
			for (int i = 0; i < numMutations; i++) {
				chromosome.mutate();
			}
		}

		return chromosome;
	}

	public static int getTotalNumberOfTestsCarved() {
		return totalNumberOfTestsCarved;
	}

	public static double getCoverageOfCarvedTests() {
		return carvedCoverage;
	}

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy