Rumah >pembangunan bahagian belakang >Golang >Bagaimana Menjalankan Ujian Serentak Merentasi Pelbagai Pakej dalam Go Without Database Contention?

Bagaimana Menjalankan Ujian Serentak Merentasi Pelbagai Pakej dalam Go Without Database Contention?

DDD
DDDasal
2024-11-04 00:03:30728semak imbas

How to Run Concurrent Tests Across Multiple Packages in Go Without Database Contention?

Go: Menangani Ujian Konkurensi Merentas Pelbagai Pakej

Menjalankan ujian untuk berbilang pakej di bawah subdirektori menggunakan ujian go boleh mencabar apabila ujian bergantung pada pembolehubah global dan pelayan pangkalan data tempatan . Semasa go test ./... menjalankan ujian, ia gagal kerana potensi perbalahan dalam pangkalan data.

Memahami Isu

Isu timbul kerana go test . /... melaksanakan ujian untuk pakej yang berbeza secara selari. Apabila setiap fail ujian mengandungi pembolehubah global dengan penunjuk pangkalan data dan ujian bergantung pada operasi pangkalan data, keselarian ini boleh membawa kepada kegagalan ujian yang disebabkan oleh perbalahan data.

Potensi Pembaikan

1. Menjalankan Ujian Secara Bersiri

Untuk memaksa ujian berjujukan merentas pakej, pertimbangkan untuk menggunakan bendera tidak berdokumen -p 1 semasa menjalankan ujian go. Bendera ini memaksa semua pakej untuk membina dan menguji secara berurutan.

<code class="bash">go test -p 1 ./...</code>

2. Menggunakan Skrip Shell

Jika -p 1 tidak sesuai, pertimbangkan untuk menggunakan skrip shell yang meniru go test ./... gelagat tetapi memaksa ujian berjujukan. Ini boleh dicapai dengan menyenaraikan subdirektori dengan fail *.go, mengalih keluar pendua dan melaksanakan ujian go pada setiap subdirektori satu demi satu.

<code class="bash">find . -name '*.go' -printf '%h\n' | sort -u | xargs -n1 -P1 go test</code>

3. Pengujian Sedar Pangkalan Data

Pendekatan lain ialah mengubah suai kod ujian agar lebih peka terhadap kesesuaian. Ini boleh melibatkan penggunaan pangkalan data peringkat pakej dan menangguhkan pemulaan pangkalan data dan pembongkaran masing-masing ke permulaan dan akhir setiap ujian. Adalah penting untuk memastikan bahawa operasi pangkalan data adalah segerak dan setiap ujian mempunyai set sumber pangkalan data sendiri.

Contoh:

Di bawah ialah contoh cara memastikan pangkalan data pengasingan dalam setiap ujian:

<code class="go">import (
    "database/sql"
    "testing"
)

type DBWrapper struct {
    *sql.DB
}

func (db DBWrapper) TearDown(t *testing.T) {
    if err := db.Close(); err != nil {
        t.Errorf("Failed to close database: %v", err)
    }
}

func TestDatabase(t *testing.T) {
    defer DBWrapper{sql.Open(...)}.TearDown(t)

    // Conduct test operations using the isolated DBWrapper
}</code>

Dengan menggunakan teknik ini, adalah mungkin untuk menjalankan ujian untuk berbilang pakej yang melibatkan operasi pangkalan data tanpa menghadapi kegagalan yang berkaitan dengan perbalahan.

Atas ialah kandungan terperinci Bagaimana Menjalankan Ujian Serentak Merentasi Pelbagai Pakej dalam Go Without Database Contention?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
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