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!