It’s my opinion that you should always write tests for your source code. Tests force you to code better. Tests allow you to write dependable code, create better architecture, and help you live longer*. They also help you spot fussy APIs, opportunities for reuse, and redundancies.
That said. You don’t always have the time (or budget) to test everything to death! Not everyone sees the value in all those little green checkmarks. Life isn’t pedantic and heavy-handed. Life is a pack wild horses and sometimes you need to be the cowboy.
So, when do you push back? When do you say NO! We must write tests!
1. When you have the time.
There is no reason to skip out on writing tests if you have the time to write them. Why would you opt out of better code? Taking the extra time to make your code testable will turn average code into dependable code. Code that you know actually works is almost always better than new code.
2. When you’re making a data structure.
You cannot make a data structure without writing tests for it. Why would anyone trust a data structure that cannot prove it works?
Data structures must be tested. I don’t even know how you’d code a data structure without setting up a test harness first. You don’t know how your code will be used, so knowing that every little piece works as expected is necessary.
With tests, you’ll see the logic in breaking code into small pieces. Tests will make it easier to spot problems in your architecture.
Writing data structures against a test suite is the only way to do it right.
3. When you want community contributions.
Tests are the backbone of any open source project. They make sure that community contributions do not break the codebase. This allows fixes, changes, and optimizations to be made with certainty.
Your test suite becomes the hurdle that any contributor must clear. It’s not too much to ask for contributions that prove they work.
4. When you’re designing an API.
Starting with a test suite is a great way to design an API.
This allows you to work backward from your code interface instead of coding to it. This will let you design an API from the user’s perspective first.
5. When it is a dependency
Point blank. If other code needs to use this code, you must write a test for it.
The testable code will become part of an ever-expanding toolbox. Dependable toy soldiers who can be summoned to fight for you. Go! Test the world!
*There is no scientific data that shows writing tests will help you live longer.