Chapter 1 Effective and systematic software testing

What does it mean to write tests in a systematic and effective way?

Chapter 2 Specification-based testing

The first step is to engineer tests based on what the program should do

Chapter 3 Structural testing and code coverage

We then augment our test suite by looking at coverage reports and look for new tests

Chapter 4 Designing contracts

Having clear pre- and post-conditions help us "testing the system from the inside"

Chapter 5 Property-based testing

Instead of writing tests that exercise a single example, can we test higher-level properties?

Chapter 6 Test doubles and mocks

Classes depend on each other. How to test classes that depend on other classes?

Chapter 7 Designing for testability

Some systems are easy to be tested, others are not. Let's talk about design principles that make software systems testable.

Chapter 8 Test-driven development

What if we actually write the test before the production code?

Chapter 9 Larger tests

Unit tests are not enough, but integration tests are no piece of cake. Let's talk about them.

Chapter 10 Test code quality

Test is code, and code needs to be maintained. Learn how to write clear and concise test code.

Subscribe to our mailing list

Receive free articles about software testing in your e-mail!


(see the full list of articles in the articles page)

About the author

Maurício Aniche

Dr. Maurício Aniche's life mission is to help software engineers to become better and more productive. Maurício is a Tech Lead at Adyen, where he heads the Tech Academy team and leads different engineering enablement initiatives. Maurício is also an assistant professor of software engineering at Delft University of Technology in the Netherlands. His teaching efforts in software testing gave him the Computer Science Teacher of the Year 2021 award and the TU Delft Education Fellowship, a prestigious fellowship given to innovative lecturers. He is the author of the "Effective Software Testing: A Developers Guide", published by Manning in 2022.

  • PhD in software engineering
  • TU Delft education fellow and Teacher of the Year
  • Years of experience in software testing

Reach me on Twitter or Linkedin

Frequently Asked Questions

The examples in this book are written in Java. I also make use of Java frameworks, such as JUnit and Mockito. However, I used "basic Java". If you come from a similar language, you should be able to understand this book completely. If you are from a language a bit far away from Java, you can still learn the techniques. Writing the test code itself, in any language, is the "easy part", if you ask me!
This book is more meant for developers. I mean, for the person that also wrote the production code. That being said, testers can also benefit from this book, as many of the techniques I discuss here are also useful for them.
Definitely! See the special page for teachers with tips on how to adopt the book!
I had a novice developer in mind when I wrote this book. This means I do not assume a large previous knowledge on testing from the reader, and I explain every single code snippet. Experts will also benefit from this book as every chapter also ends up with pragmatic discussions of how I have been applying these techniques in the real world.
You can buy this book by clicking in the "buy" buttons you see in this page. This button will redirect you to the Manning page (the publisher of my book), but using a special link that makes me get a little bit more from the sell. Thanks for supporting me!