# An Experimental Evaluation of Path-Based Product Line Integration Testing and Test Coverage Metrics
## 5 Experimental Evaluation of the Method
### Case Study Using the Elevator System SPL  
This section evaluates the effectiveness of path-based integration testing for SPL using the elevator system product line as a case study. The elevator system product line consists of six features, one mandatory and five optional, resulting in a total of 20 products. The elevator system product line includes a java file containing five java sources and one main method. Figure 6 is the feature model of the elevator system product line. The elevator system product line was implemented using FeatureIDE ([[https://www.featureide.de](https://www.featureide.de)]([https://www.featureide.de](https://www.featureide.de)) (accessed on 24 November 2023)) [28], resulting in a 450 LOC-scale system comprising five classes. A call graph enables a graphical analysis of program call relations and flow sequencing. For analyzing the method call relationship of the elevator system product line, the CallGraph tool provided by Certiv Analytics is utilized. Due to the complexity of the graph, it is challenging to represent and analyze all caller-callee relationships as a single CallGraph. Therefore, in this study, all callees were found starting from the main caller, after which the path graph was created. Figure 7 shows a part of the path graph, illustrating the scenario where the 'ExecutiveFloor' and 'Empty' features are selected. Figure 6: Feature model of the elevator system product line. Figure 7: Part of the XX-MEP-paths for the elevator product line. In Figure 7, 11 cc-MEPs, one cv-MEP and two vv-MEPs are analyzed. Based on these results, three cc-MM-paths and two cv-MM-paths are derived. The resulting paths are given below:  
**CC-MM-path:**  
A.randomSequenceOfActions/X.XXCall/C.Person/D.addWaitingPerson  
A.randomSequenceOfActions/B.isIdle/B.anyStopRequested/E.getFloor/D.hasCall  
B.timeShift/C.getDestination  
**CV-MM-path:**  
B.timeShift/B.leaveElevator/C.leaveElevator/C.getName/lvp_B.isEmpty  
**VV-MM-path:**  
B.timeShift/B.stopRequestedAtCurrentFloor/lvp_B.isExecutiveFloorCalling/E.getFloorID/D.hasCall/lvp_B.isExecutiveFloor  
The experiment was conducted during product testing following the sample application test strategy. This study addressed whether the xx-MM-path was covered by the integration testing test case using EclEmma version 3.1.0, a code coverage measurement tool. The next test case involves passengers moving from the executive floor to the ground floor. These test cases cover cc-, cv-, and vv-MM-path as defined (with method call coverage at 100% and all relevant branches covered). cc-MM-paths are covered in one sample product testing, and they are not retested in other product testing. Testing cc-MM-paths through a single sample product offers the advantage of achieving the required coverage while addressing the challenge of platform testing with high-complexity platform features that lack executable implementation. @Test  
public void Specification1() {  
Environment env = new Environment(5);  
Elevator e = new Elevator(env, false);  
Actions a = new Actions(env, e);  
a.bobCall()://going from Executive floor to Ground floor  
for (int i = 0; i < cleanupTimeShifts &&! e.isBlocked(); i++) {  
if (e.isIdle())  
return;  
e.timeShift();  
A total of 26 methods are part of the MM-path originating from the 'timeshift(0)' method, which has the most method call relationships within the elevator system product line. Of these, nine methods encompass a total of 44 branches. The following additional test cases are derived from the previously mentioned MM-paths:(Test public void Specification1() { Environment env = new Environment(5); Elevator e = new Elevator(env, false); Actions a = new Actions(env, e); a.aliceCall)://going from 3 to 0 a.bobCall()://going from Executive floor to Ground floor for (int i = 0; i! cleanupTimeShifts &&! e.isBlocked(); i++) { e.timeShift(); } a.bigMacCall()://going from 1 to 3 for(int i = 0; i! cleanupTimeShifts &&!e.isBlocked(); i++) e.timeShift(); a.aliceCall()://going from 3 to 0 a.chuckCall()://going from 1 to 3 for (int i = 0; i!