Chromium Chronicle #2: Melawan Kegagalan Uji

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

Pengujian tidak stabil adalah masalah umum di Chrome. Mereka mempengaruhi produktivitas pengembang lain, dan menjadi nonaktif seiring waktu. Pengujian yang dinonaktifkan berarti cakupan pengujian berkurang.

Tahap Triase

PEMILIK direktori bertanggung jawab untuk memperbaiki pengujian yang tidak stabil. Jika Anda menerima {i>bug<i} tentang pengujian yang tidak stabil, luangkan beberapa menit dan mengomentari masalah yang ada. Jika Anda memiliki pengujian lama yang tidak stabil dan tidak jelas apa masalahnya, coba aktifkan kembali pengujian tersebut. Tetapkan kembali bug sesegera mungkin jika jelas merupakan masalah di komponen lain. Pemilik komponen itu harus memiliki penilaian yang lebih baik tentang kegagalan,

Tahap Proses Debug

Sejumlah flag command line berguna untuk memperbaiki pengujian yang tidak stabil. Misalnya, --enable-pixel-output-in-tests akan melakukan {i>render<i} ke UI {i>browser<i} yang sebenarnya.

Memiliki alat penggantian jika debugger menghilangkan fungsi yang tidak berfungsi. Penting mungkin, di bawah debugger, pengujian itu tidak pernah tidak stabil. Dalam hal ini, catat atau base::debug::StackTrace dapat berguna.

Larangan

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

  • Ekspektasi yang salah (mis., halaman yang aman berarti HTTPS; dapat berupa localhost).
  • Kondisi balapan karena pengujian tidak menunggu acara yang tepat.

[Jangan uji implementasi][not-implementation] 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 perjalanan di masa mendatang, sehingga pengujian tidak stabil. Namun, hanya status toko yang relevan. Sebagai gantinya, gunakan observer untuk Anda.

Larangan

Waspadai pola umum seperti berikut:

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

Cuplikan seperti pengujian browser di atas hampir pasti salah. Ada banyak peristiwa yang harus terjadi dalam berbagai proses dan sebelum beberapa UI muncul.

Anjuran

Berikut ini 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 sebuah implementasi di mana prompt hanya muncul saat jendela browser aktif. Penerapan seperti ini benar; namun, memeriksa jendela yang sebenarnya akan membuat pengujian menjadi tidak stabil.

Tahap Setelah Perbaikan

Setelah pengujian diperbaiki, jalankan pengujian ratusan kali secara lokal. Perhatikan Portal Kegagalan.