Why Dumb Tests are Smart šŸ§ 

Roy Straub
3 min readFeb 18, 2023

--

Writing tests that help evolve a system is hard, and you get there by avoiding smart tests while preferring dumb ones. Letā€™s dive in.

The Paradox of Smart Tests šŸ¤”

Smart is always better than dumb, isnā€™t it?

Maybe, but maybe not.

This time weā€™ll look at the paradox that dumb programmer tests are superior to smart ones. This paradox demands an explanation, but first, we must consider what tests should be like.

Desired Qualities of Programmer Tests ā˜ļø

Well-written automated tests are:

  • Easy to read
  • Intention revealing
  • Focused

Put succinctly, programmer tests should make change easy. Change to code under test and the test code itself.

How do you achieve this?

Write simple, straightforward, or ā€œdumbā€ tests, not intricate and full of magic or ā€œsmartā€ ones. Letā€™s have a look at smart tests first.

Anatomy of a Smart Test šŸ§¬

What is a smart test, then?

Smart tests contain logic obscuring the true meaning of the test. For example, this logic might exist for one of these goals:

  • capturing common setup
  • creating test in- or output
  • reducing the amount steps in the test

These all try to reduce duplication.

In general, this is a good thing. The DRY-principle (Donā€™t Repeat Yourself) is an excellent heuristic for ending up with maintainable code.

But, as always, there is a cost. The cost tends to be in the form of code being less descriptive; it becomes less straightforward.

For example, Iā€™ve encountered tests that took me hours to understand because input data was dynamically generated, filtered, and transformed. It might save lines of code, but the reader deals with the complexity.

Now we know what smart tests are, letā€™s see how dumb tests compare.

Superiority of Dumb Tests šŸŖ„

Dumb tests contain no magic and require no mental gymnastics to understand. They are easy to read and intention-revealing.

Great tests might be DRY, but the best ones exhibit the DAMP (Descriptive and Meaningful Phrases) principle. Code always exists on a spectrum of being explicit and preventing duplication, and it is up to you to strike a good balance. Tests should value their ability to convey their meaning above all else.

This is because a major goal of programmer tests is to explain production code, as I mentioned here. The last thing you want is to decipher the meaning of tests on top of understanding production code.

There are strategies to get to tests that are both descriptive and easy to maintain, such as:

The most bullet-proof heuristic, though, is to ask yourself whether code aids or prevents comprehension of a test for future readers. This applies to production code as well, of course!

Conclusion šŸ“

Smart isnā€™t always better, especially when it comes to tests. Ideally, programmer tests should be easy to read and clearly state their intention, but this is hard.

You get to great tests by placing yourself in the shoes of the future reader. Moreover, you make your tests DAMP instead of DRY by valuing being expressive over preventing duplication.

The result is automated tests that form the catalyst for change instead of inhibiting it.

Originally published at https://www.codecraftr.nl on February 18, 2023.

Sign up to discover human stories that deepen your understanding of the world.

Free

Distraction-free reading. No ads.

Organize your knowledge with lists and highlights.

Tell your story. Find your audience.

Membership

Read member-only stories

Support writers you read most

Earn money for your writing

Listen to audio narrations

Read offline with the Medium app

--

--

Roy Straub
Roy Straub

Written by Roy Straub

Software Engineer @ NS. Passionate about Software Craftsmanship. Happily coding since 2010. Find my latest content on www.codecraftr.nl

Responses (1)

Write a response