Apakah kode prosedural pengujian unit efektif?

13

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.

canadiancreed
sumber
13
Pengujian unit tidak mencegah bug baru, tetapi mencegah regresi.
Daenyth
2
kemungkinan duplikat Apakah generator unit test membantu Anda ketika bekerja dengan kode lawas? dan selusin pertanyaan lainnya. Cari "legacy unit test"
mattnz
4
Masalah Anda adalah bahwa kode spaghetti / Big Ball Of Mud, bukan bahwa itu "prosedural" (kode prosedural yang baik dapat diuji dengan baik - BTDTGTTS). Kekuatan Anda yang akan lebih suka mendapatkan (lebih banyak) penguji dan mengatur jaminan kualitas profesional menyeluruh dalam proyek jika mereka benar-benar ingin "untuk menghindari jumlah bug yang konstan".
nyamuk
@ l0b0 ya saya lakukan. Permintaan maaf saya, akan memperbarui tes ini menjadi lebih jelas
canadiancreed
@ mattnz Ya Saya mencari tes unit prosedural, tetapi tidak warisan. Berpikir bahwa prosedural! = Warisan karena masih ada kode baru yang dibuat dalam format itu
canadiancreed

Jawaban:

14

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 $_GETatau $_POSTmengatur array di dalam fungsi.

  • Menangani kode di luar fungsi. Ini adalah kasus yang lebih rumit, tetapi masih memungkinkan. Entah Anda require_oncehalaman untuk melihat apa yang terjadi dan menangkap output melalui ob_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_oncedengan 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.

Arseni Mourzenko
sumber
5

menyarankan bahwa itu ditunda sampai aplikasi telah dimigrasi ke kerangka kerja OOP yang tepat

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.

Doc Brown
sumber
5

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.

  • penggunaan global
  • efek samping
  • kode digabungkan secara ketat
  • kode berpasangan buruk
  • sejumlah besar persyaratan
  • "unit" yang dirancang dengan buruk

Semua ini akan memiliki dampak yang lebih tinggi pada kesulitan pengujian daripada paradigma bahasa.

dietbuddha
sumber
4

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.

jmoreno
sumber
-4

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?

Rob Gray
sumber
5
-1: Desain dan implementasi yang buruk adalah masalahnya, bukan kode prosedural. Sama seperti Anda dapat menulis OP yang mengerikan, Anda dapat menulis kode prosedural yang hebat.
mattnz
@ mattnz - Saya tidak yakin bagaimana komentar Anda terkait dengan apa yang saya katakan tentang menjadi, atau tidak bisa, ke unit kode uji prosedural.
Rob Gray
7
Kode prosedural tidak sama dengan spageti. Sangat mungkin untuk menulis kode yang dirancang dengan baik, modular, terpisah dengan rapi, kohesi tinggi / kopling rendah secara prosedural.
Marjan Venema
2
Sebuah desain yang baik memperkenalkan unit-testabilty dalam kode apa pun, prosedural atau tidak.
Doc Brown