Rumah > pembangunan bahagian belakang > Golang > 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
Lepaskan: 2024-02-05 21:54:07
ke hadapan
1026 orang telah melayarinya

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
Salin selepas log masuk

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
}
Salin selepas log masuk

...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
}
Salin selepas log masuk

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!

sumber:stackoverflow.com
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