Alasan utama dari pengembang untuk tidak memiliki pengujian unit yang baik adalah "Kode tidak dirancang dengan cara unit yang dapat diuji." Saya mencoba memahami jenis desain dan kode apa yang tidak dapat diuji unit.
unit-testing
manizzzz
sumber
sumber
Jawaban:
Beberapa faktor dapat menyebabkan kode sulit untuk diuji unit. Ketika hal ini terjadi, refactoring membantu dalam meningkatkan kode agar dapat diuji.
Beberapa contoh kode yang mungkin sulit untuk diuji:
function pGetDp_U(int i, int i2, string sText)
.Perhatikan bahwa kurangnya arsitektur yang jelas tidak membuat kode sulit untuk diuji unit, karena uji unit menyangkut bagian kecil dari kode. Arsitektur yang tidak jelas masih akan berdampak negatif pada integrasi dan pengujian sistem.
sumber
Ada banyak hal yang membuat kode sulit untuk diuji unit. Secara kebetulan banyak juga yang membuat kode sulit dipertahankan:
sumber
Contoh umum kode yang tidak ingin orang uji unit:
Menggunakan kerangka kerja tiruan, semua contoh ini dapat diuji unit. Ini hanya berfungsi untuk mengatur penggantian tiruan untuk dependensi internal.
Hal-hal yang benar-benar tidak dapat diuji unit:
sumber
Ada beberapa area yang dapat membuatnya lebih sulit untuk menulis tes unit. Namun, saya akan menekankan bahwa itu tidak berarti Anda harus mengabaikan teknik yang berguna hanya karena mereka dapat menambah kompleksitas pada pengujian Anda. Seperti halnya pengkodean apa pun, Anda harus melakukan analisis sendiri untuk menentukan apakah manfaatnya melebihi biaya, dan tidak secara membabi buta menerima apa yang diposkan oleh beberapa lelaki acak di internet.
Kode desain dirancang dengan buruk
Ketergantungan negara dalam ruang lingkup yang berbeda
Biaya untuk sebagian besar spiral ini di luar kendali kecuali Anda tahu apa yang Anda lakukan. Sayangnya, banyak yang tidak tahu bagaimana menggunakan teknik ini untuk mengurangi hal-hal seperti menguji kompleksitas.
Status Eksternal / Sistem
Konkurensi
sumber
Tidak ada kode yang tidak bisa diuji. Namun, ada beberapa contoh kode yang BENAR-BENAR sulit untuk diuji (sampai-sampai mungkin tidak sepadan dengan usaha):
Interaksi perangkat keras - Jika kode secara langsung memanipulasi perangkat keras (misalnya, menulis ke register untuk memindahkan perangkat fisik), maka unit pengujian mungkin terlalu sulit atau mahal. Jika Anda menggunakan perangkat keras nyata untuk pengujian, itu bisa menjadi mahal untuk mendapatkan umpan balik yang sesuai ke dalam harness uji (namun lebih banyak peralatan!), Dan jika tidak, Anda harus meniru perilaku yang tepat dari objek fisik - tidak ada trik kecil dalam beberapa contoh.
Interaksi jam - Ini biasanya lebih mudah, karena hampir selalu mungkin untuk mengejek fungsi sistem jam dengan sangat sepele. Tetapi ketika Anda tidak bisa, maka tes-tes ini menjadi tidak terkelola - tes yang didasarkan pada waktu nyata cenderung memakan waktu lama untuk dijalankan, dan dalam pengalaman saya mereka cenderung sangat rapuh karena beban sistem membuat hal-hal memakan waktu lebih lama daripada yang seharusnya , menyebabkan kegagalan tes hantu.
sumber
Tiga kelompok utama saya untuk ini adalah:
kode yang bergantung pada layanan eksternal
sistem yang tidak memungkinkan penguji untuk memodifikasi keadaan secara independen dari aplikasi.
lingkungan pengujian yang tidak mereplikasi pengaturan produksi.
Inilah yang paling saya alami ketika pengembang berubah menjadi insinyur QA.
sumber