Exemple #1
0
    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,
        )
Exemple #4
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
Exemple #5
0
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()
Exemple #16
0
        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)