Home >Backend Development >Golang >Basic setup for Golang SQL unit testing using dockertest
I am using dockertest to execute sql unit tests. This is just a simple connection to *sqlx.db
, but when connecting to the database it somehow generates the error error: eof
. I can't identify the error, I may have misconfigured it.
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") } }
The default maximum wait time for pool.Retry
is one minute一个>. Just a guess, maybe your postgres database container won't start within a minute.
Try to increase the MaxWait time, for example pool.MaxWait = 20 * time.Minute
The above is the detailed content of Basic setup for Golang SQL unit testing using dockertest. For more information, please follow other related articles on the PHP Chinese website!