2020-03-01 16:06:34 +00:00
|
|
|
[![Build Status](https://travis-ci.org/testcontainers/testcontainers-go.svg?branch=master)](https://travis-ci.org/testcontainers/testcontainers-go)
|
2020-09-06 12:31:23 +00:00
|
|
|
[![Go Report Card](https://goreportcard.com/badge/github.com/testcontainers/testcontainers-go)](https://goreportcard.com/report/github.com/testcontainers/testcontainers-go)
|
|
|
|
[![GoDoc Reference](https://camo.githubusercontent.com/8609cfcb531fa0f5598a3d4353596fae9336cce3/68747470733a2f2f676f646f632e6f72672f6769746875622e636f6d2f79616e6777656e6d61692f686f772d746f2d6164642d62616467652d696e2d6769746875622d726561646d653f7374617475732e737667)](https://godoc.org/github.com/testcontainers/testcontainers-go)
|
|
|
|
|
2020-03-01 16:06:34 +00:00
|
|
|
|
|
|
|
When I was working on a Zipkin PR I discovered a nice Java library called
|
2020-09-06 12:31:23 +00:00
|
|
|
[Testcontainers](https://www.testcontainers.org/).
|
2020-03-01 16:06:34 +00:00
|
|
|
|
|
|
|
It provides an easy and clean API over the go docker sdk to run, terminate and
|
|
|
|
connect to containers in your tests.
|
|
|
|
|
|
|
|
I found myself comfortable programmatically writing the containers I need to run
|
|
|
|
an integration/smoke tests. So I started porting this library in Go.
|
|
|
|
|
2020-09-06 12:31:23 +00:00
|
|
|
This is an example:
|
2020-03-01 16:06:34 +00:00
|
|
|
|
|
|
|
```go
|
|
|
|
package main
|
|
|
|
|
|
|
|
import (
|
|
|
|
"context"
|
|
|
|
"fmt"
|
|
|
|
"net/http"
|
|
|
|
"testing"
|
|
|
|
|
|
|
|
"github.com/testcontainers/testcontainers-go"
|
|
|
|
"github.com/testcontainers/testcontainers-go/wait"
|
|
|
|
)
|
|
|
|
|
|
|
|
func TestNginxLatestReturn(t *testing.T) {
|
|
|
|
ctx := context.Background()
|
|
|
|
req := testcontainers.ContainerRequest{
|
|
|
|
Image: "nginx",
|
|
|
|
ExposedPorts: []string{"80/tcp"},
|
|
|
|
WaitingFor: wait.ForHTTP("/"),
|
|
|
|
}
|
|
|
|
nginxC, err := testcontainers.GenericContainer(ctx, testcontainers.GenericContainerRequest{
|
|
|
|
ContainerRequest: req,
|
|
|
|
Started: true,
|
|
|
|
})
|
|
|
|
if err != nil {
|
|
|
|
t.Error(err)
|
|
|
|
}
|
|
|
|
defer nginxC.Terminate(ctx)
|
|
|
|
ip, err := nginxC.Host(ctx)
|
|
|
|
if err != nil {
|
|
|
|
t.Error(err)
|
|
|
|
}
|
|
|
|
port, err := nginxC.MappedPort(ctx, "80")
|
|
|
|
if err != nil {
|
|
|
|
t.Error(err)
|
|
|
|
}
|
|
|
|
resp, err := http.Get(fmt.Sprintf("http://%s:%s", ip, port.Port()))
|
|
|
|
if resp.StatusCode != http.StatusOK {
|
|
|
|
t.Errorf("Expected status code %d. Got %d.", http.StatusOK, resp.StatusCode)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
```
|
|
|
|
This is a simple example, you can create one container in my case using the
|
|
|
|
`nginx` image. You can get its IP `ip, err := nginxC.GetContainerIpAddress(ctx)` and you
|
|
|
|
can use it to make a GET: `resp, err := http.Get(fmt.Sprintf("http://%s", ip))`
|
|
|
|
|
|
|
|
To clean your environment you can defer the container termination `defer
|
|
|
|
nginxC.Terminate(ctx, t)`. `t` is `*testing.T` and it is used to notify is the
|
|
|
|
`defer` failed marking the test as failed.
|
|
|
|
|
2020-09-06 12:31:23 +00:00
|
|
|
## Documentation
|
2020-03-01 16:06:34 +00:00
|
|
|
|
2020-09-06 12:31:23 +00:00
|
|
|
The documentation lives in [./docs](./docs) and it is rendered at
|
|
|
|
[golang.testcontainers.org](https://golang.testcontainers.org).
|