Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bekas ujian Golang dengan saluran paip Azure Devops: Bekas terbunuh secara rawak?

Bekas ujian Golang dengan saluran paip Azure Devops: Bekas terbunuh secara rawak?

WBOY
WBOYke hadapan
2024-02-05 21:54:071021semak imbas

Golang 测试容器与 Azure Devops 管道:容器被随机杀死?

Kandungan soalan

Semasa melaksanakan dan menjalankan ujian penyepaduan pangkalan data saya menggunakan bekas ujian golang berfungsi dengan sempurna secara setempat, ujian saya nampaknya secara rawak tidak berfungsi dalam saluran paip azure devops.

Log saluran paip menunjukkan:

2023/01/09 16:06:02 (...) error: read tcp 127.0.0.1:52546->127.0.0.1:49161: read: connection reset by peer

Selepas menambah pengelogan kontena, menambah baik kriteria menunggu, mengalih keluar penggunaan fail konfigurasi kontena db (jadi saya tidak perlu menyalin fail ke dalam bekas) dan melumpuhkan ryuk, saya tertanya-tanya apa lagi yang perlu dilakukan, atau jika saya tidak memulakan bekas dengan betul.

Untuk setiap ujian unit, bekas ujian dimulakan seperti ini:

func setuptestdatabase(ctx context.context) (testcontainers.container, project.repository, error) {
    containerreq := testcontainers.containerrequest{
        skipreaper:   true,
        image:        "postgres:11.18-alpine3.17",
        exposedports: []string{"5432/tcp"},
        cmd:          []string{"postgres", "-c", "fsync=off"},
        env: map[string]string{
            "postgres_db":         "postgre",
            "postgres_password":   "postgres",
            "postgres_user":       "postgres",
            "pguser":              "postgres",
            "postgres_extensions": "uuid-ossp",
        },
    }

    containerreq.waitingfor = wait.forall(
        wait.forlisteningport("5432/tcp"),
        wait.forexec([]string{"pg_isready", "-t 10", "-q"}), // postgre docs: https://www.postgresql.org/docs/9.4/app-pg-isready.html
    ).withdeadline(3 * time.minute)

    dbcontainer, err := testcontainers.genericcontainer(
        ctx,
        testcontainers.genericcontainerrequest{
            containerrequest: containerreq,
            started:          true,
        })
    if err != nil {
        log.fatalf("database container could not be started. error: %s", err)
        return nil, nil, errors.withstack(err)
    }

    err = dbcontainer.startlogproducer(ctx)
    if err != nil {
        log.fatalf("logproducer could not be started. error: %s", err)
        return nil, nil, errors.withstack(err)
    }
    defer dbcontainer.stoplogproducer()
    lc := logconsumer{}
    dbcontainer.followoutput(&lc)

    port, err := dbcontainer.mappedport(ctx, "5432")
    if err != nil {
        log.fatalf("mapped port could not be retrieved. error: %s", err)
        return nil, nil, errors.withstack(err)
    }
    host, err := dbcontainer.host(ctx)
    if err != nil {
        log.fatalf("hostname could not be retrieved. error: %s", err)
        return nil, nil, errors.withstack(err)
    }

    global.config.postgres.host = host
    global.config.postgres.port = port.port()
    global.config.postgres.user = "postgres"
    global.config.postgres.password = "postgres"
    global.config.postgres.dbname = "postgre"
    global.config.local = true

    global.logger = logger.newnull(config.config{
        logging: config.logging{
            level: "debug",
        },
    })

    repository, err := new(ctx)
    if err != nil {
        log.fatalf("repository could not be setup. error: %s", err)
        return nil, nil, errors.withstack(err)
    }

    return dbcontainer, repository, nil
}

...gunakan repository 创建存储库,err := new(ctx) dan akhirnya berhijrah untuk menyediakan pangkalan data yang serupa dengan pangkalan data pengeluaran kami dan gunakan gorm untuk sambungan pangkalan data dan pemprosesan dsb.

Templat asas untuk ujian unit ialah:

func Test_pg_Has(t *testing.T) {
    ctx := context.TODO()
    dbContainer, repository, err := SetupTestDatabase(ctx)
    if err != nil {
        t.Errorf("error running testcontainers, error: %s", err)
    }
    t.Cleanup(func() {
        if err := dbContainer.Terminate(ctx); err != nil {
            t.Fatalf("failed to terminate container: %s", err)
        }
        time.Sleep(10 * time.Second)
    })
    
    ... TEST_CODE
}

Untuk saluran paip azure, gunakan kumpulan ejen stok azure, versi go ialah "1.18.0 x64".

Sebarang petua akan sangat dihargai, terima kasih terlebih dahulu.


Jawapan betul


Sebagai penyelesaian yang kurang memuaskan, saya menambah tidur 5 saat selepas mencipta bekas tetapi sebelum menyediakan sambungan pangkalan data.

Ini mungkin isu khusus Azure DevOps kerana kami melihat ujian unit gagal secara rawak walaupun berjalan dalam satu bekas.

Menerima ini sebagai sambutan juga merupakan satu cabaran kepada masyarakat...

Atas ialah kandungan terperinci Bekas ujian Golang dengan saluran paip Azure Devops: Bekas terbunuh secara rawak?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam