DISS. ETH N O 18072 Contract-based tests in the software process and environment A dissertation submitted to the ETH Zurich for the degree of Doctor of Sciences presented by Andreas Leitner Diplom Ingenieur, TU Graz born January 16th, 1977 citizen of Austria accepted on the recommendation of Prof. Dr. Bertrand Meyer, examiner Prof. Dr. David Basin, co-examiner Prof. Dr. Roderick Bloem, co-examiner Prof. Dr. Andreas Zeller, co-examiner 2008
ABSTRACT In many projects, software testing comes as an afterthought. Recent development methods try to break this habit by placing testing at the center of development. This heightened role of tests raises new problems: the development process must interleave testing with other activities; developers must prepare more tests; these tests must be executed continuously and hence must be short. Contracts in the form of preconditions, postconditions and invariants help to automate testing and relieve developers: preconditions filter invalid inputs, postconditions serve as oracles. This thesis presents the following contract-based testing techniques: Test cases can be extracted: contract violations are made reproducible via persistent and quickly executing unit tests. These extracted tests aid debugging and later on regression testing. Unlike capture and replay techniques, our novel extraction mechanism has no run-time overhead. Test cases can be synthesized: a strategy for automatically generating inputs combined with a contract-based oracle enables fully automated testing. Even a random-based synthesis strategy, simple but widely applicable, finds a variety of faults in production quality source code. Test cases created by a random-based strategy can grow very large and become difficult to debug, hence they should be minimized. We have developed a combination of slicing and delta debugging which significantly minimizes the generated test cases. We also present auxiliary methods concerning test case selection, prioritization and reflection. We have implemented these techniques in two tools: CDD EiffelStudio, a test case extractor, which is integrated in the EiffelStudio development environment and AutoTest, a test case synthesizer, executor, and minimizer. This thesis includes empirical evaluations of both tools to prove their effectiveness and efficiency. iii
iv
ZUSAMMENFASSUNG Das Testen von Software geschieht in vielen Projekten nur im Nachhinein. Moderne Softwareentwicklungsprozesse brechen damit Sie rücken Testen ins Zentrum der Entwicklung. Diese neue Rolle bringt aber auch neue Herausforderungen: Testen muss mit anderen Aktivitäten verschachtelt werden, Entwickler müssen mehr Tests erzeugen, diese Tests müssen fortwährend ausgeführt werden und deswegen auch kurz sein. Verträge in der Form von Vorbedingungen, Nachbedingungen und Invarianten helfen bei der Testautomatisierung und entlasten den Entwickler: Vorbedingungen erkennen ungültigen Input und Nachbedingungen ungültigen Output. Die vorliegende Arbeit zeigt die folgenden vertragsbasierten Testtechniken: Tests können extrahiert werden: Ein Werkzeug erzeugt aus Vertragsverletzungen persistente und schnell auszuführende Unittests. Diese extrahierten Tests erleichtern das Debuggen und helfen später beim Regressionstesten. Unser Ansatz verlangsamt, anders als Capture and Replay, die Ausführungsgeschwindikeit von Programmen nicht. Tests können synthetisiert werden: Eine Strategie zum automatischen Erzeugen von Inputs kombiniert mit vertragsbasiertem Testen automatisiert das Testen vollständig. Sogar zufallsbasierte Synthesestrategien, welche einfach und leicht einzusetzen sind, finden eine Vielfalt von Fehlern in industriellem Quellcode. Tests, erzeugt von einer zufallsbasierten Synthesestrategie, sind oft, weil sie sehr gross sein können, schwer zu debuggen. Deswegen sollte man sie verkleinern. Wir haben eine Methode entwickelt, die Testfälle durch eine Kombination von Slicing und Delta Debugging verkleinert. Ausserdem präsentieren wir unterstüzende Methoden die bei der Testauswahl, Testreihung und Testausführungen von Nutzen sind. Wir haben diese Techniken in zwei Werzeugen implementiert: CDD EiffelStudio, ein Testfallextrahierer, der in die EiffelStudio Entwicklungsumgebung eingebettet ist und AutoTest, ein Werzeug zum synthetisieren, ausführen, und verkleiv
nern von Tests. Empirische Evaluierungen bezeugen die Effektivität und Effizienz dieser Werkzeuge. vi