Kedua.
Tes deterministik dan nondeterministik memiliki berbagai kasus penggunaan dan nilai yang berbeda untuk paket Anda. Umumnya nondeterministic tidak dapat memberikan presisi yang sama dengan pengujian deterministik, yang perlahan-lahan tumbuh menjadi "pengujian nondeterministic tidak memberikan nilai." Ini salah. Mereka mungkin kurang tepat, tetapi mereka juga bisa jauh lebih luas, yang memiliki manfaatnya sendiri.
Mari kita ambil contoh: Anda menulis fungsi yang mengurutkan daftar bilangan bulat. Apa yang akan menjadi beberapa tes unit deterministik yang menurut Anda berguna?
- Daftar kosong
- Daftar hanya dengan satu elemen
- Daftar dengan semua elemen yang sama
- Daftar dengan beberapa elemen unik
- Daftar dengan banyak elemen, beberapa di antaranya adalah duplikat
- Daftar dengan
NaN
,INT_MIN
, danINT_MAX
- Daftar yang sudah diurutkan sebagian
- Daftar dengan 10.000.000 elemen
Dan itu hanya fungsi penyortiran! Tentu, Anda dapat berargumen bahwa beberapa di antaranya tidak perlu, atau beberapa di antaranya dapat dikesampingkan dengan alasan informal. Tapi kami insinyur dan kami melihat alasan informal meledak di wajah kami. Kami tahu kami tidak cukup pintar untuk sepenuhnya memahami sistem yang kami bangun atau sepenuhnya menyimpan kompleksitas di kepala kami. Itu sebabnya kami menulis tes di tempat pertama. Menambahkan pengujian nondeterministik hanya mengatakan bahwa kita mungkin tidak harus cukup pintar untuk mengetahui semua tes yang baik secara apriori. Dengan melemparkan data semi-acak ke dalam fungsi Anda, Anda akan lebih mungkin menemukan casing tepi yang Anda lewatkan.
Tentu saja, itu tidak mengesampingkan pengujian deterministik. Pengujian nondeterministic membantu menemukan bug di petak besar program. Namun, begitu Anda menemukan bug, Anda membutuhkan cara yang dapat direproduksi untuk menunjukkan bahwa Anda telah memperbaikinya. Begitu:
- Gunakan tes nondeterministic untuk menemukan bug dalam kode Anda.
- Gunakan tes deterministik untuk memverifikasi perbaikan dalam kode Anda.
Perhatikan bahwa ini berarti banyak saran kuat tentang tes unit tidak selalu berlaku untuk tes nondeterministik. Misalnya, mereka harus cepat. Tes properti tingkat rendah harus cepat, tetapi tes nondeterministik seperti "mensimulasikan pengguna mengklik tombol secara acak di situs web Anda dan pastikan Anda tidak pernah mendapatkan 500 kesalahan" harus mendukung kelengkapan daripada kecepatan. Hanya memiliki tes seperti itu yang berjalan secara independen dari proses build Anda sehingga tidak memperlambat pengembangan. Misalnya, jalankan di kotak pementasan pribadi.