Chapter 13. Writing Tests
Over the past two decades, the widespread adoption of automated testing has probably done more to improve code quality than any other software engineering technique. As a language and ecosystem focused on improving software quality, it’s not surprising that Go includes testing support as part of its standard library. Go makes it so easy to test your code, there’s no excuse to not do it. In this chapter, we’ll see how to test our Go code, group our tests into unit and integration tests, examine code coverage, write benchmarks, and learn how to check our code for concurrency issues using the Go race checker. Along the way, we’ll discuss how to write code that is testable and why this improves our code quality.
The Basics of Testing
Go’s testing support has two parts: libraries and tooling. The
testing package in the standard library provides the types and functions to write tests, while the
go test tool that’s bundled with Go runs your tests and generates reports. Unlike many other languages, Go tests are placed in the same directory and the same package as the production code. Since tests are located in the same package, they are able to access and test unexported functions and variables. We’ll see in a bit how to write tests that ensure that we are only testing a public API.
Complete code samples for this chapter are found on GitHub.
Let’s write a simple function and then a test to make sure the function works. In the file adder/adder.go, we have: ...