def split_chromosomes( self, ) -> Tuple[tsc.TestSuiteChromosome, tsc.TestSuiteChromosome]: """Split the chromosome into two chromosomes. The first one contains the non failing test cases. The second one contains the failing test cases. Returns: A tuple of passing and failing chromosomes """ best = self._get_best_individual() # Make sure all test cases have a cached result. best.get_fitness() non_failing = tsc.TestSuiteChromosome() failing = tsc.TestSuiteChromosome() for fitness_function in self._fitness_functions: non_failing.add_fitness_function(fitness_function) failing.add_fitness_function(fitness_function) for test_case in best.test_chromosomes: result = test_case.get_last_execution_result() assert result is not None if result.has_test_exceptions(): failing.add_test(test_case.clone()) else: non_failing.add_test(test_case.clone()) return non_failing, failing
def test_generate_sequence_duplicate(executor): test_cluster = MagicMock(TestCluster) test_cluster.accessible_objects_under_test = set() algorithm = RandomTestStrategy(executor, test_cluster) algorithm._random_public_method = lambda x: None test_case = dtc.DefaultTestCase() algorithm._random_test_cases = lambda x: [test_case] with pytest.raises(GenerationException): algorithm.generate_sequence( tsc.TestSuiteChromosome(), tsc.TestSuiteChromosome(), 0, )
def test_generate_sequence(has_exceptions, executor): exec_result = MagicMock(ExecutionResult) exec_result.has_test_exceptions.return_value = has_exceptions executor.execute.return_value = exec_result test_cluster = MagicMock(TestCluster) test_cluster.accessible_objects_under_test = set() algorithm = RandomTestStrategy(executor, test_cluster) algorithm._random_public_method = lambda x: None test_case = dtc.DefaultTestCase() test_case.add_statement(MagicMock(stmt.Statement)) algorithm._random_test_cases = lambda x: [test_case] with pytest.raises(GenerationException): algorithm.generate_sequence( tsc.TestSuiteChromosome(), tsc.TestSuiteChromosome(), 0, )
def chromosome(): chrom = tsc.TestSuiteChromosome() fitness_func = MagicMock(ff.FitnessFunction) chrom.add_fitness_function(fitness_func) chrom._update_fitness_values(fitness_func, ff.FitnessValues(0, 0)) chrom.set_changed(False) return chrom
def test_call_monkey_type( number_of_test_cases, execution_counter, test_cases, strategy ): config.INSTANCE.monkey_type_execution = 2 test_suite = tsc.TestSuiteChromosome() test_suite.add_tests(test_cases) strategy._call_monkey_type(number_of_test_cases, execution_counter, test_suite)
def test_eq_different_tests(chromosome): test_1 = dtc.DefaultTestCase() test_2 = dtc.DefaultTestCase() test_3 = MagicMock(tc.TestCase) other = tsc.TestSuiteChromosome() chromosome.add_tests([test_1, test_2]) other.add_tests([test_1, test_3]) assert not chromosome.__eq__(other)
def generate_sequences( self, ) -> Tuple[tsc.TestSuiteChromosome, tsc.TestSuiteChromosome]: stopping_condition = self.get_stopping_condition() stopping_condition.reset() test_chromosome: tsc.TestSuiteChromosome = tsc.TestSuiteChromosome() failing_test_chromosome: tsc.TestSuiteChromosome = tsc.TestSuiteChromosome( ) generation: int = 0 fitness_functions = self.get_fitness_functions() for fitness_function in fitness_functions: test_chromosome.add_fitness_function(fitness_function) failing_test_chromosome.add_fitness_function(fitness_function) combined_chromosome = self._combine_current_individual( test_chromosome, failing_test_chromosome) while (not self.is_fulfilled(stopping_condition) and combined_chromosome.get_fitness() != 0.0): try: generation += 1 stopping_condition.iterate() self.generate_sequence( test_chromosome, failing_test_chromosome, generation, ) combined_chromosome = self._combine_current_individual( test_chromosome, failing_test_chromosome) StatisticsTracker().current_individual(combined_chromosome) self._logger.info( "Generation: %5i. Best fitness: %5f, Best coverage %5f", generation, combined_chromosome.get_fitness(), combined_chromosome.get_coverage(), ) except (ConstructionFailedException, GenerationException) as exception: self._logger.debug( "Generate test case failed with exception %s", exception) self._logger.debug("Number of algorithm iterations: %d", generation) StatisticsTracker().track_output_variable( RuntimeVariable.AlgorithmIterations, generation) return test_chromosome, failing_test_chromosome
def get_chromosome(self) -> tsc.TestSuiteChromosome: chromosome = tsc.TestSuiteChromosome(self._test_case_factory) num_tests = randomness.next_int( config.INSTANCE.min_initial_tests, config.INSTANCE.max_initial_tests + 1 ) for _ in range(num_tests): chromosome.add_test(self._test_case_factory.get_test_case()) return chromosome
def test_mutate_no_changes(): test_case_factory = MagicMock(tcf.TestCaseFactory) chromosome = tsc.TestSuiteChromosome(test_case_factory) test_1 = MagicMock(tc.TestCase) test_1.size.return_value = 1 test_1.has_changed.return_value = True chromosome.add_test(test_1) chromosome.set_changed(False) with mock.patch("pynguin.utils.randomness.next_float") as float_mock: # Prevent any other mutations/insertions. float_mock.side_effect = [1.0, 1.0, 1.0] chromosome.mutate() assert chromosome.test_chromosomes == [test_1] assert not chromosome.has_changed()
def test_mutate_add_new_max_size(): test_case_factory = MagicMock(tcf.TestCaseFactory) test_case = MagicMock(tc.TestCase) test_case.size.return_value = 1 test_case_factory.get_test_case.return_value = test_case chromosome = tsc.TestSuiteChromosome(test_case_factory) chromosome.set_changed(False) config.INSTANCE.test_insertion_probability = 0.5 config.INSTANCE.max_size = 2 with mock.patch("pynguin.utils.randomness.next_float") as float_mock: float_mock.side_effect = [0.1, 0.1, 0.1] chromosome.mutate() assert test_case_factory.get_test_case.call_count == 2 assert chromosome.has_changed()
def test_crossover(chromosome): cases_a = [dtc.DefaultTestCase() for _ in range(5)] cases_b = [dtc.DefaultTestCase() for _ in range(5)] chromosome.add_tests(cases_a) other = tsc.TestSuiteChromosome() other.add_tests(cases_b) pos1 = randomness.next_int(len(cases_a)) pos2 = randomness.next_int(len(cases_b)) chromosome.set_changed(False) chromosome.cross_over(other, pos1, pos2) assert chromosome.test_chromosomes == cases_a[:pos1] + cases_b[pos2:] assert chromosome.has_changed()
def test_get_output_variables_with_content(sequence_factory, chromosome): def check_result(name: str, value: int, index: int): assert name == f"CoverageTimeline_T{index}" assert value == 42 config.INSTANCE.budget = 0.25 chromosome_2 = tsc.TestSuiteChromosome() sequence_factory.set_start_time(time.time_ns()) time.sleep(0.05) sequence_factory.update(chromosome) time.sleep(0.05) sequence_factory.update(chromosome_2) time.sleep(0.05) variables = sequence_factory.get_output_variables() [ check_result(var.name, var.value, index + 1) for index, var in enumerate(variables) ] assert len(variables) >= 0
def test_mutate_remove_empty(): test_case_factory = MagicMock(tcf.TestCaseFactory) chromosome = tsc.TestSuiteChromosome(test_case_factory) test_1 = MagicMock(tc.TestCase) test_1.size.return_value = 1 test_1.has_changed.return_value = True test_2 = MagicMock(tc.TestCase) test_2.size.return_value = 0 chromosome.add_test(test_1) chromosome.add_test(test_2) chromosome.set_changed(False) with mock.patch("pynguin.utils.randomness.next_float") as float_mock: # Prevent any other mutations/insertions. float_mock.side_effect = [1.0, 1.0, 1.0] chromosome.mutate() assert chromosome.test_chromosomes == [test_1] # A test case can only have a size of zero if it was mutated, but this already sets changed to True # So this check is valid assert not chromosome.has_changed()
def test_run_test_suite(): executor = MagicMock() result0 = MagicMock() result1 = MagicMock() result2 = MagicMock() executor.execute.side_effect = [result0, result1] ff = DummySuiteFitnessFunction(executor) indiv = tsc.TestSuiteChromosome() test_case0 = dtc.DefaultTestCase() test_case0.set_changed(True) test_case1 = dtc.DefaultTestCase() test_case1.set_changed(False) test_case2 = dtc.DefaultTestCase() test_case2.set_changed(False) test_case2.set_last_execution_result(result2) indiv.add_test(test_case0) indiv.add_test(test_case1) indiv.add_test(test_case2) assert ff._run_test_suite(indiv) == [result0, result1, result2] assert test_case0.get_last_execution_result() == result0 assert test_case1.get_last_execution_result() == result1
def test_mutate_existing(): test_case_factory = MagicMock(tcf.TestCaseFactory) chromosome = tsc.TestSuiteChromosome(test_case_factory) test_1 = MagicMock(tc.TestCase) test_1.size.return_value = 1 test_1.has_changed.return_value = True test_2 = MagicMock(tc.TestCase) test_2.size.return_value = 1 test_2.has_changed.return_value = False test_3 = MagicMock(tc.TestCase) test_3.size.return_value = 1 chromosome.add_test(test_1) chromosome.add_test(test_2) chromosome.set_changed(False) with mock.patch("pynguin.utils.randomness.next_float") as float_mock: float_mock.side_effect = [0.0, 0.0, 1.0, 1.0] chromosome.mutate() test_1.mutate.assert_called_once() test_2.mutate.assert_called_once() test_3.mutate.assert_not_called() assert chromosome.has_changed()
with Timer(name="Test generation time", logger=None): algorithm: TestGenerationStrategy = self._instantiate_test_generation_strategy( executor, test_cluster ) self._logger.info( "Start generating sequences using %s", config.INSTANCE.algorithm ) StatisticsTracker().set_sequence_start_time(time.time_ns()) non_failing, failing = algorithm.generate_sequences() self._logger.info( "Stop generating sequences using %s", config.INSTANCE.algorithm ) algorithm.send_statistics() with Timer(name="Re-execution time", logger=None): combined = tsc.TestSuiteChromosome() for fitness_func in non_failing.get_fitness_functions(): combined.add_fitness_function(fitness_func) combined.add_tests(non_failing.test_chromosomes) combined.add_tests(failing.test_chromosomes) StatisticsTracker().track_output_variable( RuntimeVariable.Coverage, combined.get_coverage() ) with Timer(name="Export time", logger=None): written_to = self._export_test_cases(non_failing.test_chromosomes) self._logger.info( "Export %i successful test cases to %s", non_failing.size(), written_to, )
def chromosome() -> tsc.TestSuiteChromosome: return tsc.TestSuiteChromosome()
def test_eq_different_size(chromosome): chromosome.add_test(MagicMock(tc.TestCase)) other = tsc.TestSuiteChromosome() other.add_test(MagicMock(tc.TestCase)) other.add_test(MagicMock(tc.TestCase)) assert not chromosome.__eq__(other)