Software development comprises of several phases, including but not limited to
requirements gathering, design, development, verification & validation, and maintenance.
Software development processes are frameworks that impose structure on building a
software system, using one or more of the phases above, and they are broadly classified
as plan-driven and agile. Plan-driven processes (e.g. the Waterfall Model) follow a rigid
structure on the order of phases from requirements gathering towards maintenance, in the
order given above. They put emphasis on documentation, repeatability and stability of
the phases. On the other hand, agile processes (e.g. Test Driven Development) follow an
iterative and incremental approach, where the phases can be repeated while the scope of
the system is expanded on each iteration. Agile processes put more emphasis on system
artifacts (source code and tests) than documentation, which makes them more suitable
for the work in this dissertation.
Although software systems can be built following different development processes
described above, maintenance is the dominating cost during the lifetime of a system,
with 70%-90% of the total cost. During maintenance, the dominating activity is program
comprehension, i.e. understanding requirements and their relation with the system
artifacts such as source code and tests. Therefore, obtaining as much information about
requirements as possible is a major concern during maintenance.
A common activity during the verification & validation phase of development is
testing. It is reported that, in a typical software project, approximately 50% of the total
development time is expended on testing. With the advent of agile processes, this number
is even higher. During testing, test results are typically used in a binary fashion, i.e. to
see if they pass or fail. However, tests contain more information about requirements that
is useful to stakeholders during maintenance.
In this dissertation, we develop novel techniques to understand what is captured
in tests and exploit this information to provide a better understanding on the relationships
between requirements, and their relationship with tests. We provide a holistic approach
to using tests as a useful source of information on requirements and we develop an
end-to-end automated process to benefit from the testing phase during the development
and maintenance of a system. |