Keywords: Requirements, Testing, Separation of Concerns, Traceability, Program Comprehension, Dynamic Analysis
Requirements traceability is considered to be important for software understanding as it supports answers for questions such as "why a particular source code entity has been implemented". However, the presence of and traceability to requirements is increasingly lost in later more code-centric development activities. Tracing which parts of the system contribute to which requirement is therefore hard and so limits understandability.
We automatically recover traceability by linking requirements with their test cases and analyzing their run-time behavior. Often, test cases were implemented with a particular reason in mind such as verifying a specific requirement. With the connection between test cases and their requirements (or other development artifacts), the meaning of subsequently behavioral paths can be enhanced. Adapting the concepts of feature localization, annotated test cases are executed and covered methods are related to the requirements in question. A requirement is traced to a source code entity if it has been executed at least once in a specific test case that is linked to this requirement. Depending on the coverage of test cases, large parts of the system can be traced and classified to requirements automatically. Thus, our approach allows developers to comprehend the system from the user's point of view and to answer typical software maintenance questions such as ”how is this requirement implemented?” or ”which source code entities are related to the user’s failure report?”.
The approach is based on our previous work for use-cases and Python:
- Robert Hirschfeld, Michael Perscheid, Michael Haupt. Explicit Use-case Representation in Object-oriented Programming Languages. In Proceedings of Dynamic Language Symposium (DLS 2011), Portland, USA, October 2011, ACM. (PDF)