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