Test-First Development

Steven J Zeil

Last modified: Dec 27, 2023
Contents:

Abstract

Test-First Development (TFD) and Test-Driven Development (TDD) treat unit testing as an integral part of the design and implementation process. Often summarized as “test first, code after”, TFD and TDD are actually a recognition that, when writing tests, we are

1 Test-First Development

With our new knowledge of unit-testing frameworks, ideally, we have made it easier to write self-checking unit tests than to write the actual code to be tested.

1.1 Debugging: How Can You Fix What You Can’t See?

The test-first philosophy is easiest to understand in a maintenance/debugging context.

1.2 Test-Writing as a Design Activity

Every few years, software designers rediscover the principle of writing tests before implementing code.

Agile and TDD (Test-Driven Development) are just the latest in this long chain.

1.2.1 Tests are Examples

“If it’s hard to write a test, it’s a signal that you have a design problem, not a testing problem. Loosely coupled, highly cohesive code is easy to test.” – Kent Beck

1.3 The Cycle of Unit Test Failures

 

Here you can see a plot of test cases on the vertical axis versus time (actually, commits to the version control system) on the horizontal axis during a project on which I practiced TFD.

Tests passed are shown in blue and failed tests are shown in red.

Notice the repeated pattern:

2 TFD during Incremental Development

My stereotypical division of a story into tasks is typically

  1. Create/modify the API to describe a new desired behavior.
  2. Write the unit tests.
  3. Implement the new behavior.
  4. Integrate and commit changes.

Compare this to the steps of TDD, above, and you can see that they are compatible.

2.1 Case Study: TFD of a Spreadsheet Story

For the the Embeddable Spreadsheet project:

Story: As a spreadsheet designer, I would like to write expressions involving square roots

Refer to outline for the videos illustrating tasks 1 and 2

  1. Create/modify the API to describe a new desired behavior.
  2. Write the unit tests.

being applied to this story.