ホームページ > バックエンド開発 > Golang > dockertest を使用した Golang SQL 単体テストの基本セットアップ

dockertest を使用した Golang SQL 単体テストの基本セットアップ

王林
リリース: 2024-02-06 09:30:04
転載
659 人が閲覧しました

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

質問内容

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 サイトの他の関連記事を参照してください。

ソース:stackoverflow.com
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート