dockertest
dockertest copied to clipboard
test database interactions with Docker
Dockertest 
dockertest allows you to quickly and easily test database interactions by
creating and destroying databases within your tests using docker.
It works by controlling the docker daemon running locally with exec.Command.
The flow is as follows ->
- find a free port on the local machine
- launch docker container and bind that port
- wait until the container needs to be shutdown
dockertest is inspired by https://divan.github.io/posts/integration_testing/
and https://github.com/ory-am/dockertest - however, it does not add 300k loc of dependencies (guesstimated) to your project. See https://github.com/fsouza/go-dockerclient/issues/599 for more info on this.
Installation
go get -u github.com/fortytw2/dockertest
currently the tests depend on github.com/lib/pq
How good is it?
Currently the manipulation of the docker daemon is somewhat fragile, as it depends on exec.Command and a well placed time.Sleep for shutdown. In an
ideal world, this would use the docker api via the docker socket directly,
but it currently works well enough for now. Contributions welcome
Usage
Postgres example copied from github.com/fortytw2/hydrocarbon
func TestDBBits(t *testing.T) {
container, err := dockertest.RunContainer("postgres:alpine", "5432", func(addr string) error {
db, err := sql.Open("postgres", "postgres://postgres:postgres@"+addr+"?sslmode=disable")
if err != nil {
return err
}
return db.Ping()
})
defer container.Shutdown()
if err != nil {
t.Fatalf("could not start postgres, %s", err)
}
db, err := sql.Open("postgres", "postgres://postgres:postgres@" + container.Addr + "?sslmode=disable")
if err != nil {
t.Fatal(err)
}
// run tests on the db, etc
}
It should be trivial to adapt the above bits to work just as well from a
TestMain function, if you want to avoid running a new container for each
individual test function - subtests also help here.
Docker-machine host
Note that dockertest will give priority to the DOCKER_MACHINE_NAME when looking for your container address and will fallback to localhost if it fails to find it.
License
MIT, see LICENSE