Skip to content

testgen

TestGenerator(equivalence_classes, seed, type_specs)

A class that generates abstract test inputs for binary decision trees.

Attributes:

equivalence_classes: list Equivalence classes extracted from the decision tree.

dict

Input types for each feature as defined in the specifications.

list

List of test plans used to sample test inputs.

list

Number of test inputs to generate for each equivalence class.

Methods:

generate_testinputs() Generates abstract test inputs based on the selected coverage strategy.

Initializes the Test Generator.

Parameters:

Name Type Description Default
equivalence_classes list

Equivalence classes extracted from the decision tree.

required
seed int

The random seed to use for reproducible test input generation.

required
type_specs dict

Input types for each feature from the specifications.

required
Source code in src/flowcean/testing/generator/ddtig/domain/test_generator/testgen.py
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
def __init__(
    self,
    equivalence_classes: list,
    seed: int,
    type_specs: dict,
) -> None:
    """Initializes the Test Generator.

    Args:
        equivalence_classes: Equivalence classes extracted from
            the decision tree.
        seed: The random seed to use for reproducible
            test input generation.
        type_specs: Input types for each feature from the specifications.
    """
    self.equivalence_classes = equivalence_classes
    self.type_specs = type_specs
    self.testplans = []
    random.seed(seed)

generate_testinputs(test_coverage_criterium, eqclass_prio, n_testinputs, *, inverse_alloc, epsilon)

Generates abstract test inputs for all equivalence classes.

Parameters:

Name Type Description Default
test_coverage_criterium str

Coverage strategy ("bva" or "dtc").

required
eqclass_prio list

Importance scores for each equivalence class.

required
n_testinputs int

Total number of test inputs to generate.

required
inverse_alloc bool

If True, allocate more inputs to less important classes.

required
epsilon float

Offset for BVA sampling.

required

Returns:

Type Description
list

List of abstract test inputs.

list

Each test input is a tuple of feature values.

list

E.g.: [(1,2,3), (11,22,33), (87,29,38)]

Source code in src/flowcean/testing/generator/ddtig/domain/test_generator/testgen.py
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
def generate_testinputs(
    self,
    test_coverage_criterium: str,
    eqclass_prio: list,
    n_testinputs: int,
    *,
    inverse_alloc: bool,
    epsilon: float,
) -> list:
    """Generates abstract test inputs for all equivalence classes.

    Args:
        test_coverage_criterium: Coverage strategy ("bva" or "dtc").
        eqclass_prio: Importance scores for each equivalence class.
        n_testinputs: Total number of test inputs to generate.
        inverse_alloc: If True, allocate more inputs to less
            important classes.
        epsilon: Offset for BVA sampling.

    Returns:
        List of abstract test inputs.
        Each test input is a tuple of feature values.
        E.g.: [(1,2,3), (11,22,33), (87,29,38)]
    """
    testinputs = []
    self.n_testinputs_lst = self._generate_n_testinputs_list(
        n_testinputs,
        eqclass_prio,
        inverse_alloc=inverse_alloc,
    )
    for eqclass, n_eq_testinputs in zip(
        self.equivalence_classes,
        self.n_testinputs_lst,
        strict=False,
    ):
        testinputs_eqclass = self._generate_testinputs_eqclass(
            n_eq_testinputs,
            test_coverage_criterium,
            eqclass,
            epsilon,
        )
        testinputs += testinputs_eqclass
    logger.info(
        "Generated test inputs for all equivalence classes successfully.",
    )
    return testinputs

reverse_list_by_value(numbers_list)

Reverse values by magnitude while preserving positions.

Parameters:

Name Type Description Default
numbers_list list

List of numeric values to reverse.

required

Returns:

Name Type Description
list

A list where each value is replaced by its reversed counterpart

list

based on magnitude.

Example list

reverse_list_by_value([1, 4, 2, 3]) -> [4, 1, 3, 2]

Source code in src/flowcean/testing/generator/ddtig/domain/test_generator/testgen.py
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
def reverse_list_by_value(numbers_list: list) -> list:
    """Reverse values by magnitude while preserving positions.

    Args:
        numbers_list: List of numeric values to reverse.

    Returns:
        A list where each value is replaced by its reversed counterpart
        based on magnitude.
        Example: reverse_list_by_value([1, 4, 2, 3]) -> [4, 1, 3, 2]
    """
    # Sort values in ascending order and reverse them
    sorted_probs = sorted(numbers_list)
    reversed_probs = sorted_probs[::-1]

    value_to_reversed = {}
    # Map each original value to its reversed counterpart
    for orig, rev in zip(sorted_probs, reversed_probs, strict=False):
        if orig not in value_to_reversed:
            value_to_reversed[orig] = [rev]
        else:
            value_to_reversed[orig].append(rev)

    # Replace each value in the original list with its reversed version
    return [value_to_reversed[p].pop(0) for p in numbers_list]