This is a quick post to describe how you can use test fixtures, data files on disk, with the Go testing package. Using fixtures with the Go testing
package is quite straight forward because of two convenience features built into the go
tool.
First, when you run go test
, for each package in scope, the test binary will be executed with its working directory set to the source directory of the package under test. Consider this test in the example
package:
package example
import (
"os"
"testing"
)
func TestWorkingDirectory(t *testing.T) {
wd, _ := os.Getwd()
t.Log(wd)
}
Running this from a random directory, and remembering that go test
takes a path relative to your $GOPATH
, results in:
% pwd /tmp % go test -v github.com/davecheney/example
=== RUN TestWorkingDirectory
--- PASS: TestWorkingDirectory (0.00s)
example_test.go:10: /Users/dfc/src/github.com/davecheney/example
PASS ok github.com/davecheney/example 0.013s
Second, the Go tool will ignore any directory in your $GOPATH
that starts with a period, an underscore, or matches the word testdata
.
Putting this together, locating a fixture from your test code is as simple as
f, err := os.Open("testdata/somefixture.json")
(technically this code should use filepath.Join
but in these simple cases Windows copes fine with the forward slash). Here are some random examples from the standard library:
Happy testing!