List of Figures


Screenshot: Class diagram of the dictionary.

Automating Unit Tests

Screenshot: The AWT test runner.
Screenshot: The Swing test runner.
Screenshot: StringBufferTest without tests.
Screenshot: Test runner reports a failure.

Basic Steps of the Test-First Approach

Screenshot: Top-down versus bottom-up approaches.
Screenshot: A small test class hierarchy.
Screenshot: Package structure with test classes.

The Inner Life of a Test Framework

Screenshot: JUnit class diagram.
Screenshot: Sequence diagram for the start of a test case.

Dummy and Mock Objects for Independence

Screenshot: Schematic view of the Dependency Inversion Principle.
Screenshot: Schematic view of the mock objects hierarchy.

Inheritance and Polymorphism

Screenshot: A simple inheritance hierarchy.
Screenshot: A parallel test hierarchy.
Screenshot: Interfaces.
Screenshot: Interface test classes.

Persistent Objects

Screenshot: Object model of the CRM app.
Screenshot: An object-centered persistence interface.

Web apps

Screenshot: MyServlet in the browser.
Screenshot: Test case running in Cactus.
Screenshot: ServletInvocation.

Graphical User Interfaces

Screenshot: The desired Product Editor layout.
Screenshot: A "rudimentary" layout.
Screenshot: The improved layout.

The Role of Unit Tests in the Software Process

Screenshot: Activities, intermediate results, and products in the development process.
Screenshot: Quality-assurance tasks.
Screenshot: The waterfall model [Boehm76].
Screenshot: An incremental process.
Screenshot: Comparing the costs of manual versus automated testing.
Screenshot: Structure of the Rational Unified Process.
Screenshot: Relations between the RUP's testing artifacts.

Appendix B: Unit Tests with Other Programming Languages

Screenshot B.1: The SUnit test runner.
Screenshot B.2: A graphical test runner.