Saya mendukung tes acak, dan saya menulisnya. Namun, apakah mereka sesuai dalam lingkungan build tertentu dan suite pengujian mana yang harus disertakan adalah pertanyaan yang lebih bernuansa.
Jalankan secara lokal (misalnya, semalaman di kotak dev Anda) tes acak telah menemukan bug yang jelas dan tidak jelas. Yang tidak jelas cukup misterius sehingga saya pikir pengujian acak benar-benar satu-satunya yang realistis untuk menghilangkannya. Sebagai ujian, saya mengambil satu bug yang sulit ditemukan yang ditemukan melalui pengujian acak dan meminta setengah lusin pengembang crack meninjau fungsi (sekitar selusin baris kode) tempat terjadinya. Tidak ada yang bisa mendeteksinya.
Banyak argumen Anda terhadap data acak adalah bentuk dari "pengujian tidak dapat direproduksi". Namun, tes acak yang ditulis dengan baik akan menangkap benih yang digunakan untuk memulai benih acak dan mengeluarkannya jika gagal. Selain memungkinkan Anda mengulangi pengujian dengan tangan, ini memungkinkan Anda membuat pengujian baru yang menguji masalah tertentu secara mudah dengan melakukan hardcode seed untuk pengujian tersebut. Tentu saja, mungkin lebih baik untuk memberi kode tangan pada tes eksplisit yang mencakup kasus itu, tetapi kemalasan memiliki kelebihan, dan ini bahkan memungkinkan Anda untuk secara otomatis menghasilkan kasus uji baru dari seed yang gagal.
Namun, satu hal yang Anda buat yang tidak dapat saya perdebatkan adalah bahwa hal itu merusak sistem build. Sebagian besar pengujian build dan continuous integration mengharapkan pengujian melakukan hal yang sama, setiap saat. Jadi tes yang gagal secara acak akan menciptakan kekacauan, gagal secara acak dan menunjukkan perubahan yang tidak berbahaya.
Solusinya adalah dengan tetap menjalankan pengujian acak Anda sebagai bagian dari pengujian build dan CI, tetapi menjalankannya dengan seed tetap, untuk sejumlah iterasi tetap . Oleh karena itu, pengujian selalu melakukan hal yang sama, tetapi masih mengeksplorasi sekumpulan ruang input (jika Anda menjalankannya untuk beberapa iterasi).
Secara lokal, misalnya, saat mengubah kelas terkait, Anda bebas menjalankannya untuk lebih banyak iterasi atau dengan seed lain. Jika pengujian acak menjadi lebih populer, Anda bahkan dapat membayangkan rangkaian pengujian tertentu yang diketahui acak, yang dapat dijalankan dengan benih yang berbeda (karenanya dengan cakupan yang meningkat dari waktu ke waktu), dan di mana kegagalan tidak berarti hal yang sama sebagai sistem CI deterministik (yaitu, proses tidak terkait 1: 1 dengan perubahan kode sehingga Anda tidak perlu menunjuk perubahan tertentu ketika ada yang gagal).
Ada banyak hal yang bisa dikatakan tentang tes acak, terutama tes yang ditulis dengan baik, jadi jangan terlalu cepat mengabaikannya!