Rumah > pembangunan bahagian belakang > Golang > Persediaan asas untuk ujian unit SQL Golang menggunakan dockertest

Persediaan asas untuk ujian unit SQL Golang menggunakan dockertest

王林
Lepaskan: 2024-02-06 09:30:04
ke hadapan
702 orang telah melayarinya

使用 dockertest 进行 Golang SQL 单元测试的基本设置

Kandungan soalan

Saya menggunakan dockertest untuk melaksanakan ujian unit sql. Itu hanya untuk *sqlx.db 的简单连接,但在连接到数据库时,它以某种方式生成错误 error: eof . Saya tidak dapat mengenal pasti ralat, saya mungkin telah salah konfigurasi.

Masa menunggu maksimum lalai untuk
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")
    }
}

Salin selepas log masuk

jawapan betul


pool.Retry ialah satu minit一个>. Hanya tekaan, mungkin bekas pangkalan data postgres anda tidak akan bermula dalam masa seminit.

Cuba tingkatkan masa MaxWait seperti pool.MaxWait = 20 * 时间.Minute

Atas ialah kandungan terperinci Persediaan asas untuk ujian unit SQL Golang menggunakan dockertest. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan