Pada proyek saat ini, kekuatan yang ingin memiliki unit testing dimasukkan ke dalam siklus pengembangan kami untuk menghindari jumlah bug yang tampaknya meresap ke dalam kode kami. Masalahnya adalah bahwa kode spaghetti adalah prosedural 95% persen, yang saya belum pernah melakukan pengujian unit dengan (semua pengalaman saya dengan pengujian unit telah dengan kode OOP)
Jadi pertanyaan saya secara singkat adalah apakah lebih bijak untuk melanjutkan dengan pengujian unit dengan basis kode kami saat ini, atau menyarankan bahwa itu ditunda sampai aplikasi telah dimigrasi ke kerangka kerja OOP yang tepat?
PS: Ketika saya mencoba mendesain pertanyaan ini sebagai bahasa agnostik, saya merasa bahwa menyatakan aplikasi yang dimaksud menggunakan PHP dan javascript akan membantu memberikan jawaban yang lebih spesifik yang dapat menjawab pertanyaan ini karena dari pengalaman kejadian ini paling sering terjadi pada aplikasi semacam itu.
sumber
Jawaban:
Pengujian unit berfungsi baik dengan objek, terutama karena ia menyediakan banyak fitur mewah, seperti objek tiruan, yang membantu menciptakan pengujian yang lebih baik dengan lebih cepat.
Ini dikatakan, tidak ada yang melarang melakukan pengujian unit pada basis kode prosedural . Dalam OOP, sebagian besar unit test menguji metode dengan mengirimkan beberapa parameter kepada mereka dan mengharapkan hasil, atau pengecualian dari tipe tertentu. Ini dapat dilakukan sejauh dengan kode prosedural juga; Hanya saja, alih - alih metode pengujian, Anda akan menguji fungsi .
Perhatikan bahwa Anda harus:
Isolasikan fungsi yang harus Anda uji dan yang tidak perlu. Dalam OOP, ini mudah: metode pribadi tidak harus diuji karena penelepon tidak akan pernah dapat mengaksesnya secara langsung. Kemungkinannya, dalam kode prosedural Anda, beberapa fungsi seperti ini dan tidak perlu tes.
Pikirkan tentang ruang lingkup global . Masalahnya ada dalam OOP juga, tetapi jika Anda mengatakan bahwa Anda harus menguji kode spaghetti, kemungkinan orang-orang yang menulis kode ini memiliki kebiasaan buruk, seperti terlalu banyak menggunakan lingkup global, dan melakukan beberapa hal gila seperti mengubah
$_GET
atau$_POST
mengatur array di dalam fungsi.Menangani kode di luar fungsi. Ini adalah kasus yang lebih rumit, tetapi masih memungkinkan. Entah Anda
require_once
halaman untuk melihat apa yang terjadi dan menangkap output melaluiob_start
/ob_get_clean
, atau Anda melakukan permintaan HTTP dari test suite dan menganalisis respons dengan mem-parsing HTML. Ini bukan pengujian UI: di sini, Anda tidak peduli apakah tombol pada halaman muncul di kiri atau di kanan atau jika tautan menggunakan huruf kapital merah besar atau biru kecil. Yang Anda pedulikan adalah menemukan beberapa elemen HTML melalui DOM dan membandingkan kontennya dengan yang diharapkan.Uji kode respons .
require_once
dengan buffering output yang baik, tetapi Anda juga harus menguji bagaimana aplikasi web menangani kesalahan. Misalnya, jika hasil tes yang diharapkan adalah 404 Tidak Ditemukan, Anda harus melakukan permintaan HTTP untuk mengetahui apa jawabannya.sumber
Dapatkan beberapa tes otomatis di tempat sebelum bermigrasi ke platform lain, bukan sesudahnya. Tambahkan tes lebih lanjut saat melakukan migrasi, bukan sesudahnya. Jika tes tersebut adalah "tes integrasi" atau tes unit, Anda harus memutuskan sendiri, tetapi biasanya Anda dapat menggunakan kerangka uji xUnit favorit Anda untuk kedua jenis.
sumber
Cara paling efektif untuk memulai pengujian unit adalah mengidentifikasi kelas kesalahan yang paling sering terjadi, atau merupakan biaya tertinggi. Kemudian buat tes yang menargetkan kesalahan tersebut.
Bagaimana tes tersebut diimplementasikan akan berbeda antara paradigma dan bahasa. Hal terbesar yang akan memengaruhi kemampuan Anda untuk melakukan pengujian unit adalah kualitas kode; Apalagi paradigma yang digunakan. Ingat pengujian unit adalah tentang pengujian "unit" kode secara terpisah. Apa pun yang memengaruhi kemampuan Anda untuk mengisolasi "unit" kode akan mempersulit pengujian.
Semua ini akan memiliki dampak yang lebih tinggi pada kesulitan pengujian daripada paradigma bahasa.
sumber
Kapan pun Anda memiliki situasi di mana Anda dapat menguji bagian-bagian kode Anda secara otomatis, pengujian unit bisa efektif. Jadi, pertanyaannya bukan apakah kode prosedural dapat diuji unit secara efektif, pertanyaannya adalah apakah kode INI dapat diuji unit. Itu akan tergantung pada seberapa banyak keadaan yang dibaca dan berapa banyak keadaan yang diaturnya. Idealnya jawaban untuk keduanya adalah nol, tetapi jika tidak, Anda masih dapat mengujinya.
Seperti biasa Anda perlu menimbang keyakinan bahwa kode itu benar terhadap biaya untuk mendapatkan kepercayaan itu. Perlu diingat bahwa bagian dari keuntungan untuk pengujian unit secara eksplisit mengidentifikasi dependensi, dan dalam pengertian itu bahkan lebih efektif untuk menguji kode prosedural unit dibandingkan dengan kode OOP.
sumber
Saya tidak berpikir itu mungkin untuk melakukan unit test yang benar terhadap kode prosedural. Masalah utama adalah bahwa setiap prosedur kemungkinan akan memiliki banyak dependensi yang tidak dapat dihilangkan. Paling-paling tes akan menjadi tes integrasi. Saya telah melakukan hal serupa beberapa bulan yang lalu dengan modul VB6 dan modul VBA di MS Access.
Yang mengatakan, jika Anda dapat melakukan tes perancah di sekitar metode yang menyebabkan rasa sakit paling, itu harus bernilai, kan?
sumber