Apa adalah sebuah satuan tes, benar-benar? Dan apakah benar-benar ada dikotomi besar yang dimainkan di sini?
Kami bekerja di bidang di mana membaca secara harfiah satu bit melewati ujung buffer benar-benar dapat crash program, atau menyebabkannya menghasilkan hasil yang benar-benar tidak akurat, atau sebagaimana dibuktikan oleh bug TLS "HeartBleed" baru-baru ini, meletakkan sistem yang seharusnya aman terbuka tanpa menghasilkan bukti langsung adanya cacat.
Tidak mungkin untuk menghilangkan semua kompleksitas dari sistem ini. Tetapi tugas kami adalah, sejauh mungkin, untuk meminimalkan dan mengelola kompleksitas itu.
Apakah unit menguji tes yang mengonfirmasi, misalnya, bahwa reservasi berhasil diposting dalam tiga sistem yang berbeda, entri log dibuat dan konfirmasi Email dikirim?
Saya akan mengatakan tidak . Itu sebuah integrasi tes . Dan yang paling pasti memiliki tempat mereka, tetapi mereka juga topik yang berbeda.
Tes integrasi berfungsi untuk mengonfirmasi fungsi keseluruhan dari seluruh "fitur". Tetapi kode di balik fitur itu harus dipecah menjadi blok bangunan sederhana yang dapat diuji, alias "unit."
Jadi tes unit harus memiliki ruang lingkup yang sangat terbatas.
Yang menyiratkan bahwa kode yang diuji oleh unit test harus memiliki cakupan yang sangat terbatas.
Yang lebih jauh menyiratkan bahwa salah satu pilar desain yang baik adalah untuk memecah masalah kompleks Anda menjadi bagian-bagian yang lebih kecil, satu-tujuan (sejauh mungkin) yang dapat diuji dalam isolasi relatif satu sama lain.
Yang akhirnya Anda dapatkan adalah sebuah sistem yang terbuat dari komponen dasar yang andal, dan Anda tahu jika ada salah satu unit dasar kode tersebut rusak karena Anda telah menulis tes sederhana, kecil, dengan cakupan terbatas untuk memberi tahu Anda dengan tepat.
Dalam banyak kasus Anda mungkin juga harus melakukan beberapa tes per unit. Tes itu sendiri harus sederhana, menguji satu dan hanya satu perilaku sejauh mungkin.
Gagasan tentang "unit test" yang menguji logika yang non-sepele, rumit, rumit, saya pikir, sedikit dari sebuah oxymoron.
Jadi, jika kerusakan desain yang disengaja semacam itu terjadi, lalu bagaimana mungkin sebuah unit test tiba-tiba mulai menghasilkan false positive, kecuali fungsi dasar unit kode yang diuji telah berubah? Dan jika itu terjadi, lebih baik Anda percaya ada beberapa efek riak yang tidak jelas dalam permainan. Tes rusak Anda, salah satu yang tampaknya menghasilkan positif palsu, sebenarnya memperingatkan Anda bahwa beberapa perubahan telah merusak lingkaran dependensi yang lebih luas dalam basis kode, dan itu perlu diperiksa dan diperbaiki.
Beberapa unit tersebut (banyak di antaranya) mungkin perlu diuji dengan menggunakan objek tiruan, tetapi itu tidak berarti Anda harus menulis tes yang lebih rumit atau rumit.
Kembali ke contoh buat saya dari sistem reservasi, Anda benar-benar tidak dapat mengirimkan permintaan ke sebuah basis data reservasi hidup atau layanan pihak ketiga (atau bahkan "dev" instance dari itu) setiap kali Anda satuan pengujian kode Anda.
Jadi Anda menggunakan tiruan yang menghadirkan kontrak antarmuka yang sama. Pengujian kemudian dapat memvalidasi perilaku sepotong kode yang relatif kecil dan deterministik. Hijau semua di papan kemudian memberitahu Anda bahwa blok yang membentuk fondasi Anda tidak rusak.
Tetapi logika unit individu menguji diri mereka sendiri tetap sesederhana mungkin.