我能够使用testcontainers-go 重现您的用例。在这里,您有一个 sn-p 以编程方式在测试旁边引导您的应用程序的运行时依赖项,恕我直言,与将其外部化为对 docker-compose 的调用(可能在 Makefile 或类似文件中调用)相比,它更接近开发人员。
您需要将自己的应用容器添加到游戏中;)
package arangodb
import (
"context"
"testing"
"github.com/docker/docker/api/types/container"
"github.com/stretchr/testify/require"
"github.com/testcontainers/testcontainers-go"
"github.com/testcontainers/testcontainers-go/wait"
)
func TestArangoDB(t *testing.T) {
ctx := context.Background()
networkName := "backend"
newNetwork, err := testcontainers.GenericNetwork(ctx, testcontainers.GenericNetworkRequest{
NetworkRequest: testcontainers.NetworkRequest{
Name: networkName,
CheckDuplicate: true,
},
})
if err != nil {
t.Fatal(err)
}
t.Cleanup(func() {
require.NoError(t, newNetwork.Remove(ctx))
})
arangodb, err := testcontainers.GenericContainer(ctx, testcontainers.GenericContainerRequest{
ContainerRequest: testcontainers.ContainerRequest{
Image: "arangodb/arangodb:latest",
Env: map[string]string{
"ARANGODB_USERNAME": "myuser",
"ARANGODB_PASSWORD": "mypassword",
"ARANGODB_DBNAME": "graphdb",
"ARANGO_ROOT_PASSWORD": "myrootpassword",
},
Networks: []string{networkName},
Resources: container.Resources{
Memory: 2048 * 1024 * 1024, // 2048 MB
},
WaitingFor: wait.ForLog("is ready for business"),
Mounts: testcontainers.ContainerMounts{
testcontainers.BindMount("/my/database/copy/for/arango/data", "/var/lib/arangodb3"),
},
},
Started: true,
})
require.NoError(t, err)
defer arangodb.Terminate(ctx)
redis, err := testcontainers.GenericContainer(ctx, testcontainers.GenericContainerRequest{
ContainerRequest: testcontainers.ContainerRequest{
Image: "redis:alpine",
Networks: []string{networkName},
},
Started: true,
})
require.NoError(t, err)
defer redis.Terminate(ctx)
}