When developers cannot unit test

Unit tests is an essential method of ensuring quality and predictability of software. In my current work, we have been going through a hard learning curve involving many factors:

  • developers not familiar with unit tests.
  • a proprietary technology ecosystem where the community is typically not practicing unit tests at all.
  • a legacy code base not written with unit tests in mind

When developers are not familiar with unit tests, you have to first convince them that unit tests have value. Developers are known to have poor communication skills, so communicating and convincing can be challenging. They’re also known to hold on to their opinions, defend bad practices due to their ‘experience’, and other ego-related issues. In the end, you may need a higher power to help. I’m not talking about religion but getting management buy-in.

In my case I was lucky to have developers willing to learn and I didn’t have to waste any energy futile. But, willingness doesn’t beat habit. Every now and then, people will simply forget about writing unit tests. It is expected and understandable. If you’ve never written unit tests before, you’ll tend to forget about it. How do we deal with this? We try to keep an eye out during code reviews. A tip I tell people is to just look at the filenames in a pull request (PR). Don’t even go to the code itself, just look at the listing of the filenames. If a code file is affected in a PR but its corresponding unit test isn’t, then 90% of the time it means the author forgot to create or amend the unit tests. Code coverage also helps here, but only assuming your threshold is close to the actual coverage. If your coverage is at 80% and your threshold is 70%, you don’t want to lose a 10% investment before you figure out that people are not writing tests.

When you’re working on a proprietary platform with no unit test culture, hiring the ideal developer is practically impossible. Somebody who knows the platform very well will probably have never written a unit test, because nobody writes unit tests in this platform. (Side note: This culture leads to what a friend of mine calls the web agency bingo. The client hires a web agency, for a while everything is fine, then bugs accumulate, the client is unhappy, picks another web agency with new hopes and the game starts over). Depending on the existing skills of the team, you hire for what it takes less time to train for, there’s no silver bullet here. You can do pair programming and knowledge sharing sessions to help reduce imbalances in the skills of the team. That will take time (which, depending on priorities, it may be a luxury).

But the biggest problem of all is teaching how to write a good unit test. I think that a lot of this comes with experience and it is subjective up to a certain extent.

In the following weeks, I’ll try to write some posts about:

  • what is a unit test and what is a unit
  • what is test driven development
  • how to deal with dependencies
  • avoiding evergreen tests
  • testing behavior and not implementation
  • if a developer writes tests, what is the role of the QA engineer

and similar topics. I hope that by writing these things down, I’ll clear them a bit in my head and then I’ll become a bit better in explaining them to others.


One thought on “When developers cannot unit test”

  1. Good read!

    “Code coverage also helps here, but only assuming your threshold is close to the actual coverage. If your coverage is at 80% and your threshold is 70%, you don’t want to lose a 10% investment before you figure out that people are not writing tests”

    By failing the build when the code coverage is lower than the coverage of the last successful build you will tackle this problem. This can be configured in most CI tools and also in SonarQube Quality Gates for instance.


Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google+ photo

You are commenting using your Google+ account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )


Connecting to %s