Software Engineering, Unit Tests, Co-Evolution, Declarative Meta Programming
The concept of Unit Testing, as introduced by Extreme Programming, is gaining more and more acceptance when developing code. Unit tests are sets of executable code (methods) that exercise the system with the intent of checking it for correctness. Important is that they are automated, reproducible, and run without human interaction. However, it is currently hard to keep unit tests synchronized with the source code. One problem is that unit tests are not explicitly linked to the implementation: when changing the implementation it is not possible to see what unit tests are impacted. Vice versa, when changing a unit test, it is not cleat how this affects the implementation. In this thesis you will link the unit tests and the implementation such that the impact of changes to one can be seen on the other. This will be done by constructing a framework of logic rules that express the mapping between unit tests and the implementation. Synchronizing and detecting differences between both is then done by running a logic query. Validation of the work will be done by refactoring an existing body of unit tests for two small applications.