Ejemplo n.º 1
0
def test_crossover_too_large():
    test_factory = MagicMock()
    test_case0 = MagicMock(dtc.DefaultTestCase)
    test_case0_clone = MagicMock(dtc.DefaultTestCase)
    test_case0_clone.size.return_value = 5
    test_case0.clone.return_value = test_case0_clone
    test_case1 = MagicMock(dtc.DefaultTestCase)
    test_case1.size.return_value = 7
    left = tcc.TestCaseChromosome(test_case0, test_factory=test_factory)
    right = tcc.TestCaseChromosome(test_case1, test_factory=test_factory)
    config.INSTANCE.chromosome_length = 3
    left.set_changed(False)
    left.cross_over(right, 1, 2)
    assert not left.has_changed()
Ejemplo n.º 2
0
def test_crossover(chromosome):
    cases_a = [tcc.TestCaseChromosome(dtc.DefaultTestCase()) for _ in range(5)]
    cases_b = [tcc.TestCaseChromosome(dtc.DefaultTestCase()) for _ in range(5)]

    chromosome.add_test_case_chromosomes(cases_a)

    other = tsc.TestSuiteChromosome()
    other.add_test_case_chromosomes(cases_b)
    pos1 = 3
    pos2 = 2

    chromosome.set_changed(False)
    chromosome.cross_over(other, pos1, pos2)
    assert chromosome.test_case_chromosomes == cases_a[:pos1] + cases_b[pos2:]
    assert chromosome.has_changed()
Ejemplo n.º 3
0
def test_crossover_success():
    test_factory = MagicMock()
    test_case0 = MagicMock(dtc.DefaultTestCase)
    test_case0_clone = MagicMock(dtc.DefaultTestCase)
    test_case0_clone.size.return_value = 5
    test_case0.clone.return_value = test_case0_clone
    test_case1 = MagicMock(dtc.DefaultTestCase)
    test_case1.size.return_value = 7
    left = tcc.TestCaseChromosome(test_case0, test_factory=test_factory)
    right = tcc.TestCaseChromosome(test_case1, test_factory=test_factory)

    left.cross_over(right, 4, 3)
    assert test_case0.get_statement.call_count == 4
    assert test_case0_clone.add_statement.call_count == 4
    assert test_case1.get_statement.call_count == 4
    assert test_factory.append_statement.call_count == 4
Ejemplo n.º 4
0
def test_simple_conversion():
    passing = tcc.TestCaseChromosome(dtc.DefaultTestCase())
    failing = tcc.TestCaseChromosome(dtc.DefaultTestCase())
    mocked_result = MagicMock()
    mocked_result.has_test_exceptions.return_value = True
    failing.set_last_execution_result(mocked_result)
    chromosome = tsc.TestSuiteChromosome()
    chromosome.add_test_case_chromosomes([failing, passing])

    converter = cc.ChromosomeConverter()
    chromosome.accept(converter)
    passing_suite = converter.passing_test_suite
    failing_suite = converter.failing_test_suite

    assert passing_suite.test_case_chromosomes == [passing]
    assert failing_suite.test_case_chromosomes == [failing]
Ejemplo n.º 5
0
def test_delete_statement(result):
    test_factory = MagicMock(tf.TestFactory)
    test_factory.delete_statement_gracefully.return_value = result
    test_case = dtc.DefaultTestCase()
    chromosome = tcc.TestCaseChromosome(test_case, test_factory=test_factory)
    test_case.add_statement(prim.IntPrimitiveStatement(test_case, 5))
    assert chromosome._delete_statement(0) == result
    test_factory.delete_statement_gracefully.assert_called_with(test_case, 0)
def test_run_test_case_chromosome_no_result():
    executor = MagicMock()
    result0 = MagicMock()
    executor.execute.return_value = result0
    ff = DummyTestSuiteFitnessFunction(executor)
    test_case0 = tcc.TestCaseChromosome(MagicMock())
    test_case0.set_changed(True)
    assert ff._run_test_case_chromosome(test_case0) == result0
    assert test_case0.get_last_execution_result() == result0
Ejemplo n.º 7
0
def test_mutation_delete_skipping():
    test_case = dtc.DefaultTestCase()
    chromosome = tcc.TestCaseChromosome(test_case)
    with mock.patch.object(chromosome, "_delete_statement") as delete_mock:
        delete_mock.return_value = True
        with mock.patch.object(chromosome,
                               "_get_last_mutatable_statement") as mut_mock:
            mut_mock.return_value = 3
            assert not chromosome._mutation_delete()
            assert delete_mock.call_count == 0
Ejemplo n.º 8
0
def test_run_test_suite_chromosome():
    executor = MagicMock()
    result0 = MagicMock()
    result1 = MagicMock()
    result2 = MagicMock()
    executor.execute.side_effect = [result0, result1]
    ff = DummyTestSuiteFitnessFunction(executor)
    indiv = tsc.TestSuiteChromosome()
    test_case0 = tcc.TestCaseChromosome(MagicMock())
    test_case0.set_changed(True)
    test_case1 = tcc.TestCaseChromosome(MagicMock())
    test_case1.set_changed(False)
    test_case2 = tcc.TestCaseChromosome(MagicMock())
    test_case2.set_changed(False)
    test_case2.set_last_execution_result(result2)
    indiv.add_test_case_chromosome(test_case0)
    indiv.add_test_case_chromosome(test_case1)
    indiv.add_test_case_chromosome(test_case2)
    assert ff._run_test_suite_chromosome(indiv) == [result0, result1, result2]
    assert test_case0.get_last_execution_result() == result0
    assert test_case1.get_last_execution_result() == result1
Ejemplo n.º 9
0
def test_mutation_delete_not_empty():
    test_case = dtc.DefaultTestCase()
    chromosome = tcc.TestCaseChromosome(test_case)
    int0 = prim.IntPrimitiveStatement(test_case, 5)
    int1 = prim.IntPrimitiveStatement(test_case, 5)
    test_case.add_statement(int0)
    test_case.add_statement(int1)
    with mock.patch("pynguin.utils.randomness.next_float") as float_mock:
        float_mock.side_effect = [0.0, 1.0]
        with mock.patch.object(chromosome, "_delete_statement") as delete_mock:
            delete_mock.return_value = True
            assert chromosome._mutation_delete()
            delete_mock.assert_has_calls([call(1)])
            assert delete_mock.call_count == 1
Ejemplo n.º 10
0
def test_mutation_change_call_success(constructor_mock, result):
    factory = MagicMock(tf.TestFactory)
    factory.change_random_call.return_value = result
    test_case = dtc.DefaultTestCase()
    chromosome = tcc.TestCaseChromosome(test_case, test_factory=factory)
    const0 = ps.ConstructorStatement(test_case, constructor_mock)
    const0.return_value.distance = 5
    test_case.add_statement(const0)
    with mock.patch("pynguin.utils.randomness.next_float") as float_mock:
        float_mock.return_value = 0.0
        with mock.patch.object(const0, "mutate") as mutate_mock:
            mutate_mock.return_value = False
            assert chromosome._mutation_change() == result
            mutate_mock.assert_called_once()
            assert const0.return_value.distance == 5
Ejemplo n.º 11
0
def test_mutation_insert_twice_no_success():
    test_factory = MagicMock(tf.TestFactory)

    def side_effect(tc, pos):
        return -1

    test_factory.insert_random_statement.side_effect = side_effect
    test_case = dtc.DefaultTestCase()
    chromosome = tcc.TestCaseChromosome(test_case, test_factory=test_factory)
    config.INSTANCE.statement_insertion_probability = 0.5
    config.INSTANCE.chromosome_length = 10
    with mock.patch("pynguin.utils.randomness.next_float") as float_mock:
        float_mock.side_effect = [0.2, 0.2, 0.2]
        assert not chromosome._mutation_insert()
    test_factory.insert_random_statement.assert_has_calls(
        [call(test_case, 0), call(test_case, 0)])
Ejemplo n.º 12
0
def _get_test_for_nested_branch_fixture(module) -> tcc.TestCaseChromosome:
    test_case = dtc.DefaultTestCase()
    int_stmt = prim_stmt.IntPrimitiveStatement(test_case, -50)
    function_call = param_stmt.FunctionStatement(
        test_case,
        gao.GenericFunction(
            module.nested_branches,
            InferredSignature(signature=MagicMock(),
                              parameters={},
                              return_type=int),
        ),
        [int_stmt.ret_val],
    )
    test_case.add_statement(int_stmt)
    test_case.add_statement(function_call)
    return tcc.TestCaseChromosome(test_case=test_case)
Ejemplo n.º 13
0
def test_mutation_insert_max_length():
    test_factory = MagicMock(tf.TestFactory)

    def side_effect(tc, pos):
        tc.add_statement(prim.IntPrimitiveStatement(tc, 5))
        return 0

    test_factory.insert_random_statement.side_effect = side_effect
    test_case = dtc.DefaultTestCase()
    chromosome = tcc.TestCaseChromosome(test_case, test_factory=test_factory)
    config.INSTANCE.statement_insertion_probability = 0.5
    config.INSTANCE.chromosome_length = 1
    with mock.patch("pynguin.utils.randomness.next_float") as float_mock:
        float_mock.side_effect = [0.0, 0.0]
        assert chromosome._mutation_insert()
    test_factory.insert_random_statement.assert_has_calls([call(test_case, 0)])
    assert test_case.size() == 1
Ejemplo n.º 14
0
def _get_test_for_no_branches_fixture(module) -> tcc.TestCaseChromosome:
    test_case = dtc.DefaultTestCase()
    int_stmt = prim_stmt.IntPrimitiveStatement(test_case, 5)
    function_call = param_stmt.FunctionStatement(
        test_case,
        gao.GenericFunction(
            module.identity,
            InferredSignature(
                signature=inspect.signature(module.identity),
                parameters={"a": int},
                return_type=int,
            ),
        ),
        {"a": int_stmt.ret_val},
    )
    constructor_call = param_stmt.ConstructorStatement(
        test_case,
        gao.GenericConstructor(
            module.DummyClass,
            InferredSignature(
                signature=inspect.signature(module.DummyClass.__init__),
                parameters={"x": int},
                return_type=module.DummyClass,
            ),
        ),
        {"x": function_call.ret_val},
    )
    method_call = param_stmt.MethodStatement(
        test_case,
        gao.GenericMethod(
            module.DummyClass,
            module.DummyClass.get_x,
            InferredSignature(signature=MagicMock(),
                              parameters={},
                              return_type=int),
        ),
        constructor_call.ret_val,
    )
    test_case.add_statement(int_stmt)
    test_case.add_statement(function_call)
    test_case.add_statement(constructor_call)
    test_case.add_statement(method_call)
    return tcc.TestCaseChromosome(test_case=test_case)
Ejemplo n.º 15
0
def _get_test_for_single_branch_else_branch_fixture(
        module) -> tcc.TestCaseChromosome:
    test_case = dtc.DefaultTestCase()
    int_stmt = prim_stmt.IntPrimitiveStatement(test_case, -5)
    function_call = param_stmt.FunctionStatement(
        test_case,
        gao.GenericFunction(
            module.first,
            InferredSignature(
                signature=inspect.signature(module.first),
                parameters={"a": int},
                return_type=int,
            ),
        ),
        {"a": int_stmt.ret_val},
    )
    test_case.add_statement(int_stmt)
    test_case.add_statement(function_call)
    return tcc.TestCaseChromosome(test_case=test_case)
Ejemplo n.º 16
0
    def generate_sequence(
        self,
        test_chromosome: tsc.TestSuiteChromosome,
        failing_test_chromosome: tsc.TestSuiteChromosome,
        execution_counter: int,
    ) -> None:
        """Implements one step of the adapted Randoop algorithm.

        Args:
            test_chromosome: The list of currently successful test cases
            failing_test_chromosome: The list of currently not successful test cases
            execution_counter: A current number of algorithm iterations

        Raises:
            GenerationException: In case an error occurs during generation
        """
        self._logger.info("Algorithm iteration %d", execution_counter)
        timer = Timer(name="Sequence generation", logger=None)
        timer.start()
        objects_under_test: Set[
            gao.
            GenericAccessibleObject] = self.test_cluster.accessible_objects_under_test

        if not objects_under_test:
            # In case we do not have any objects under test, we cannot generate a
            # test case.
            raise GenerationException(
                "Cannot generate test case without an object-under-test!")

        # Create new test case, i.e., sequence in Randoop paper terminology
        # Pick a random public method from objects under test
        method = self._random_public_method(objects_under_test)
        # Select random test cases from existing ones to base generation on
        tests = self._random_test_cases([
            chromosome.test_case
            for chromosome in test_chromosome.test_case_chromosomes
        ])
        new_test = tcc.TestCaseChromosome(dtc.DefaultTestCase())
        for test in tests:
            new_test.test_case.append_test_case(test)

        # Generate random values as input for the previously picked random method
        # Extend the test case by the new method call
        self.test_factory.append_generic_accessible(new_test.test_case, method)

        # Discard duplicates
        if (new_test in test_chromosome.test_case_chromosomes
                or new_test in failing_test_chromosome.test_case_chromosomes):
            return

        with Timer(name="Execution time", logger=None):
            # Execute new sequence
            exec_result = self._executor.execute(new_test.test_case)

        # Classify new test case and outputs
        if exec_result.has_test_exceptions():
            failing_test_chromosome.add_test_case_chromosome(new_test)
        else:
            test_chromosome.add_test_case_chromosome(new_test)
            # TODO(sl) What about extensible flags?
        self._execution_results.append(exec_result)
        timer.stop()
Ejemplo n.º 17
0
def test_case_chromosome_with_test():
    test_case = dtc.DefaultTestCase()
    return tcc.TestCaseChromosome(test_case), test_case
Ejemplo n.º 18
0
def test_case_chromosome():
    return tcc.TestCaseChromosome(dtc.DefaultTestCase())
Ejemplo n.º 19
0
def test_clone(chromosome):
    chromosome.add_test_case_chromosome(
        tcc.TestCaseChromosome(dtc.DefaultTestCase()))
    result = chromosome.clone()
    assert result == chromosome
    assert result is not chromosome
Ejemplo n.º 20
0
 def get_chromosome(self) -> tcc.TestCaseChromosome:
     test_case = self._test_case_factory.get_test_case()
     return tcc.TestCaseChromosome(test_case=test_case,
                                   test_factory=self._test_factory)