Testing is one of the most frequently performed and important activities in the work life of all programmers. Unfortunately, for critical and frequently re-used code, manual testing often requires great effort for mediocre results. This project focuses on automatically generating tests for modules with an interface that alters system state, e.g. critical modules such as file systems and data structures that are used in many safety- or economically- critical software systems.
This project improves the state-of-the-art through a novel integration of proven methods, combined with fundamental improvements to underlying testing approaches. The most efficient test methods (in terms of program paths explored per second) are used to generate very large numbers of unique paths to expose faults, while the most effective method (in terms of exploring hard-to-reach paths that reveal very difficult-to-find faults) are used to complete testing in a two-stage approach. The central idea is to resort to expensive test generation methods only when it is unlikely that cost-effective methods will succeed.
This project improves software testing education by curriculum and textbook development aimed at introducing undergraduate students to principled testing, a far-too-common omission in current CS education.
Spacecraft flight software, including file systems and data structures used in flight systems, provides early applications for this approach. Inadequate testing methods cost tens of billions of dollars each year, despite high test budgets. More effective testing will provide economic benefit and contribute (e.g., through spacecraft software or other scientific applications) to basic scientific research and exploration in other fields.