Reliable Objects: Lightweight Testing for OO Languages David Mattingly
Problems addressed Based on waterfall model – not on iterative models. No longer feasible to separate testing from specification, design, coding. Not based upon inherent power of OO.
Specifying behavior Must know what each component should do in every situation No formal specification language
Design by Contract Lightweight descriptions Captures mutual obligations and benefits Must specify every consistency condition Boolean assertions
Implementation Implementations exist in Eiffel, Java, C++, Perl. Eiffel only language to directly support design by contract. All other languages rely on outside utilities.
Java Implementation Example from Pylon library (www.nenie.org/eiffel/pylon) Source code with self-testable classes at www.iu-vannes.fr/docinfo/stclass
Java Design by Contract Contract Watchdogs trace and assert
Implementation 1 Call inherited functions directly in code. Another level of inheritance. Calls inside methods can be forgotten about.
Implementation 2 Contract definition in comments Preprocessor iContract (www.reliable-systems.com/tools)
Making self-testable classes Define pre and post-conditions in comments. Interface inheritance and Delegation. Testing methods: testing unit & goal
Validation & Verification Compile with iContract & Java compiler. Output details results of tests.
Abstract Classes Cannot be self-testable Can define contracts Implementing classes inherit contracts
Mutation Testing Determine how adequate our tests our. Adequate Test set distinguishes the original program from mutants.