Go has really good support for unit testing out of the box. With the
go test CLI and the
testing std library you can do almost *everything.
One of the niceties it provides is code coverage. You can run your tests with a flag
-cover or you can even have to collect the coverprofile and spin up an interactive UI and check your code and what branches are covered with
# run tests and create a coverprofile go test ./... -coverprofile=cover.out # open the interactive UI to check the Coverage Repor go tool cover -html=cover.out
You should see something similar to this for your code
The red colour indicates that those branches are not covered at all by your unit tests and then with shades of green, you can see how much your code is covered.
All this is good, what Go provides right away is at least amazing. But what I have found missing, is coverage threshold.
If you are coming from js ecosystem you might have encountered this in jest. With a coverage threshold, if your tests are less than a specified percentage, even if they are successful they will fail.
There is a long debate about whether high code coverage or what percentage of code coverage is the best. This post is not covering this debate. If you are interested I could do it in a separate post and share my thoughts.
Code coverage "tracking" can be useful, in many different scenarios. Adding a new feature, you write your unit tests but you miss covering some branches. If your coverage goes below the acceptable threshold you will be notified right away when running your tests. If someone is contributing to your team's project, it can show that you are expecting at least some basic unit tests for the code he wrote.
So I took the opportunity and wrote a small util library, that does exactly that.
Given a threshold number if your package is below that, then it will fail your tests
You can find the code and the library in coverage. Have a look and tell me what you think.
Thanks for reading ❤️