Soalan dan skop
Perkhidmatan Go mengalami kegagalan unit, penanda aras, dan fuzz secara berselang-seli. Pembangun mahukan sampel permintaan, ringkasan prestasi, dan pembuangan nyahpepijat tanpa mencemari larian CI yang berjaya atau membiarkan ujian selari menimpa satu sama lain. Menggunakan Go 1.26 testing.T.ArtifactDir, testing.B.ArtifactDir, dan testing.F.ArtifactDir, reka bentuk dasar artifak.
Dengan go test -artifacts, Go 1.26 mengembalikan direktori berterusan di bawah direktori output; tanpanya, direktori sementara yang dikembalikan akan dipadamkan selepas ujian. Asingkan kod yang menulis bukti daripada keputusan untuk mengekalkannya, dan biarkan rangka kerja ujian mengawal kitaran hayat direktori.
Konteks dan sempadan
Fokus pada kod ujian Go, pengasingan konkurensi, pengarkiban CI, dan data sensitif. Platform CI menyediakan muat naik, kebenaran, pengekalan, dan storan objek; nyatakan pencetus kegagalan, penamaan, had saiz, penyuntingan (redaction), dan sempadan percubaan semula.
Perkara yang diuji oleh penemu duga
- Sama ada anda membezakan direktori artifak untuk konteks T, B, dan F.
- Sama ada ujian yang gagal mengekalkan bukti tanpa menjadikan larian yang berjaya sebagai hingar kekal.
- Sama ada anda mengendalikan
t.Parallel, subujian, gelung penanda aras, dan penamaan main semula fuzz. - Sama ada fail boleh dicuba semula, dihadkan, diarkibkan, dan boleh dikesan kepada komit dan nama ujian.
- Sama ada token, data pengguna, URL peribadi, dan pembuangan teras (core dumps) dijauhkan daripada artifak CI awam.
Jawapan 30 saat
“Setiap ujian mendapat direktorinya daripada ArtifactDir; nama fail menggunakan laluan ujian, ID larian, dan urutan peristiwa berbanding laluan ruang kerja yang diteka. Kod menulis bukti utama semasa kegagalan, pelanggaran ambang, atau diagnostik eksplisit. CI mendayakan go test -artifacts dan mengarkibkan direktori tersebut, manakala lalai setempat menggunakan direktori sementara yang dibersihkan. Penulisan menggunakan fail sementara dan penamaan semula, dengan had bait dan kiraan. Manifest memautkan komit, pakej, ujian, platform, cincangan (hash), dan status penyuntingan; kegagalan muat naik memberi amaran tanpa mengubah hasil ujian asal.”
Penyelesaian langkah demi langkah
- Gunakan satu titik masuk artifak. Ujian menerima
*testing.T,*testing.B, atau*testing.Fdan memanggilArtifactDiryang sepadan. Jangan kod kerasos.TempDir, direktori kerja, atau laluan CI peribadi ke dalam logik ujian.
- Asingkan pengekalan daripada penulisan. Kod ujian boleh menulis sebelum atau selepas kegagalan, tetapi ketahanan dijangkakan hanya apabila
go test -artifactsdidayakan. Larian lalai menggunakan direktori sementara yang dibersihkan; CI mendayakan artifak secara eksplisit dan memuat naiknya.
- Reka bentuk nama konkuren. Bina kunci logik daripada pakej, ujian, ID larian, laluan subujian, dan urutan monotonik. Sanitasi pemisah dan aksara yang tidak boleh dicetak. Contoh selari tidak boleh berkongsi
debug.jsonyang tetap.
- Tulis secara atomik dengan had. Cipta fail sementara dalam direktori artifak, tutupnya dengan jayanya, kemudian namakan semula. Guna pakai had bait dan kiraan bagi setiap fail, setiap ujian, dan setiap larian; limpahan menghasilkan ringkasan dan bukannya menghabiskan sumber pelari (runner).
func writeArtifact(t *testing.T, name string, data []byte) {
t.Helper()
dir := t.ArtifactDir()
path := filepath.Join(dir, safeName(name)+".json")
tmp, err := os.CreateTemp(dir, ".partial-")
if err != nil { t.Fatalf("create artifact: %v", err) }
defer tmp.Close()
if _, err := tmp.Write(data); err != nil { t.Fatalf("write artifact: %v", err) }
if err := tmp.Close(); err != nil { t.Fatalf("close artifact: %v", err) }
if err := os.Rename(tmp.Name(), path); err != nil { t.Fatalf("publish artifact: %v", err) }
}Contoh ini mengetepikan pemeriksaan saiz, penyuntingan, dan pengendalian nama fail mudah alih; kod pengeluaran harus menjadikan perkara tersebut sebagai kekangan ujian yang dikongsi.
- Cetuskan pada kegagalan atau ambang. Ujian yang gagal mengekalkan penghasil semula yang minimum, ringkasan permintaan, pengecam surih, dan ringkasan persekitaran. Penanda aras menyimpan profil atau sampel hanya pada ambang regresi atau mod diagnostik eksplisit. Ujian fuzz menyimpan benih yang boleh dimainkan semula serta input terhad yang telah disunting berbanding permintaan sensitif yang lengkap.
- Indekskan artifak CI. Keluarkan manifest yang mengandungi SHA komit, pakej, ujian, versi Go, OS/seni bina, laluan relatif, saiz, cincangan, dan status penyuntingan. Asingkan muat naik mengikut ID larian. Kegagalan muat naik memberi amaran tetapi tidak boleh mengubah penegasan (assertion) yang gagal menjadi lulus.
- Kawal keselamatan dan bersihkan. Alih keluar token, kuki, pengepala Authorization, data peribadi, dan nama hos peribadi sebelum menulis; lumpuhkan pembuangan teras secara lalai. Gunakan bacaan keistimewaan paling sedikit dan pengekalan singkat, dengan luput automatik. Muat turun masih memerlukan semakan di peringkat kandungan.
- Uji kitaran hayat. Rangkumi subujian yang gagal, subujian selari, satu larian
go test -artifacts, dan satu larian lalai. Sahkan pembersihan yang berjaya, bukti kegagalan yang boleh diindeks, ID percubaan semula yang berbeza, dan pemeliharaan bukti setempat apabila muat naik terganggu.
Jawapan model
Semua fail diagnostik harus berasal daripada T, B, atau F ArtifactDir; logik ujian tidak perlu mengetahui laluan fizikal. Pengekalan dikawal oleh go test -artifacts: CI mendayakan dan mengarkibkannya, manakala larian setempat menggunakan direktori sementara yang dibersihkan. Nama termasuk pakej, ujian, laluan subujian, ID larian, dan urutan untuk mengelakkan pertembungan selari. Penulisan menggunakan fail sementara dan penamaan semula, dengan had bait dan kiraan.
Ujian yang gagal mengekalkan input minimum, ringkasan permintaan, dan data persekitaran. Penanda aras mengekalkan profil hanya apabila ambang regresi atau mod diagnostik eksplisit dicetuskan. Ujian fuzz mengekalkan benih dan input yang boleh dimainkan semula. Penyuntingan berlaku sebelum penulisan, dan manifest merekodkan komit, versi Go, platform, cincangan, dan saiz. Kegagalan muat naik memberi amaran tanpa mengubah status ujian. Ujian regresi merangkumi keselarasan, kegagalan, storan sementara lalai, dan storan -artifacts yang berterusan.
Kesilapan lazim
- Kesilapan: Menganggap ArtifactDir sebagai kekal → Sebab ia gagal: direktori sementara lalai dialih keluar selepas ujian → Penyelesaian: dayakan
-artifactsdalam CI dan konfigurasikan pengarkiban. - Kesilapan: Setiap ujian selari menulis
debug.json→ Sebab ia gagal: fail menimpa atau berselang-seli → Penyelesaian: namakan mengikut laluan ujian, ID larian, dan urutan. - Kesilapan: Memuat naik permintaan HTTP lengkap semasa kegagalan → Sebab ia gagal: token dan data peribadi bocor → Penyelesaian: sunting, ringkaskan, dan sekat pengekalan.
- Kesilapan: Membiarkan kegagalan penulisan artifak menjadikan ujian lulus → Sebab ia gagal: bukti kegagalan hilang dan masalah persekitaran tersembunyi → Penyelesaian: gagalkan atau beri amaran secara eksplisit pada bukti yang diperlukan tanpa mengubah penegasan.
- Kesilapan: Menulis profil pada setiap lelaran penanda aras → Sebab ia gagal: volum artifak dan masa larian menjadi tidak terhad → Penyelesaian: kumpul hanya pada ambang regresi atau diagnostik eksplisit.
Soalan dan jawapan susulan
Mengapa tidak menggunakan os.TempDir secara langsung?
ArtifactDir membolehkan rangka kerja ujian dan CI memiliki keputusan kitaran hayat, memberikan T, B, dan F satu kontrak, dan mengelakkan laluan khusus pelaksana. os.TempDir sesuai untuk fail pembantu pakai buang, bukan sebagai protokol artifak.
Bagaimanakah artifak fuzz kekal boleh dimainkan semula?
Rekodkan versi Go, pakej, ujian, benih, cincangan bagi input terhad, dan pemboleh ubah persekitaran yang diperlukan. Untuk input bersaiz terlalu besar atau sensitif, simpan ringkasan yang telah disunting dan simpan bukti penuh hanya dalam storan yang dilindungi.
Bilakah penanda aras patut menulis artifak?
Selesaikan penanda aras dan bandingkan garis dasarnya terlebih dahulu. Tulis profil hanya selepas regresi ambang, diagnostik -bench eksplisit, atau kegagalan. Sertakan kiraan sampel, CPU, tempoh, dan komit supaya larian biasa tidak menjadi arkib kekal.
Patutkah kegagalan muat naik artifak menggagalkan CI?
Kegagalan penegasan mesti gagal. Sama ada kegagalan muat naik menyekat keluaran bergantung pada tahap bukti pasukan, tetapi ia sekurang-kurangnya mesti memberi amaran dan memelihara laluan setempat. Keadaan rangkaian tidak boleh disamarkan sebagai status ujian.
Bagaimanakah anda mengendalikan percubaan semula?
Hasilkan ID larian yang berbeza untuk setiap percubaan. Kunci arkib mengandungi komit, platform, pakej, ujian, dan percubaan. Indeks boleh mengumpulkan percubaan, tetapi fail mentah tidak pernah menimpa satu sama lain; rekodkan sama ada percubaan semula menggunakan semula benih rawak.
Rujukan
- Go 1.26 Release Notes (Go rasmi)
- pakej testing (Go rasmi)
- Go Release History (Go rasmi)
Senarai semak temu duga
Terangkan kitaran hayat ArtifactDir terlebih dahulu, kemudian tambahkan penamaan konkuren, penulisan atomik, pencetus kegagalan, manifest, penyuntingan, pengarkiban CI, dan ujian regresi.
Pengajaran utama satu ayat
ArtifactDir menyediakan titik masuk kitaran hayat; diagnostik yang boleh dipercayai masih memerlukan pengasingan, had, penyuntingan, pengindeksan, dan bukti yang boleh dimainkan semula.
Teruskan berlatih
Jika CI menjalankan ujian fuzz, penanda aras, dan integrasi bersama-sama, reka bentuk manifest yang dikongsi, kuota, dan penjadual muat naik keutamaan kegagalan.