Topik wawancara representatif

Wawancara coding: Bagaimana Anda menggunakan Go 1.26 ArtifactDir untuk artefak pengujian yang tahan lama?

CodingSulit
Tim Redaksi Offer.ccDipublikasikan Diperbarui

Pertanyaan

Pengujian Go gagal secara intermiten, tetapi log tidak mencukupi. Go 1.26 menambahkan ArtifactDir. Rancang strategi artefak dan jelaskan kapan harus menulis, cara menghindari tabrakan paralel, perbedaan retensi lokal dan CI, serta cara mencegah kebocoran kredensial.

Pertanyaan dan cakupan

Sebuah layanan Go mengalami kegagalan unit, benchmark, dan fuzz yang bersifat intermiten. Pengembang menginginkan sampel permintaan, ringkasan performa, dan dump debug tanpa mengotori eksekusi CI yang berhasil atau membiarkan pengujian paralel saling menimpa. Dengan menggunakan Go 1.26 testing.T.ArtifactDir, testing.B.ArtifactDir, dan testing.F.ArtifactDir, rancang kebijakan artefak.

Dengan go test -artifacts, Go 1.26 mengembalikan direktori persisten di bawah direktori output; tanpanya, direktori sementara yang dikembalikan akan dihapus setelah pengujian selesai. Pisahkan kode yang menulis bukti dari keputusan untuk menyimpannya, dan biarkan framework pengujian mengontrol siklus hidup direktori tersebut.

Konteks dan batasan

Fokuskan pada kode pengujian Go, isolasi konkurensi, pengarsipan CI, dan data sensitif. Platform CI menyediakan pengunggahan, izin, retensi, dan penyimpanan objek; nyatakan pemicu kegagalan, penamaan, batas ukuran, redaksi, dan batasan percobaan ulang (retry).

Apa yang diuji oleh pewawancara

  • Apakah Anda membedakan direktori artefak untuk konteks T, B, dan F.
  • Apakah pengujian yang gagal tetap menyimpan bukti tanpa mengubah eksekusi yang berhasil menjadi derau (noise) permanen.
  • Apakah Anda menangani t.Parallel, subtest, perulangan benchmark, dan penamaan replay fuzz.
  • Apakah file dapat dicoba ulang, memiliki batas ukuran, dapat diarsipkan, serta dapat dilacak ke commit dan nama pengujian.
  • Apakah token, data pengguna, URL privat, dan core dump dicegah masuk ke dalam artefak CI publik.

Jawaban 30 detik

“Setiap pengujian mendapatkan direktorinya dari ArtifactDir; nama file menggunakan jalur pengujian, ID eksekusi, dan urutan peristiwa alih-alih menebak jalur workspace. Kode menulis bukti penting saat terjadi kegagalan, pelanggaran ambang batas, atau diagnostik eksplisit. CI mengaktifkan go test -artifacts dan mengarsipkan direktori tersebut, sementara default lokal menggunakan direktori sementara yang akan dibersihkan. Penulisan menggunakan file sementara dan penggantian nama (rename), dengan batas byte dan jumlah file. Sebuah manifes menghubungkan commit, paket, pengujian, platform, hash, dan status redaksi; kegagalan pengunggahan memicu peringatan tanpa mengubah hasil pengujian awal.”

Solusi langkah demi langkah

  1. Gunakan satu titik masuk artefak. Pengujian menerima *testing.T, *testing.B, atau *testing.F dan memanggil ArtifactDir yang sesuai. Jangan melakukan hard-code pada os.TempDir, direktori kerja, atau jalur CI privat ke dalam logika pengujian.
  1. Pisahkan retensi dari penulisan. Kode pengujian dapat menulis sebelum atau sesudah kegagalan, tetapi persistensi hanya diharapkan jika go test -artifacts diaktifkan. Eksekusi default menggunakan direktori sementara yang akan dibersihkan; CI secara eksplisit mengaktifkan artefak dan mengunggahnya.
  1. Rancang nama yang aman untuk konkurensi. Bangun kunci logis dari paket, pengujian, ID eksekusi, jalur subtest, dan urutan monotonik. Bersihkan pemisah dan karakter non-cetak. Instans paralel tidak boleh berbagi debug.json tetap.
  1. Tulis secara atomik dengan batasan. Buat file sementara di direktori artefak, tutup dengan sukses, lalu ganti namanya. Terapkan batasan byte dan jumlah per-file, per-pengujian, dan per-eksekusi; kelebihan batas menghasilkan ringkasan alih-alih menghabiskan sumber daya runner.
go
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 mengabaikan pemeriksaan ukuran, redaksi, dan penanganan nama file portabel; kode produksi harus menjadikan hal-hal tersebut sebagai batasan pengujian bersama.

  1. Picu saat kegagalan atau ambang batas terlampaui. Pengujian yang gagal menyimpan reproduksi minimal, ringkasan permintaan, pengidentifikasi trace, dan ringkasan lingkungan. Benchmark menyimpan profil atau sampel hanya saat terjadi regresi ambang batas atau mode diagnostik eksplisit. Pengujian fuzz menyimpan seed yang dapat diputar ulang dan input terbatas yang telah diredaksi alih-alih seluruh permintaan sensitif.
  1. Indeks artefak CI. Hasilkan manifes yang berisi SHA commit, paket, pengujian, versi Go, OS/arsitektur, jalur relatif, ukuran, hash, dan status redaksi. Isolasikan pengunggahan berdasarkan ID eksekusi. Kegagalan pengunggahan memberikan peringatan tetapi tidak boleh mengubah asersi yang gagal menjadi berhasil.
  1. Amankan dan bersihkan. Hapus token, cookie, header Authorization, data pribadi, dan hostname privat sebelum menulis; nonaktifkan core dump secara default. Gunakan pembacaan dengan hak akses terendah (least-privilege) dan retensi singkat dengan masa kedaluwarsa otomatis. Unduhan tetap memerlukan peninjauan tingkat konten.
  1. Uji siklus hidupnya. Cakup subtest yang gagal, subtest paralel, satu eksekusi go test -artifacts, dan satu eksekusi default. Verifikasi pembersihan yang berhasil, bukti kegagalan yang dapat diindeks, ID percobaan ulang yang berbeda, dan pelestarian bukti lokal ketika pengunggahan terputus.

Jawaban model

Semua file diagnostik harus berasal dari ArtifactDir milik T, B, atau F; logika pengujian tidak boleh mengetahui jalur fisik. Persistensi dikendalikan oleh go test -artifacts: CI mengaktifkan dan mengarsipkannya, sementara eksekusi lokal menggunakan direktori sementara yang dibersihkan. Nama mencakup paket, pengujian, jalur subtest, ID eksekusi, dan urutan untuk mencegah tabrakan paralel. Penulisan menggunakan file sementara dan penggantian nama, dengan batasan byte dan jumlah.

Pengujian yang gagal menyimpan input minimal, ringkasan permintaan, dan data lingkungan. Benchmark hanya menyimpan profil ketika ambang batas regresi atau mode diagnostik eksplisit terpicu. Pengujian fuzz menyimpan seed dan input yang dapat diputar ulang. Redaksi dilakukan sebelum penulisan, dan manifes mencatat commit, versi Go, platform, hash, dan ukuran. Kegagalan pengunggahan memberikan peringatan tanpa mengubah status pengujian. Pengujian regresi mencakup paralelisme, kegagalan, penyimpanan sementara default, dan penyimpanan -artifacts persisten.

Kesalahan umum

  • Kesalahan: Menganggap ArtifactDir permanen → Alasan gagal: direktori sementara default dihapus setelah pengujian → Perbaikan: aktifkan -artifacts di CI dan konfigurasikan pengarsipan.
  • Kesalahan: Setiap pengujian paralel menulis debug.jsonAlasan gagal: file saling menimpa atau tumpang tindih → Perbaikan: beri nama berdasarkan jalur pengujian, ID eksekusi, dan urutan.
  • Kesalahan: Mengunggah permintaan HTTP lengkap saat terjadi kegagalan → Alasan gagal: token dan data pribadi bocor → Perbaikan: redaksi, buat ringkasan, dan batasi retensi.
  • Kesalahan: Membiarkan kegagalan penulisan artefak membuat pengujian lulus → Alasan gagal: bukti kegagalan hilang dan masalah lingkungan tersembunyi → Perbaikan: gagalkan atau beri peringatan eksplisit pada bukti yang diperlukan tanpa mengubah asersi.
  • Kesalahan: Menulis profil pada setiap iterasi benchmark → Alasan gagal: volume artefak dan waktu eksekusi menjadi tidak terbatas → Perbaikan: kumpulkan hanya saat ambang batas regresi terlampaui atau diagnostik eksplisit diminta.

Pertanyaan lanjutan dan jawaban

Mengapa tidak menggunakan os.TempDir secara langsung?

ArtifactDir memungkinkan framework pengujian dan CI memiliki keputusan siklus hidup, memberikan satu kontrak untuk T, B, dan F, serta menghindari jalur spesifik eksekutor. os.TempDir cocok untuk file pembantu sekali pakai, bukan sebagai protokol artefak.

Bagaimana artefak fuzz tetap dapat diputar ulang (replayable)?

Catat versi Go, paket, pengujian, seed, hash dari input terbatas, dan variabel lingkungan yang diperlukan. Untuk input yang terlalu besar atau sensitif, simpan ringkasan yang telah diredaksi dan simpan bukti lengkap hanya di penyimpanan yang dilindungi.

Kapan benchmark harus menulis artefak?

Selesaikan benchmark dan bandingkan baseline-nya terlebih dahulu. Tulis profil hanya setelah terjadi regresi ambang batas, diagnostik -bench eksplisit, atau kegagalan. Sertakan jumlah sampel, CPU, durasi, dan commit agar eksekusi normal tidak menjadi arsip permanen.

Haruskah kegagalan pengunggahan artefak menggagalkan CI?

Kegagalan asersi harus menggagalkan CI. Apakah kegagalan pengunggahan memblokir rilis bergantung pada tingkat bukti tim, tetapi setidaknya hal itu harus memicu peringatan dan mempertahankan jalur lokal. Status jaringan tidak boleh disamarkan sebagai status pengujian.

Bagaimana Anda menangani percobaan ulang (retries)?

Buat ID eksekusi yang berbeda untuk setiap percobaan. Kunci arsip berisi commit, platform, paket, pengujian, dan percobaan. Indeks dapat mengelompokkan percobaan, tetapi file mentah tidak boleh saling menimpa; catat apakah percobaan ulang menggunakan kembali seed acak tersebut.

Referensi

  • Catatan Rilis Go 1.26 (Resmi Go)
  • Paket testing (Resmi Go)
  • Riwayat Rilis Go (Resmi Go)

Daftar periksa wawancara

Jelaskan siklus hidup ArtifactDir terlebih dahulu, kemudian tambahkan penamaan konkuren, penulisan atomik, pemicu kegagalan, manifes, redaksi, pengarsipan CI, dan pengujian regresi.

Kesimpulan satu kalimat

ArtifactDir menyediakan titik masuk siklus hidup; diagnostik yang andal tetap memerlukan isolasi, batasan, redaksi, pengindeksan, dan bukti yang dapat diputar ulang.

Terus berlatih

Jika CI menjalankan pengujian fuzz, benchmark, dan integrasi secara bersamaan, rancang manifes bersama, kuota, dan penjadwal pengunggahan prioritas kegagalan.

Sumber publik

Pertanyaan terkait

Alat wawancara terkait

Gunakan Tangkapan Layar untuk perintah coding

Ambil tangkapan layar soal, lalu telusuri batasan, solusi, kode, edge case, dan kompleksitas secara berurutan.

Lihat alat