Systematic Techniques for Efficiently Checking Software Product Lines
In this dissertation, we present a suite of complementary static and dynamic techniques for efficient testing and runtime monitoring of SPLs, which can be divided into two categories. The first prunes programs, termed "configurations", that are irrelevant to the property being tested. More specifically, for a given test, a static analysis identifies features that can influence the test outcome and the test needs to be run only on the combinations of these features. A dynamic analysis counterpart also eliminates configurations that have to be tested, but does so by checking a simpler property and can be faster and more scalable. In addition, for runtime monitoring, a static analysis identifies configurations that can violate a safety property and only these configurations need to be monitored.
When no configuration can be pruned, either by design of the test or due to ineffectiveness of program analyses, runtime similarity between configurations, arising due to design similarity between configurations of a product line, is exploited. In particular, shared execution runs all the configurations together, executing bytecode instructions common to the configurations just once. Deferred execution improves on shared execution by increasing the amount of sharing for object-oriented programs and for programs using arrays.
The techniques have been evaluated and the results demonstrate that the techniques can be effective and can advance the idea that despite the feature combinatorics of an SPL, its structure can be exploited by automated analyses to make testing more efficient.