Documentation ¶
Overview ¶
Package dktest provides an easy way to write integration tests using Docker
dktest is short for dockertest
Example (Nginx) ¶
package main import ( "context" "fmt" "net/http" "net/url" "testing" "github.com/jjfeiler/dktest" _ "github.com/lib/pq" ) func main() { dockerImageName := "nginx:alpine" readyFunc := func(ctx context.Context, c dktest.ContainerInfo) bool { ip, port, err := c.FirstPort() if err != nil { return false } u := url.URL{Scheme: "http", Host: ip + ":" + port} req, err := http.NewRequest(http.MethodGet, u.String(), nil) if err != nil { fmt.Println(err) return false } req = req.WithContext(ctx) if resp, err := http.DefaultClient.Do(req); err != nil { return false } else if resp.StatusCode != 200 { return false } return true } // dktest.Run() should be used within a test dktest.Run(&testing.T{}, dockerImageName, dktest.Options{PortRequired: true, ReadyFunc: readyFunc}, func(t *testing.T, c dktest.ContainerInfo) { // test code here }) }
Output:
Example (Postgres) ¶
package main import ( "context" "database/sql" "fmt" "testing" "github.com/jjfeiler/dktest" _ "github.com/lib/pq" ) func main() { dockerImageName := "postgres:alpine" readyFunc := func(ctx context.Context, c dktest.ContainerInfo) bool { ip, port, err := c.FirstPort() if err != nil { return false } connStr := fmt.Sprintf("host=%s port=%s user=postgres dbname=postgres sslmode=disable", ip, port) db, err := sql.Open("postgres", connStr) if err != nil { return false } defer db.Close() // nolint:errcheck return db.PingContext(ctx) == nil } // dktest.Run() should be used within a test dktest.Run(&testing.T{}, dockerImageName, dktest.Options{PortRequired: true, ReadyFunc: readyFunc}, func(t *testing.T, c dktest.ContainerInfo) { ip, port, err := c.FirstPort() if err != nil { t.Fatal(err) } connStr := fmt.Sprintf("host=%s port=%s user=postgres dbname=postgres sslmode=disable", ip, port) db, err := sql.Open("postgres", connStr) if err != nil { t.Fatal(err) } defer db.Close() // nolint:errcheck if err := db.Ping(); err != nil { t.Fatal(err) } // Test using db }) }
Output:
Index ¶
- Variables
- func Run(t *testing.T, imgName string, opts Options, ...)
- type ContainerInfo
- func (c ContainerInfo) FirstPort() (hostIP string, hostPort string, err error)
- func (c ContainerInfo) FirstUDPPort() (hostIP string, hostPort string, err error)
- func (c ContainerInfo) Port(containerPort uint16) (hostIP string, hostPort string, err error)
- func (c ContainerInfo) String() string
- func (c ContainerInfo) UDPPort(containerPort uint16) (hostIP string, hostPort string, err error)
- type Options
Examples ¶
Constants ¶
This section is empty.
Variables ¶
var ( // DefaultPullTimeout is the default timeout used when pulling images DefaultPullTimeout = time.Minute // DefaultTimeout is the default timeout used when starting a container and checking if it's ready DefaultTimeout = time.Minute // DefaultReadyTimeout is the default timeout used for each container ready check. // e.g. each invocation of the ReadyFunc DefaultReadyTimeout = 2 * time.Second // DefaultCleanupTimeout is the default timeout used when stopping and removing a container DefaultCleanupTimeout = 15 * time.Second )
Functions ¶
Types ¶
type ContainerInfo ¶
ContainerInfo holds information about a running Docker container
func (ContainerInfo) FirstPort ¶
func (c ContainerInfo) FirstPort() (hostIP string, hostPort string, err error)
FirstPort gets the first published/bound/mapped TCP port. It is always safer to use Port(). This provided as a convenience method and should only be used with Docker images that only expose a single port. If the Docker image exposes multiple ports, then the "first" port will not always be the same.
func (ContainerInfo) FirstUDPPort ¶
func (c ContainerInfo) FirstUDPPort() (hostIP string, hostPort string, err error)
FirstUDPPort gets the first published/bound/mapped UDP port. It is always safer to use UDPPort(). This provided as a convenience method and should only be used with Docker images that only expose a single port. If the Docker image exposes multiple ports, then the "first" port will not always be the same.
func (ContainerInfo) Port ¶
func (c ContainerInfo) Port(containerPort uint16) (hostIP string, hostPort string, err error)
Port gets the specified published/bound/mapped TCP port
func (ContainerInfo) String ¶
func (c ContainerInfo) String() string
String gets the string representation for the ContainerInfo. This is intended for debugging purposes.
type Options ¶
type Options struct { // PullTimeout is the timeout used when pulling images PullTimeout time.Duration // Timeout is the timeout used when starting a container and checking if it's ready Timeout time.Duration // ReadyTimeout is the timeout used for each container ready check. // e.g. each invocation of the ReadyFunc ReadyTimeout time.Duration // CleanupTimeout is the timeout used when stopping and removing a container CleanupTimeout time.Duration ReadyFunc func(context.Context, ContainerInfo) bool Env map[string]string Entrypoint []string Cmd []string // If you prefer to specify your port bindings as a string, use nat.ParsePortSpecs() PortBindings nat.PortMap PortRequired bool LogStdout bool LogStderr bool ShmSize int64 }
Options contains the configurable options for running tests in the docker image