SQL単体テストの実行にdockertestを使用しています。これは *sqlx.db
への単純な接続ですが、データベースに接続すると、どういうわけかエラー error: eof
が生成されます。エラーを特定できません。設定が間違っている可能性があります。
import ( "fmt" "log" "os" "testing" _ "github.com/lib/pq" "github.com/jmoiron/sqlx" "github.com/ory/dockertest/v3" "github.com/ory/dockertest/v3/docker" ) var ( host = "localhost" user = "postgres" password = "postgres" dbName = "db_test" port = "5437" dsn = "host=%s port=%s user=%s password=%s dbname=%s sslmode=disable timezone=UTC connect_timeout=30" ) var resource *dockertest.Resource var pool *dockertest.Pool var testDB *sqlx.DB var testRepo Repo func TestMain(m *testing.M) { // connect to docker; fail if docker not running p, err := dockertest.NewPool("") if err != nil { log.Fatalf("could not connect to docker; is it running? %s", err) } pool = p opts := dockertest.RunOptions{ Repository: "postgres", Tag: "14.5", // same as docker compose Env: []string{ "POSTGRES_USER=" + user, "POSTGRES_PASSWORD=" + password, "POSTGRES_DB=" + dbName, }, ExposedPorts: []string{"5432"}, PortBindings: map[docker.Port][]docker.PortBinding{ "5432": { {HostIP: "0.0.0.0", HostPort: port}, }, }, } resource, err = pool.RunWithOptions(&opts) if err != nil { // _ = pool.Purge(resource) log.Fatalf("could not start resource: %s", err) } if err := pool.Retry(func() error { var err error testDB, err = sqlx.Connect("postgres", fmt.Sprintf(dsn, host, port, user, password, dbName)) if err != nil { log.Println("Error:", err) return err } return testDB.Ping() }); err != nil { _ = pool.Purge(resource) log.Fatalf("could not connect to database: %s", err) } err = createTables() if err != nil { log.Fatalf("error creating tables: %s", err) } code := m.Run() if err := pool.Purge(resource); err != nil { log.Fatalf("could not purge resource: %s", err) } testRepo = &repo{db: testDB} os.Exit(code) } func createTables() error { tableSQL, err := os.ReadFile("./testdata/tables.sql") if err != nil { fmt.Println(err) return err } _, err = testDB.Exec(string(tableSQL)) if err != nil { fmt.Println(err) return err } return nil } func Test_pingDB(t *testing.T) { err := testDB.Ping() if err != nil { t.Error("can't ping database") } }
pool.Retry
のデフォルトの最大待機時間は1分一个>です。推測にすぎませんが、postgres データベース コンテナーは 1 分以内に起動しない可能性があります。
MaxWait 時間を増やしてみてください (例: pool.MaxWait = 20 * time.Minute
以上がdockertest を使用した Golang SQL 単体テストの基本セットアップの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。