Chromium Chronicle #2: Melawan Kegagalan Uji

Episode 2: oleh Vasilii di Munich (Mei 2019)
Episode sebelumnya

Pengujian tidak stabil adalah masalah umum di Chrome. Notifikasi ini memengaruhi produktivitas developer lain dan dinonaktifkan seiring waktu. Pengujian yang dinonaktifkan berarti mengurangi cakupan pengujian.

Tahap Triase

PEMILIK direktori bertanggung jawab untuk memperbaiki pengujian yang tidak stabil. Jika Anda menerima bug tentang pengujian yang tidak stabil, luangkan waktu beberapa menit dan berikan komentar yang salah pada bug tersebut. Jika Anda memiliki pengujian lama yang tidak stabil dan tidak jelas apa masalahnya, coba aktifkan kembali pengujian tersebut. Tetapkan kembali bug sesegera jika jelas merupakan masalah di komponen lain. Pemilik komponen itu harus memiliki pertimbangan yang lebih baik tentang kegagalan,

Tahap Proses Debug

Sejumlah tanda command line berguna untuk memperbaiki pengujian yang tidak stabil. Misalnya, --enable-pixel-output-in-tests akan merender UI browser yang sebenarnya.

Memiliki alat fallback jika debugger menghilangkan kegagalan. Ada kemungkinan bahwa, dalam debugger, pengujian tidak pernah tidak stabil. Dalam hal ini, laporan log atau base::debug::StackTrace dapat berguna.

Larangan

Ingatlah alasan umum kegagalan EXPECT__* selain bug dalam kode produksi:

  • Ekspektasi yang salah (misalnya, halaman aman berarti HTTPS; bisa berupa localhost).
  • Kondisi race karena pengujian tidak menunggu peristiwa yang tepat.

[Jangan uji implementasi][bukan-implementasi], tetapi perilakunya.

// It takes 2 round trips between the UI and the background thread to complete.
SyncWithTheStore();
SyncWithTheStore();
CheckTheStore();

Dua perjalanan bolak-balik dapat berubah menjadi tiga di masa mendatang, yang membuat pengujian tidak stabil. Namun, hanya status toko yang relevan. Sebagai gantinya, gunakan observer untuk toko.

Larangan

Waspadai pola umum seperti berikut:

Submit TestPasswordForm();
// Wait until things settle down.
RunLoop().RunUntilIdle();
CheckCredentialPromptVisible();

Cuplikan seperti yang di atas dari pengujian browser hampir bisa dipastikan salah. Ada banyak peristiwa yang harus terjadi dalam proses dan thread yang berbeda sebelum beberapa UI muncul.

Anjuran

Berikut adalah perbaikan yang benar:

SubmitTestPasswordForm();
WaitUntilCredentialPromptVisible();

Perbaikan di atas benar dengan asumsi bahwa WaitUntilCredentialPromptVisible() tidak benar-benar memeriksa UI. Pengujian browser tidak boleh bergantung pada peristiwa UI eksternal seperti "fokus hilang" atau "jendela menjadi latar depan". Bayangkan suatu implementasi dengan prompt hanya muncul saat jendela browser aktif. Implementasi tersebut akan benar; tetapi, memeriksa periode yang sebenarnya akan membuat pengujian tidak stabil.

Tahap Pasca-perbaikan

Setelah pengujian diperbaiki, jalankan ratusan kali secara lokal. Pantau Portal Kerusakan.