Hybrid Multi-level Crossover for Unit Test Case Generation (SSBSE 2021)

HYBRID MULTI-LEVEL CROSSOVER
FOR UNIT TEST CASE GENERATION
1
Pouria Derakhshanfar Annibale Panichella
Mitchell Olsthoorn
Test4
SEARCH-BASED UNIT TEST GENERATION 2
JAR
Application
Evolutionary-based algorithm
Random
initialization
Test0
Test5
Test1
Test3
Test2
…
Evaluate fitness
of tests
Search objective(s)
Fitness value(s)
Fitness value(s)
Fitness value(s)
Fitness value(s)
Fitness value(s)
Fitness value(s)
Selection
Class under tests
CLASS
SEARCH-BASED UNIT TEST GENERATION 4
JAR
Application
Random
initialization
Evaluate fitness
of tests
Selection Crossover
Test1
Test4
Offspring1
Offspring2
Evolutionary-based algorithm
Class under tests
CLASS
SEARCH-BASED CRASH REPRODUCTION 5
JAR
Application
Random
initialization
Evaluate fitness
of tests
Selection Crossover
Test1
Test4
Offspring1
Offspring2
Mutation
Or Or
Edit Remove Add
Or Or
Edit Remove Add
Evolutionary-based algorithm
Class under tests
CLASS
SEARCH-BASED UNIT TEST GENERATION 6
JAR
Application
Random
initialization
Evaluate fitness
of tests
Selection Crossover Mutation
Reinsertion
NewTest0
NewTest5
NewTest4
NewTest1
NewTest3
NewTest2
…
Evolutionary-based algorithm
Class under tests
CLASS
SEARCH-BASED UNIT TEST GENERATION 7
JAR
Application
Random
initialization
Evaluate fitness
of tests
Selection Crossover Mutation
Reinsertion
Evolutionary-based algorithm
Class under tests
CLASS
Test1
Test4
Offspring1
Offspring2
!
No crossover for input data
CROSSOVER OPERATOR 8
public void test1 () {
Fraction f0 = new Fraction (2, 3);
Fraction f1 = new Fraction (2, -1);
f0. divideBy (f1);
f0.add ( Fraction.ZERO);
}
Parent 1
public void test2 () {
Fraction f0 = new Fraction (3, 1);
Fraction f1 = new Fraction (1, 3);
f0.add (f1);
f0.pow (2.0);
}
Parent 2
CROSSOVER OPERATOR 9
public void test1 () {
Fraction f0 = new Fraction (2, 3);
Fraction f1 = new Fraction (2, -1);
f0. divideBy (f1);
f0.add ( Fraction.ZERO);
}
Parent 1
public void test2 () {
Fraction f0 = new Fraction (3, 1);
Fraction f1 = new Fraction (1, 3);
f0.add (f1);
f0.pow (2.0);
}
Parent 2
public void test1 () {
Fraction f0 = new Fraction (2, 3);
Fraction f1 = new Fraction (2, -1);
f0.add (f1);
f0.pow (2.0);
}
Offspring 1
public void test2 () {
Fraction f0 = new Fraction (3, 1);
Fraction f1 = new Fraction (1, 3);
f0. divideBy (f1);
f0.add ( Fraction.ZERO);
}
Offspring 2
CROSSOVER OPERATOR 10
public void test1 () {
Fraction f0 = new Fraction (2, 3);
Fraction f1 = new Fraction (2, -1);
f0. divideBy (f1);
f0.add ( Fraction.ZERO);
}
Parent 1
public void test2 () {
Fraction f0 = new Fraction (3, 1);
Fraction f1 = new Fraction (1, 3);
f0.add (f1);
f0.pow (2.0);
}
Parent 2
public void test1 () {
Fraction f0 = new Fraction (2, 3);
Fraction f1 = new Fraction (2, -1);
f0.add (f1);
f0.pow (2.0);
}
Offspring 1
public void test2 () {
Fraction f0 = new Fraction (3, 1);
Fraction f1 = new Fraction (1, 3);
f0. divideBy (f1);
f0.add ( Fraction.ZERO);
}
Offspring 2
Hybrid Multi-level Crossover (HMX) operator
Traditional test-level crossover + Data-level recombination
OUR SOLUTION 11
HMX: HYBRID MULTI-LEVEL CROSSOVER
input: Two parent test cases P1 and P2
output: Two offspring test cases O1 and O2
begin
O1,O2 <—— SINGLE-POINT-CROSSOVER(P1,P2);
// detect candidate data inputs for data-level crossover
C1,C2,M1,M2 <—— DETECT-CORSSOVER-CANDIDATES(O1,O2)
foreach SIG ∈ C1.keys ∪ C2.keys do
// choose random constructor with same signature
S1 <—— random.choice(C1[SIG])
S2 <—— random.choice(C2[SIG])
O1,O2 <—— DATA-CROSSOVER(O1,O2,PARAMS(S1),PARAMS(S2))
done
foreach SIG ∈ M1.keys ∪ M2.keys do
// choose random method with same signature
S1 <—— random.choice(M1[SIG])
S2 <—— random.choice(M2[SIG])
O1,O2 <—— DATA-CROSSOVER(O1,O2,PARAMS(S1),PARAMS(S2))
done
return O1,O2;
end
TEST-LEVEL CROSSOVER OPERATOR 12
HMX: HYBRID MULTI-LEVEL CROSSOVER
input: Two parent test cases P1 and P2
output: Two offspring test cases O1 and O2
begin
O1,O2 <—— SINGLE-POINT-CROSSOVER(P1,P2);
// detect candidate data inputs for data-level crossover
C1,C2,M1,M2 <—— DETECT-CORSSOVER-CANDIDATES(O1,O2)
foreach SIG ∈ C1.keys ∪ C2.keys do
// choose random constructor with same signature
S1 <—— random.choice(C1[SIG])
S2 <—— random.choice(C2[SIG])
O1,O2 <—— DATA-CROSSOVER(O1,O2,PARAMS(S1),PARAMS(S2))
done
foreach SIG ∈ M1.keys ∪ M2.keys do
// choose random method with same signature
S1 <—— random.choice(M1[SIG])
S2 <—— random.choice(M2[SIG])
O1,O2 <—— DATA-CROSSOVER(O1,O2,PARAMS(S1),PARAMS(S2))
done
return O1,O2;
end
TEST-LEVEL CROSSOVER OPERATOR 13
public void test1 () {
Fraction f0 = new Fraction (2, 3);
Fraction f1 = new Fraction (2, -1);
f0. divideBy (f1);
f0.add ( Fraction.ZERO);
}
P1
public void test2 () {
Fraction f0 = new Fraction (3, 1);
Fraction f1 = new Fraction (1, 3);
f0.add (f1);
f0.pow (2.0);
}
P2
public void test1 () {
Fraction f0 = new Fraction (2, 3);
Fraction f1 = new Fraction (2, -1);
f0.add (f1);
f0.pow (2.0);
}
O1
public void test2 () {
Fraction f0 = new Fraction (3, 1);
Fraction f1 = new Fraction (1, 3);
f0. divideBy (f1);
f0.add ( Fraction.ZERO);
}
O2
DETECT CROSSOVER CANDIDATES 14
HMX: HYBRID MULTI-LEVEL CROSSOVER
input: Two parent test cases P1 and P2
output: Two offspring test cases O1 and O2
begin
O1,O2 <—— SINGLE-POINT-CROSSOVER(P1,P2);
// detect candidate data inputs for data-level crossover
C1,C2,M1,M2 <—— DETECT-CORSSOVER-CANDIDATES(O1,O2)
foreach SIG ∈ C1.keys ∪ C2.keys do
// choose random constructor with same signature
S1 <—— random.choice(C1[SIG])
S2 <—— random.choice(C2[SIG])
O1,O2 <—— DATA-CROSSOVER(O1,O2,PARAMS(S1),PARAMS(S2))
done
foreach SIG ∈ M1.keys ∪ M2.keys do
// choose random method with same signature
S1 <—— random.choice(M1[SIG])
S2 <—— random.choice(M2[SIG])
O1,O2 <—— DATA-CROSSOVER(O1,O2,PARAMS(S1),PARAMS(S2))
done
return O1,O2;
end
Data-level crossover can not be applied
to every combination of input data:
A. Performing crossover on input
data with different types is
not logical.
B. Applying crossover on input
parameters with the same data
type that belong to different
methods may lead to generate
offsprings that are farther from
the desired search objective.
DETECT CROSSOVER CANDIDATES 15
public void test1 () {
Fraction f0 = new Fraction (2, 3);
Fraction f1 = new Fraction (2, -1);
f0.add (f1);
f0.pow (2.0);
}
O1
public void test2 () {
Fraction f0 = new Fraction (3, 1);
Fraction f1 = new Fraction (1, 3);
f0. divideBy (f1);
f0.add ( Fraction.ZERO);
}
O2
C1
Key
(Signature of constructors
invoked in both O1 and O2)
Value
(list of constructors called in O1
that has the same signature)
Fraction|<init>(int, int)
new Fraction (2, 3)
new Fraction (2, -1)
Each method or constructor implemented in a project has a unique string called Signature.
Signature format:
CLASS_NAME|FUNCTION_NAME(PARAM1_TYPE, PARAM2_TYPE, …)RETURN_TYPE
C2
Key
(Signature of constructors
invoked in both O1 and O2)
Value
(list of constructors called in O2
that has the same signature)
Fraction|<init>(int, int)
new Fraction (3, 1)
new Fraction (1, 3)
DETECT CROSSOVER CANDIDATES 16
public void test1 () {
Fraction f0 = new Fraction (2, 3);
Fraction f1 = new Fraction (2, -1);
f0.add (f1);
f0.pow (2.0);
}
O1
public void test2 () {
Fraction f0 = new Fraction (3, 1);
Fraction f1 = new Fraction (1, 3);
f0. divideBy (f1);
f0.add ( Fraction.ZERO);
}
O2
M1
Key
(Signature of methods
invoked in both O1 and O2)
Value
(list of methods called in O1
that has the same signature)
Fraction|add(Fraction)V add(f1)
Each method or constructor implemented in a project has a unique string called Signature.
Signature format:
CLASS_NAME|FUNCTION_NAME(PARAM1_TYPE, PARAM2_TYPE, …)RETURN_TYPE
M2
Key
(Signature of methods
invoked in both O1 and O2)
Value
(list of methods called in O2
that has the same signature)
Fraction|add(Fraction)V add(Fraction.ZERO)
DATA CROSSOVER 17
HMX: HYBRID MULTI-LEVEL CROSSOVER
input: Two parent test cases P1 and P2
output: Two offspring test cases O1 and O2
begin
O1,O2 <—— SINGLE-POINT-CROSSOVER(P1,P2);
// detect candidate data inputs for data-level crossover
C1,C2,M1,M2 <—— DETECT-CORSSOVER-CANDIDATES(O1,O2)
foreach SIG ∈ C1.keys ∪ C2.keys do
// choose random constructor with same signature
S1 <—— random.choice(C1[SIG])
S2 <—— random.choice(C2[SIG])
O1,O2 <—— DATA-CROSSOVER(O1,O2,PARAMS(S1),PARAMS(S2))
done
foreach SIG ∈ M1.keys ∪ M2.keys do
// choose random method with same signature
S1 <—— random.choice(M1[SIG])
S2 <—— random.choice(M2[SIG])
O1,O2 <—— DATA-CROSSOVER(O1,O2,PARAMS(S1),PARAMS(S2))
done
return O1,O2;
end
DATA CROSSOVER 18
public void test1 () {
Fraction f0 = new Fraction (2, 3);
Fraction f1 = new Fraction (2, -1);
f0.add (f1);
f0.pow (2.0);
}
O1
public void test2 () {
Fraction f0 = new Fraction (3, 1);
Fraction f1 = new Fraction (1, 3);
f0. divideBy (f1);
f0.add ( Fraction.ZERO);
}
O2
C1
Key
(Signature of constructors
invoked in both O1 and O2)
Value
(list of constructors called in O1
that has the same signature)
Fraction|<init>(int, int)
new Fraction (2, 3)
new Fraction (2, -1)
C2
Key
(Signature of constructors
invoked in both O1 and O2)
Value
(list of constructors called in O2
that has the same signature)
Fraction|<init>(int, int)
new Fraction (3, 1)
new Fraction (1, 3)
DATA-CROSSOVER(…)
DATA CROSSOVER 19
HMX: HYBRID MULTI-LEVEL CROSSOVER
input: Two parent test cases P1 and P2
output: Two offspring test cases O1 and O2
begin
O1,O2 <—— SINGLE-POINT-CROSSOVER(P1,P2);
// detect candidate data inputs for data-level crossover
C1,C2,M1,M2 <—— DETECT-CORSSOVER-CANDIDATES(O1,O2)
foreach SIG ∈ C1.keys ∪ C2.keys do
// choose random constructor with same signature
S1 <—— random.choice(C1[SIG])
S2 <—— random.choice(C2[SIG])
O1,O2 <—— DATA-CROSSOVER(O1,O2,PARAMS(S1),PARAMS(S2))
done
foreach SIG ∈ M1.keys ∪ M2.keys do
// choose random method with same signature
S1 <—— random.choice(M1[SIG])
S2 <—— random.choice(M2[SIG])
O1,O2 <—— DATA-CROSSOVER(O1,O2,PARAMS(S1),PARAMS(S2))
done
return O1,O2;
end
DATA CROSSOVER 20
1. Numerical data types —> Simulated Binary Crossover (SBX)
2. Strings —> String Crossover
HMX SUPPORTS DATA RECOMBINATION FOR TWO DATA TYPES
DATA CROSSOVER 21
SIMULATED BINARY CROSSOVER (SBX)
O1: new Fraction (1.5, -1)
O2: new Fraction (3.8, 1)
Crossover (2, 3)
Crossover (-1, 1)
Deb, K., Sindhya, K., Okabe, T.: Self-adaptive simulated binary crossover for real parameter optimization. In:
GECCO 2007.
1.5
3.8
O1: new Fraction (2, -1)
O2: new Fraction (3, 1)
DATA CROSSOVER 22
SINGLE-POINT STRING CROSSOVER
String 1:
lor em
String 2:
ipsum
lorsum
ipem
McMinn, P.: Search-based software test data generation: A survey. Software Testing
Verification and Reliability. (2004)
EMPIRICAL EVALUATION 23
1. State-of-the-art search-based unit test generation: EvoSuite running DynaMOSA with default
parameters
• Baseline: EvoSuite + SPX
• Novel approach: EvoSuite + HMX
2. Benchmark:
• 9 projects, which commonly use numeric and string input data.
• 100 non-trivial classes under test that accept at least one string or numeric value as input
parameter.
3. Search budget = 5 minutes
4. Repeated each execution for 100 times
5. in total: 23,200 executions
EMPIRICAL EVALUATION
RQ1: TO WHAT EXTENT DOES HMX IMPROVE STRUCTURAL COVERAGE
COMPARED TO THE SINGLE-POINT CROSSOVER? 24
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
0.00
0.25
0.50
0.75
1.00
HMX SPX
Crossover
Line
coverage
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
0.00
0.25
0.50
0.75
1.00
HMX SPX
Crossover
Branch
coverage
OVERVIEW OF STRUCTURAL COVERAGE COMPARING
HMX TO SPX
RQ1: TO WHAT EXTENT DOES HMX IMPROVE STRUCTURAL COVERAGE
COMPARED TO THE SINGLE-POINT CROSSOVER? 25
Pairwise comparison of impact of HMX on structural coverage with a small, medium, and
large effect size and a statistical significance <0.05
1. Impact factor measurement: Vargha-Delaney Â12 statistic
2. Assess the significance of results: non-parametric Wilcoxon Rank Sum test
Metric
#Win #Lose
Small Medium Large Small Medium Large
Branch coverage 5 3 22 1 0 0
Line coverage 1 3 19 1 0 0
Summary:
HMX crossover operator achieves significantly higher (~30% of the cases) or equal structural
code coverage for unit test case generation compared to the baseline SPX.
Maximum increase of branch coverage achieved by HMX: 19.1%
Maximum increase of line coverage achieved by HMX: 19.4%
RQ2: HOW DOES HMX IMPACT THE FAULT-DETECTION CAPABILITY OF THE
GENERATED TESTS? 26
OVERVIEW OF MUTATION SCORE ACHIEVED BY
HMX AND SPX
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
0.25
0.50
0.75
1.00
HMX SPX
Crossover
Weak
mutation
score
0.00
0.25
0.50
0.75
1.00
HMX SPX
Crossover
Strong
Mutation
score
RQ2: HOW DOES HMX IMPACT THE FAULT-DETECTION CAPABILITY OF THE
GENERATED TESTS? 27
Pairwise comparison of impact of HMX on fast detection capability of search process with a
small, medium, and large effect size and a statistical significance <0.05
1. Impact factor measurement: Vargha-Delaney Â12 statistic
2. Assess the significance of results: non-parametric Wilcoxon Rank Sum test
Metric
#Win #Lose
Small Medium Large Small Medium Large
Weak mutation 3 3 21 1 0 0
Strong mutation 8 0 15 3 0 0
Summary:
HMX achieves significantly higher (~25% of the cases) or equal fault detection capability
compared to SPX and is outperformed only in one and three classes for weak and strong
mutation, respectively.
Maximum increase of weak mutation achieved by HMX: 14%
Maximum increase of strong mutation achieved by HMX: 12.2%
FUTURE WORK 28
• Additional crossover operators for other types (e.g., array, list, map).
• Extend our experiment by assessing other crossover operators for numbers (e.g.,
parent-centric and arithmetic crossover) and strings (e.g., multi-point crossover).
REPLICATION PACKAGE
THANK YOU FOR LISTENING
29
Replication Package
https://zenodo.org/record/5102598#.YV6uAS8Rqrw
1 of 28

Recommended

The Ring programming language version 1.9 book - Part 40 of 210 by
The Ring programming language version 1.9 book - Part 40 of 210The Ring programming language version 1.9 book - Part 40 of 210
The Ring programming language version 1.9 book - Part 40 of 210Mahmoud Samir Fayed
9 views10 slides
The Ring programming language version 1.5 book - Part 5 of 31 by
The Ring programming language version 1.5 book - Part 5 of 31The Ring programming language version 1.5 book - Part 5 of 31
The Ring programming language version 1.5 book - Part 5 of 31Mahmoud Samir Fayed
60 views59 slides
The Ring programming language version 1.5.4 book - Part 32 of 185 by
The Ring programming language version 1.5.4 book - Part 32 of 185The Ring programming language version 1.5.4 book - Part 32 of 185
The Ring programming language version 1.5.4 book - Part 32 of 185Mahmoud Samir Fayed
8 views10 slides
The Ring programming language version 1.6 book - Part 34 of 189 by
The Ring programming language version 1.6 book - Part 34 of 189The Ring programming language version 1.6 book - Part 34 of 189
The Ring programming language version 1.6 book - Part 34 of 189Mahmoud Samir Fayed
10 views10 slides
The Ring programming language version 1.3 book - Part 23 of 88 by
The Ring programming language version 1.3 book - Part 23 of 88The Ring programming language version 1.3 book - Part 23 of 88
The Ring programming language version 1.3 book - Part 23 of 88Mahmoud Samir Fayed
17 views10 slides
02 Java Language And OOP PART II by
02 Java Language And OOP PART II02 Java Language And OOP PART II
02 Java Language And OOP PART IIHari Christian
871 views66 slides

More Related Content

What's hot

Simulado java se 7 programmer by
Simulado java se 7 programmerSimulado java se 7 programmer
Simulado java se 7 programmerMiguel Vilaca
472 views78 slides
BPMN process views construction by
BPMN process views constructionBPMN process views construction
BPMN process views constructionDr. Sira Yongchareon
785 views20 slides
Scjp6.0 by
Scjp6.0Scjp6.0
Scjp6.0prabhatkgupta
198 views166 slides
Final JAVA Practical of BCA SEM-5. by
Final JAVA Practical of BCA SEM-5.Final JAVA Practical of BCA SEM-5.
Final JAVA Practical of BCA SEM-5.Nishan Barot
8.5K views23 slides
The Ring programming language version 1.5.4 book - Part 27 of 185 by
The Ring programming language version 1.5.4 book - Part 27 of 185The Ring programming language version 1.5.4 book - Part 27 of 185
The Ring programming language version 1.5.4 book - Part 27 of 185Mahmoud Samir Fayed
9 views10 slides
FunctionalInterfaces by
FunctionalInterfacesFunctionalInterfaces
FunctionalInterfacesYourVirtual Class
23 views12 slides

What's hot(20)

Simulado java se 7 programmer by Miguel Vilaca
Simulado java se 7 programmerSimulado java se 7 programmer
Simulado java se 7 programmer
Miguel Vilaca472 views
Final JAVA Practical of BCA SEM-5. by Nishan Barot
Final JAVA Practical of BCA SEM-5.Final JAVA Practical of BCA SEM-5.
Final JAVA Practical of BCA SEM-5.
Nishan Barot8.5K views
The Ring programming language version 1.5.4 book - Part 27 of 185 by Mahmoud Samir Fayed
The Ring programming language version 1.5.4 book - Part 27 of 185The Ring programming language version 1.5.4 book - Part 27 of 185
The Ring programming language version 1.5.4 book - Part 27 of 185
The Ring programming language version 1.5.3 book - Part 32 of 184 by Mahmoud Samir Fayed
The Ring programming language version 1.5.3 book - Part 32 of 184The Ring programming language version 1.5.3 book - Part 32 of 184
The Ring programming language version 1.5.3 book - Part 32 of 184
The Ring programming language version 1.9 book - Part 34 of 210 by Mahmoud Samir Fayed
The Ring programming language version 1.9 book - Part 34 of 210The Ring programming language version 1.9 book - Part 34 of 210
The Ring programming language version 1.9 book - Part 34 of 210
Exception handling by Kapish Joshi
Exception handlingException handling
Exception handling
Kapish Joshi1.4K views
The Ring programming language version 1.5.1 book - Part 25 of 180 by Mahmoud Samir Fayed
The Ring programming language version 1.5.1 book - Part 25 of 180The Ring programming language version 1.5.1 book - Part 25 of 180
The Ring programming language version 1.5.1 book - Part 25 of 180
The Ring programming language version 1.7 book - Part 35 of 196 by Mahmoud Samir Fayed
The Ring programming language version 1.7 book - Part 35 of 196The Ring programming language version 1.7 book - Part 35 of 196
The Ring programming language version 1.7 book - Part 35 of 196
The Ring programming language version 1.5.1 book - Part 30 of 180 by Mahmoud Samir Fayed
The Ring programming language version 1.5.1 book - Part 30 of 180The Ring programming language version 1.5.1 book - Part 30 of 180
The Ring programming language version 1.5.1 book - Part 30 of 180
The Ring programming language version 1.6 book - Part 184 of 189 by Mahmoud Samir Fayed
The Ring programming language version 1.6 book - Part 184 of 189The Ring programming language version 1.6 book - Part 184 of 189
The Ring programming language version 1.6 book - Part 184 of 189
The Ring programming language version 1.2 book - Part 21 of 84 by Mahmoud Samir Fayed
The Ring programming language version 1.2 book - Part 21 of 84The Ring programming language version 1.2 book - Part 21 of 84
The Ring programming language version 1.2 book - Part 21 of 84
The Ring programming language version 1.8 book - Part 37 of 202 by Mahmoud Samir Fayed
The Ring programming language version 1.8 book - Part 37 of 202The Ring programming language version 1.8 book - Part 37 of 202
The Ring programming language version 1.8 book - Part 37 of 202
The Ring programming language version 1.6 book - Part 29 of 189 by Mahmoud Samir Fayed
The Ring programming language version 1.6 book - Part 29 of 189The Ring programming language version 1.6 book - Part 29 of 189
The Ring programming language version 1.6 book - Part 29 of 189
The Ring programming language version 1.5.4 book - Part 33 of 185 by Mahmoud Samir Fayed
The Ring programming language version 1.5.4 book - Part 33 of 185The Ring programming language version 1.5.4 book - Part 33 of 185
The Ring programming language version 1.5.4 book - Part 33 of 185

Similar to Hybrid Multi-level Crossover for Unit Test Case Generation (SSBSE 2021)

How can I fix this error in my codeGive feedbackpublic class .pdf by
How can I fix this error in my codeGive feedbackpublic class .pdfHow can I fix this error in my codeGive feedbackpublic class .pdf
How can I fix this error in my codeGive feedbackpublic class .pdfallystraders
2 views1 slide
In the following code- suppose that f is an instance of Foo- class Foo.docx by
In the following code- suppose that f is an instance of Foo- class Foo.docxIn the following code- suppose that f is an instance of Foo- class Foo.docx
In the following code- suppose that f is an instance of Foo- class Foo.docxcarold12
2 views2 slides
ES2015 Quiz by
ES2015 QuizES2015 Quiz
ES2015 QuizSergey Bolshchikov
1.3K views48 slides
The Ring programming language version 1.5.2 book - Part 26 of 181 by
The Ring programming language version 1.5.2 book - Part 26 of 181The Ring programming language version 1.5.2 book - Part 26 of 181
The Ring programming language version 1.5.2 book - Part 26 of 181Mahmoud Samir Fayed
11 views10 slides
Lesson 18 by
Lesson 18Lesson 18
Lesson 18Avijit Kumar
1.7K views12 slides
AI Lesson 18 by
AI Lesson 18AI Lesson 18
AI Lesson 18Assistant Professor
353 views12 slides

Similar to Hybrid Multi-level Crossover for Unit Test Case Generation (SSBSE 2021)(7)

How can I fix this error in my codeGive feedbackpublic class .pdf by allystraders
How can I fix this error in my codeGive feedbackpublic class .pdfHow can I fix this error in my codeGive feedbackpublic class .pdf
How can I fix this error in my codeGive feedbackpublic class .pdf
allystraders2 views
In the following code- suppose that f is an instance of Foo- class Foo.docx by carold12
In the following code- suppose that f is an instance of Foo- class Foo.docxIn the following code- suppose that f is an instance of Foo- class Foo.docx
In the following code- suppose that f is an instance of Foo- class Foo.docx
carold122 views
The Ring programming language version 1.5.2 book - Part 26 of 181 by Mahmoud Samir Fayed
The Ring programming language version 1.5.2 book - Part 26 of 181The Ring programming language version 1.5.2 book - Part 26 of 181
The Ring programming language version 1.5.2 book - Part 26 of 181

Recently uploaded

Dev-Cloud Conference 2023 - Continuous Deployment Showdown: Traditionelles CI... by
Dev-Cloud Conference 2023 - Continuous Deployment Showdown: Traditionelles CI...Dev-Cloud Conference 2023 - Continuous Deployment Showdown: Traditionelles CI...
Dev-Cloud Conference 2023 - Continuous Deployment Showdown: Traditionelles CI...Marc Müller
42 views83 slides
What is API by
What is APIWhat is API
What is APIartembondar5
10 views15 slides
Introduction to Git Source Control by
Introduction to Git Source ControlIntroduction to Git Source Control
Introduction to Git Source ControlJohn Valentino
6 views18 slides
nintendo_64.pptx by
nintendo_64.pptxnintendo_64.pptx
nintendo_64.pptxpaiga02016
5 views7 slides
Software evolution understanding: Automatic extraction of software identifier... by
Software evolution understanding: Automatic extraction of software identifier...Software evolution understanding: Automatic extraction of software identifier...
Software evolution understanding: Automatic extraction of software identifier...Ra'Fat Al-Msie'deen
10 views33 slides
Top-5-production-devconMunich-2023.pptx by
Top-5-production-devconMunich-2023.pptxTop-5-production-devconMunich-2023.pptx
Top-5-production-devconMunich-2023.pptxTier1 app
8 views40 slides

Recently uploaded(20)

Dev-Cloud Conference 2023 - Continuous Deployment Showdown: Traditionelles CI... by Marc Müller
Dev-Cloud Conference 2023 - Continuous Deployment Showdown: Traditionelles CI...Dev-Cloud Conference 2023 - Continuous Deployment Showdown: Traditionelles CI...
Dev-Cloud Conference 2023 - Continuous Deployment Showdown: Traditionelles CI...
Marc Müller42 views
Introduction to Git Source Control by John Valentino
Introduction to Git Source ControlIntroduction to Git Source Control
Introduction to Git Source Control
John Valentino6 views
Software evolution understanding: Automatic extraction of software identifier... by Ra'Fat Al-Msie'deen
Software evolution understanding: Automatic extraction of software identifier...Software evolution understanding: Automatic extraction of software identifier...
Software evolution understanding: Automatic extraction of software identifier...
Top-5-production-devconMunich-2023.pptx by Tier1 app
Top-5-production-devconMunich-2023.pptxTop-5-production-devconMunich-2023.pptx
Top-5-production-devconMunich-2023.pptx
Tier1 app8 views
2023-November-Schneider Electric-Meetup-BCN Admin Group.pptx by animuscrm
2023-November-Schneider Electric-Meetup-BCN Admin Group.pptx2023-November-Schneider Electric-Meetup-BCN Admin Group.pptx
2023-November-Schneider Electric-Meetup-BCN Admin Group.pptx
animuscrm15 views
Ports-and-Adapters Architecture for Embedded HMI by Burkhard Stubert
Ports-and-Adapters Architecture for Embedded HMIPorts-and-Adapters Architecture for Embedded HMI
Ports-and-Adapters Architecture for Embedded HMI
Burkhard Stubert26 views
DRYiCE™ iAutomate: AI-enhanced Intelligent Runbook Automation by HCLSoftware
DRYiCE™ iAutomate: AI-enhanced Intelligent Runbook AutomationDRYiCE™ iAutomate: AI-enhanced Intelligent Runbook Automation
DRYiCE™ iAutomate: AI-enhanced Intelligent Runbook Automation
HCLSoftware6 views
Unlocking the Power of AI in Product Management - A Comprehensive Guide for P... by NimaTorabi2
Unlocking the Power of AI in Product Management - A Comprehensive Guide for P...Unlocking the Power of AI in Product Management - A Comprehensive Guide for P...
Unlocking the Power of AI in Product Management - A Comprehensive Guide for P...
NimaTorabi215 views
360 graden fabriek by info33492
360 graden fabriek360 graden fabriek
360 graden fabriek
info33492143 views
Bootstrapping vs Venture Capital.pptx by Zeljko Svedic
Bootstrapping vs Venture Capital.pptxBootstrapping vs Venture Capital.pptx
Bootstrapping vs Venture Capital.pptx
Zeljko Svedic14 views
Fleet Management Software in India by Fleetable
Fleet Management Software in India Fleet Management Software in India
Fleet Management Software in India
Fleetable12 views
Copilot Prompting Toolkit_All Resources.pdf by Riccardo Zamana
Copilot Prompting Toolkit_All Resources.pdfCopilot Prompting Toolkit_All Resources.pdf
Copilot Prompting Toolkit_All Resources.pdf
Riccardo Zamana16 views
Gen Apps on Google Cloud PaLM2 and Codey APIs in Action by Márton Kodok
Gen Apps on Google Cloud PaLM2 and Codey APIs in ActionGen Apps on Google Cloud PaLM2 and Codey APIs in Action
Gen Apps on Google Cloud PaLM2 and Codey APIs in Action
Márton Kodok15 views

Hybrid Multi-level Crossover for Unit Test Case Generation (SSBSE 2021)

  • 1. HYBRID MULTI-LEVEL CROSSOVER FOR UNIT TEST CASE GENERATION 1 Pouria Derakhshanfar Annibale Panichella Mitchell Olsthoorn
  • 2. Test4 SEARCH-BASED UNIT TEST GENERATION 2 JAR Application Evolutionary-based algorithm Random initialization Test0 Test5 Test1 Test3 Test2 … Evaluate fitness of tests Search objective(s) Fitness value(s) Fitness value(s) Fitness value(s) Fitness value(s) Fitness value(s) Fitness value(s) Selection Class under tests CLASS
  • 3. SEARCH-BASED UNIT TEST GENERATION 4 JAR Application Random initialization Evaluate fitness of tests Selection Crossover Test1 Test4 Offspring1 Offspring2 Evolutionary-based algorithm Class under tests CLASS
  • 4. SEARCH-BASED CRASH REPRODUCTION 5 JAR Application Random initialization Evaluate fitness of tests Selection Crossover Test1 Test4 Offspring1 Offspring2 Mutation Or Or Edit Remove Add Or Or Edit Remove Add Evolutionary-based algorithm Class under tests CLASS
  • 5. SEARCH-BASED UNIT TEST GENERATION 6 JAR Application Random initialization Evaluate fitness of tests Selection Crossover Mutation Reinsertion NewTest0 NewTest5 NewTest4 NewTest1 NewTest3 NewTest2 … Evolutionary-based algorithm Class under tests CLASS
  • 6. SEARCH-BASED UNIT TEST GENERATION 7 JAR Application Random initialization Evaluate fitness of tests Selection Crossover Mutation Reinsertion Evolutionary-based algorithm Class under tests CLASS Test1 Test4 Offspring1 Offspring2 ! No crossover for input data
  • 7. CROSSOVER OPERATOR 8 public void test1 () { Fraction f0 = new Fraction (2, 3); Fraction f1 = new Fraction (2, -1); f0. divideBy (f1); f0.add ( Fraction.ZERO); } Parent 1 public void test2 () { Fraction f0 = new Fraction (3, 1); Fraction f1 = new Fraction (1, 3); f0.add (f1); f0.pow (2.0); } Parent 2
  • 8. CROSSOVER OPERATOR 9 public void test1 () { Fraction f0 = new Fraction (2, 3); Fraction f1 = new Fraction (2, -1); f0. divideBy (f1); f0.add ( Fraction.ZERO); } Parent 1 public void test2 () { Fraction f0 = new Fraction (3, 1); Fraction f1 = new Fraction (1, 3); f0.add (f1); f0.pow (2.0); } Parent 2 public void test1 () { Fraction f0 = new Fraction (2, 3); Fraction f1 = new Fraction (2, -1); f0.add (f1); f0.pow (2.0); } Offspring 1 public void test2 () { Fraction f0 = new Fraction (3, 1); Fraction f1 = new Fraction (1, 3); f0. divideBy (f1); f0.add ( Fraction.ZERO); } Offspring 2
  • 9. CROSSOVER OPERATOR 10 public void test1 () { Fraction f0 = new Fraction (2, 3); Fraction f1 = new Fraction (2, -1); f0. divideBy (f1); f0.add ( Fraction.ZERO); } Parent 1 public void test2 () { Fraction f0 = new Fraction (3, 1); Fraction f1 = new Fraction (1, 3); f0.add (f1); f0.pow (2.0); } Parent 2 public void test1 () { Fraction f0 = new Fraction (2, 3); Fraction f1 = new Fraction (2, -1); f0.add (f1); f0.pow (2.0); } Offspring 1 public void test2 () { Fraction f0 = new Fraction (3, 1); Fraction f1 = new Fraction (1, 3); f0. divideBy (f1); f0.add ( Fraction.ZERO); } Offspring 2 Hybrid Multi-level Crossover (HMX) operator Traditional test-level crossover + Data-level recombination
  • 10. OUR SOLUTION 11 HMX: HYBRID MULTI-LEVEL CROSSOVER input: Two parent test cases P1 and P2 output: Two offspring test cases O1 and O2 begin O1,O2 <—— SINGLE-POINT-CROSSOVER(P1,P2); // detect candidate data inputs for data-level crossover C1,C2,M1,M2 <—— DETECT-CORSSOVER-CANDIDATES(O1,O2) foreach SIG ∈ C1.keys ∪ C2.keys do // choose random constructor with same signature S1 <—— random.choice(C1[SIG]) S2 <—— random.choice(C2[SIG]) O1,O2 <—— DATA-CROSSOVER(O1,O2,PARAMS(S1),PARAMS(S2)) done foreach SIG ∈ M1.keys ∪ M2.keys do // choose random method with same signature S1 <—— random.choice(M1[SIG]) S2 <—— random.choice(M2[SIG]) O1,O2 <—— DATA-CROSSOVER(O1,O2,PARAMS(S1),PARAMS(S2)) done return O1,O2; end
  • 11. TEST-LEVEL CROSSOVER OPERATOR 12 HMX: HYBRID MULTI-LEVEL CROSSOVER input: Two parent test cases P1 and P2 output: Two offspring test cases O1 and O2 begin O1,O2 <—— SINGLE-POINT-CROSSOVER(P1,P2); // detect candidate data inputs for data-level crossover C1,C2,M1,M2 <—— DETECT-CORSSOVER-CANDIDATES(O1,O2) foreach SIG ∈ C1.keys ∪ C2.keys do // choose random constructor with same signature S1 <—— random.choice(C1[SIG]) S2 <—— random.choice(C2[SIG]) O1,O2 <—— DATA-CROSSOVER(O1,O2,PARAMS(S1),PARAMS(S2)) done foreach SIG ∈ M1.keys ∪ M2.keys do // choose random method with same signature S1 <—— random.choice(M1[SIG]) S2 <—— random.choice(M2[SIG]) O1,O2 <—— DATA-CROSSOVER(O1,O2,PARAMS(S1),PARAMS(S2)) done return O1,O2; end
  • 12. TEST-LEVEL CROSSOVER OPERATOR 13 public void test1 () { Fraction f0 = new Fraction (2, 3); Fraction f1 = new Fraction (2, -1); f0. divideBy (f1); f0.add ( Fraction.ZERO); } P1 public void test2 () { Fraction f0 = new Fraction (3, 1); Fraction f1 = new Fraction (1, 3); f0.add (f1); f0.pow (2.0); } P2 public void test1 () { Fraction f0 = new Fraction (2, 3); Fraction f1 = new Fraction (2, -1); f0.add (f1); f0.pow (2.0); } O1 public void test2 () { Fraction f0 = new Fraction (3, 1); Fraction f1 = new Fraction (1, 3); f0. divideBy (f1); f0.add ( Fraction.ZERO); } O2
  • 13. DETECT CROSSOVER CANDIDATES 14 HMX: HYBRID MULTI-LEVEL CROSSOVER input: Two parent test cases P1 and P2 output: Two offspring test cases O1 and O2 begin O1,O2 <—— SINGLE-POINT-CROSSOVER(P1,P2); // detect candidate data inputs for data-level crossover C1,C2,M1,M2 <—— DETECT-CORSSOVER-CANDIDATES(O1,O2) foreach SIG ∈ C1.keys ∪ C2.keys do // choose random constructor with same signature S1 <—— random.choice(C1[SIG]) S2 <—— random.choice(C2[SIG]) O1,O2 <—— DATA-CROSSOVER(O1,O2,PARAMS(S1),PARAMS(S2)) done foreach SIG ∈ M1.keys ∪ M2.keys do // choose random method with same signature S1 <—— random.choice(M1[SIG]) S2 <—— random.choice(M2[SIG]) O1,O2 <—— DATA-CROSSOVER(O1,O2,PARAMS(S1),PARAMS(S2)) done return O1,O2; end Data-level crossover can not be applied to every combination of input data: A. Performing crossover on input data with different types is not logical. B. Applying crossover on input parameters with the same data type that belong to different methods may lead to generate offsprings that are farther from the desired search objective.
  • 14. DETECT CROSSOVER CANDIDATES 15 public void test1 () { Fraction f0 = new Fraction (2, 3); Fraction f1 = new Fraction (2, -1); f0.add (f1); f0.pow (2.0); } O1 public void test2 () { Fraction f0 = new Fraction (3, 1); Fraction f1 = new Fraction (1, 3); f0. divideBy (f1); f0.add ( Fraction.ZERO); } O2 C1 Key (Signature of constructors invoked in both O1 and O2) Value (list of constructors called in O1 that has the same signature) Fraction|<init>(int, int) new Fraction (2, 3) new Fraction (2, -1) Each method or constructor implemented in a project has a unique string called Signature. Signature format: CLASS_NAME|FUNCTION_NAME(PARAM1_TYPE, PARAM2_TYPE, …)RETURN_TYPE C2 Key (Signature of constructors invoked in both O1 and O2) Value (list of constructors called in O2 that has the same signature) Fraction|<init>(int, int) new Fraction (3, 1) new Fraction (1, 3)
  • 15. DETECT CROSSOVER CANDIDATES 16 public void test1 () { Fraction f0 = new Fraction (2, 3); Fraction f1 = new Fraction (2, -1); f0.add (f1); f0.pow (2.0); } O1 public void test2 () { Fraction f0 = new Fraction (3, 1); Fraction f1 = new Fraction (1, 3); f0. divideBy (f1); f0.add ( Fraction.ZERO); } O2 M1 Key (Signature of methods invoked in both O1 and O2) Value (list of methods called in O1 that has the same signature) Fraction|add(Fraction)V add(f1) Each method or constructor implemented in a project has a unique string called Signature. Signature format: CLASS_NAME|FUNCTION_NAME(PARAM1_TYPE, PARAM2_TYPE, …)RETURN_TYPE M2 Key (Signature of methods invoked in both O1 and O2) Value (list of methods called in O2 that has the same signature) Fraction|add(Fraction)V add(Fraction.ZERO)
  • 16. DATA CROSSOVER 17 HMX: HYBRID MULTI-LEVEL CROSSOVER input: Two parent test cases P1 and P2 output: Two offspring test cases O1 and O2 begin O1,O2 <—— SINGLE-POINT-CROSSOVER(P1,P2); // detect candidate data inputs for data-level crossover C1,C2,M1,M2 <—— DETECT-CORSSOVER-CANDIDATES(O1,O2) foreach SIG ∈ C1.keys ∪ C2.keys do // choose random constructor with same signature S1 <—— random.choice(C1[SIG]) S2 <—— random.choice(C2[SIG]) O1,O2 <—— DATA-CROSSOVER(O1,O2,PARAMS(S1),PARAMS(S2)) done foreach SIG ∈ M1.keys ∪ M2.keys do // choose random method with same signature S1 <—— random.choice(M1[SIG]) S2 <—— random.choice(M2[SIG]) O1,O2 <—— DATA-CROSSOVER(O1,O2,PARAMS(S1),PARAMS(S2)) done return O1,O2; end
  • 17. DATA CROSSOVER 18 public void test1 () { Fraction f0 = new Fraction (2, 3); Fraction f1 = new Fraction (2, -1); f0.add (f1); f0.pow (2.0); } O1 public void test2 () { Fraction f0 = new Fraction (3, 1); Fraction f1 = new Fraction (1, 3); f0. divideBy (f1); f0.add ( Fraction.ZERO); } O2 C1 Key (Signature of constructors invoked in both O1 and O2) Value (list of constructors called in O1 that has the same signature) Fraction|<init>(int, int) new Fraction (2, 3) new Fraction (2, -1) C2 Key (Signature of constructors invoked in both O1 and O2) Value (list of constructors called in O2 that has the same signature) Fraction|<init>(int, int) new Fraction (3, 1) new Fraction (1, 3) DATA-CROSSOVER(…)
  • 18. DATA CROSSOVER 19 HMX: HYBRID MULTI-LEVEL CROSSOVER input: Two parent test cases P1 and P2 output: Two offspring test cases O1 and O2 begin O1,O2 <—— SINGLE-POINT-CROSSOVER(P1,P2); // detect candidate data inputs for data-level crossover C1,C2,M1,M2 <—— DETECT-CORSSOVER-CANDIDATES(O1,O2) foreach SIG ∈ C1.keys ∪ C2.keys do // choose random constructor with same signature S1 <—— random.choice(C1[SIG]) S2 <—— random.choice(C2[SIG]) O1,O2 <—— DATA-CROSSOVER(O1,O2,PARAMS(S1),PARAMS(S2)) done foreach SIG ∈ M1.keys ∪ M2.keys do // choose random method with same signature S1 <—— random.choice(M1[SIG]) S2 <—— random.choice(M2[SIG]) O1,O2 <—— DATA-CROSSOVER(O1,O2,PARAMS(S1),PARAMS(S2)) done return O1,O2; end
  • 19. DATA CROSSOVER 20 1. Numerical data types —> Simulated Binary Crossover (SBX) 2. Strings —> String Crossover HMX SUPPORTS DATA RECOMBINATION FOR TWO DATA TYPES
  • 20. DATA CROSSOVER 21 SIMULATED BINARY CROSSOVER (SBX) O1: new Fraction (1.5, -1) O2: new Fraction (3.8, 1) Crossover (2, 3) Crossover (-1, 1) Deb, K., Sindhya, K., Okabe, T.: Self-adaptive simulated binary crossover for real parameter optimization. In: GECCO 2007. 1.5 3.8 O1: new Fraction (2, -1) O2: new Fraction (3, 1)
  • 21. DATA CROSSOVER 22 SINGLE-POINT STRING CROSSOVER String 1: lor em String 2: ipsum lorsum ipem McMinn, P.: Search-based software test data generation: A survey. Software Testing Verification and Reliability. (2004)
  • 22. EMPIRICAL EVALUATION 23 1. State-of-the-art search-based unit test generation: EvoSuite running DynaMOSA with default parameters • Baseline: EvoSuite + SPX • Novel approach: EvoSuite + HMX 2. Benchmark: • 9 projects, which commonly use numeric and string input data. • 100 non-trivial classes under test that accept at least one string or numeric value as input parameter. 3. Search budget = 5 minutes 4. Repeated each execution for 100 times 5. in total: 23,200 executions EMPIRICAL EVALUATION
  • 23. RQ1: TO WHAT EXTENT DOES HMX IMPROVE STRUCTURAL COVERAGE COMPARED TO THE SINGLE-POINT CROSSOVER? 24 ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● 0.00 0.25 0.50 0.75 1.00 HMX SPX Crossover Line coverage ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● 0.00 0.25 0.50 0.75 1.00 HMX SPX Crossover Branch coverage OVERVIEW OF STRUCTURAL COVERAGE COMPARING HMX TO SPX
  • 24. RQ1: TO WHAT EXTENT DOES HMX IMPROVE STRUCTURAL COVERAGE COMPARED TO THE SINGLE-POINT CROSSOVER? 25 Pairwise comparison of impact of HMX on structural coverage with a small, medium, and large effect size and a statistical significance <0.05 1. Impact factor measurement: Vargha-Delaney Â12 statistic 2. Assess the significance of results: non-parametric Wilcoxon Rank Sum test Metric #Win #Lose Small Medium Large Small Medium Large Branch coverage 5 3 22 1 0 0 Line coverage 1 3 19 1 0 0 Summary: HMX crossover operator achieves significantly higher (~30% of the cases) or equal structural code coverage for unit test case generation compared to the baseline SPX. Maximum increase of branch coverage achieved by HMX: 19.1% Maximum increase of line coverage achieved by HMX: 19.4%
  • 25. RQ2: HOW DOES HMX IMPACT THE FAULT-DETECTION CAPABILITY OF THE GENERATED TESTS? 26 OVERVIEW OF MUTATION SCORE ACHIEVED BY HMX AND SPX ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● 0.25 0.50 0.75 1.00 HMX SPX Crossover Weak mutation score 0.00 0.25 0.50 0.75 1.00 HMX SPX Crossover Strong Mutation score
  • 26. RQ2: HOW DOES HMX IMPACT THE FAULT-DETECTION CAPABILITY OF THE GENERATED TESTS? 27 Pairwise comparison of impact of HMX on fast detection capability of search process with a small, medium, and large effect size and a statistical significance <0.05 1. Impact factor measurement: Vargha-Delaney Â12 statistic 2. Assess the significance of results: non-parametric Wilcoxon Rank Sum test Metric #Win #Lose Small Medium Large Small Medium Large Weak mutation 3 3 21 1 0 0 Strong mutation 8 0 15 3 0 0 Summary: HMX achieves significantly higher (~25% of the cases) or equal fault detection capability compared to SPX and is outperformed only in one and three classes for weak and strong mutation, respectively. Maximum increase of weak mutation achieved by HMX: 14% Maximum increase of strong mutation achieved by HMX: 12.2%
  • 27. FUTURE WORK 28 • Additional crossover operators for other types (e.g., array, list, map). • Extend our experiment by assessing other crossover operators for numbers (e.g., parent-centric and arithmetic crossover) and strings (e.g., multi-point crossover).
  • 28. REPLICATION PACKAGE THANK YOU FOR LISTENING 29 Replication Package https://zenodo.org/record/5102598#.YV6uAS8Rqrw