Pertimbangkan ini:
public function polynominal($a, $b, $c, $d)
{
return $a * pow($x, 3) + $b * pow($x, 2) + $c * $x + $d;
}
Misalkan Anda menulis berbagai tes untuk fungsi di atas dan membuktikan kepada diri sendiri dan orang lain bahwa "itu bekerja".
Mengapa tidak menghapus tes itu, dan hidup bahagia selamanya? Poin saya adalah bahwa beberapa fungsi tidak perlu diuji terus menerus setelah mereka terbukti bekerja. Saya mencari titik tandingan yang menyatakan, ya fungsi-fungsi ini masih perlu diuji, karena: ... atau ya, ini tidak perlu diuji ...
php
unit-testing
testing
tdd
Dennis
sumber
sumber
override_function('pow', '$a,$b', 'return $a * $b;');
dalam pikiran mereka ... atau mencoba menulis ulang untuk menangani angka yang kompleks.(($a*$x + $b)*$x + $c)*$x + $d
yang mudah salah, tetapi seringkali jauh lebih cepat. Hanya karena Anda pikir itu tidak akan berubah tidak berarti itu tidak akan terjadi.Jawaban:
Pengujian regresi
Ini semua tentang pengujian regresi .
Bayangkan pengembang berikutnya melihat metode Anda dan memperhatikan bahwa Anda menggunakan angka ajaib. Dia diberi tahu bahwa angka ajaib itu jahat, jadi dia menciptakan dua konstanta, satu untuk nomor dua, satu lagi untuk nomor tiga — tidak ada yang salah dalam melakukan perubahan ini; itu tidak seperti dia memodifikasi implementasi Anda yang sudah benar.
Karena terganggu, ia membalikkan dua konstanta.
Dia melakukan kode, dan semuanya tampak berfungsi dengan baik, karena tidak ada pengujian regresi yang berjalan setelah setiap komit.
Suatu hari (bisa berminggu-minggu kemudian), sesuatu pecah di tempat lain. Dan di tempat lain, maksud saya di lokasi yang sepenuhnya berlawanan dari basis kode, yang tampaknya tidak ada hubungannya dengan
polynominal
fungsi. Jam debugging menyakitkan mengarah ke pelakunya. Selama ini, aplikasi terus gagal dalam produksi, menyebabkan banyak masalah kepada pelanggan Anda.Menjaga tes asli yang Anda tulis dapat mencegah rasa sakit seperti itu. Pengembang yang terganggu akan melakukan kode, dan segera melihat bahwa dia memecahkan sesuatu; kode seperti itu bahkan tidak akan mencapai produksi. Tes unit juga akan sangat tepat tentang lokasi kesalahan . Memecahkannya tidak akan sulit.
Efek samping ...
Sebenarnya, sebagian besar refactoring sangat didasarkan pada pengujian regresi. Buat perubahan kecil. Uji. Jika lewat, semuanya baik-baik saja.
Efek sampingnya adalah jika Anda tidak memiliki tes, maka praktis setiap refactoring menjadi risiko besar melanggar kode. Mengingat ada banyak kasus, sudah sulit untuk menjelaskan kepada manajemen bahwa refactoring harus dilakukan, akan lebih sulit untuk melakukannya setelah upaya refactoring Anda sebelumnya memperkenalkan banyak bug.
Dengan memiliki serangkaian tes lengkap, Anda mendorong refactoring, dan kode yang lebih baik dan lebih bersih. Bebas risiko, sangat menggoda untuk melakukan refactor lebih banyak, secara teratur.
Perubahan persyaratan
Aspek penting lainnya adalah bahwa persyaratan berubah. Anda mungkin diminta untuk menangani angka yang rumit , dan tiba-tiba, Anda perlu mencari log kontrol versi untuk menemukan tes sebelumnya, mengembalikannya, dan mulai menambahkan tes baru.
Kenapa semua ini merepotkan? Mengapa menghapus tes untuk menambahkannya nanti? Anda bisa menyimpannya di tempat pertama.
sumber
Karena tidak ada yang begitu sederhana sehingga tidak ada bug.
Kode Anda, sementara itu tampaknya bebas bug. Ini sebenarnya adalah representasi programatik sederhana dari fungsi polinomial.
Kecuali itu memiliki bug ...
$x
tidak didefinisikan sebagai input ke kode Anda, dan tergantung pada bahasa atau runtime, atau pelingkupan, fungsi Anda mungkin tidak berfungsi, dapat menyebabkan hasil yang tidak valid, atau mungkin menabrak pesawat ruang angkasa .Tambahan:
Meskipun Anda dapat mempertimbangkan bug kode Anda gratis untuk saat ini, berapa lama hal ini tetap sulit untuk dikatakan. Meskipun dapat diperdebatkan bahwa menulis tes untuk sepotong kode sepele seperti itu tidak layak, setelah menulis tes itu pekerjaan dilakukan dan menghapusnya menghapus penjaga yang nyata.
Catatan tambahan adalah layanan cakupan kode (seperti coveralls.io) yang memberikan indikasi yang baik tentang cakupan yang disediakan oleh test suite. Dengan mencakup setiap baris kode, Anda memberikan metrik jumlah yang layak (jika bukan kualitas) pengujian yang Anda lakukan. Dalam kombinasi dengan banyak tes kecil, layanan ini setidaknya memberi tahu Anda di mana tidak mencari bug ketika itu terjadi.
Pada akhirnya, jika Anda sudah memiliki tes tertulis, pertahankan . Karena ruang atau waktu yang dihemat dari penghapusan, kemungkinan akan jauh lebih sedikit daripada hutang teknis nanti jika bug muncul.
sumber
Iya nih. Jika kita dapat mengatakan dengan keyakinan 100%, dengan pasti: fungsi ini tidak akan pernah diedit dan tidak akan pernah berjalan dalam konteks yang dapat menyebabkannya gagal - jika kita bisa mengatakan itu, kita bisa membatalkan tes dan menyimpan beberapa milidetik pada setiap CI membangun.
Tetapi kita tidak bisa. Atau, kita tidak bisa dengan banyak fungsi. Dan lebih mudah untuk memiliki aturan menjalankan semua tes sepanjang waktu daripada berupaya menentukan secara pasti ambang batas keyakinan apa yang kami puasi, dan persis berapa banyak kepercayaan yang kami miliki dalam ketidakberdayaan dan kemaksuman fungsi apa pun yang diberikan.
Dan waktu pemrosesan murah. Milidetik yang disimpan, bahkan berkali-kali lipat, tidak bertambah hingga cukup untuk membenarkan waktu dengan setiap fungsi untuk bertanya: apakah kita memiliki keyakinan yang cukup bahwa kita tidak perlu mengujinya lagi?
sumber
Semua yang dikatakan dalam jawaban lain benar, tetapi saya akan menambahkan satu lagi.
Dokumentasi
Tes unit, jika ditulis dengan baik, dapat menjelaskan kepada pengembang apa fungsi sebenarnya, apa harapan input / outputnya, dan yang lebih penting, perilaku apa yang bisa diharapkan darinya.
Ini dapat membuat bercak bug lebih mudah dan mengurangi kebingungan.
Tidak semua orang ingat polinomial, geometri, atau bahkan aljabar :) Tapi tes unit yang bagus untuk kontrol versi akan mengingat untuk saya.
Untuk contoh betapa bermanfaatnya itu sebagai dokumentasi, lihat pengantar Jasmine: http://jasmine.github.io/edge/introduction.html Beri waktu beberapa detik untuk memuat, lalu gulir ke bawah. Anda akan melihat seluruh Jasmine API didokumentasikan sebagai output uji unit.
[Pembaruan berdasarkan umpan balik dari @Warbo] Tes dijamin mutakhir juga karena jika tidak, mereka akan gagal, yang umumnya akan menyebabkan kegagalan build jika CI digunakan. Dokumentasi eksternal berubah secara independen dari kode, dan karena itu tidak selalu mutakhir.
sumber
Pengecekan kenyataan
Saya telah berada di lingkungan yang menantang di mana pengujian adalah "buang-buang waktu" selama penganggaran dan jadwal, dan kemudian "bagian mendasar dari jaminan kualitas" setelah pelanggan berurusan dengan bug, jadi pendapat saya lebih fleksibel daripada yang lain.
Anda punya anggaran. Tugas Anda adalah untuk mendapatkan produk terbaik sesuai anggaran Anda, untuk definisi "terbaik" apa pun yang dapat Anda gesek bersama (itu bukan kata yang mudah untuk didefinisikan). Akhir dari cerita.
Pengujian adalah suatu alat dalam inventaris Anda. Anda harus menggunakannya, karena ini adalah alat yang bagus , dengan sejarah panjang dalam menghemat jutaan, atau bahkan miliaran dolar. Jika diberi kesempatan, Anda harus menambahkan tes ke fungsi-fungsi sederhana ini. Ini mungkin menyelamatkan kulit Anda suatu hari nanti.
Tetapi di dunia nyata, dengan keterbatasan anggaran dan jadwal, itu mungkin tidak terjadi. Jangan menjadikan diri Anda budak dari prosedur. Fungsi pengujian memang bagus, tetapi pada titik tertentu, jam kerja Anda mungkin lebih baik digunakan untuk menulis dokumentasi pengembang dalam kata-kata, daripada kode, sehingga pengembang berikutnya tidak perlu banyak pengujian. Atau mungkin lebih baik dihabiskan refactoring basis kode sehingga Anda tidak harus mempertahankan sesulit binatang buas. Atau mungkin waktu itu lebih baik dihabiskan untuk berbicara dengan bos Anda tentang anggaran dan jadwal sehingga dia lebih memahami apa yang mereka menawar ketika putaran pendanaan berikutnya berakhir.
Pengembangan perangkat lunak adalah keseimbangan. Selalu hitung biaya peluang dari apa pun yang Anda lakukan untuk memastikan tidak ada cara yang lebih baik untuk menghabiskan waktu Anda.
sumber
Ya, teruskan tesnya, terus jalankan dan teruskan.
Tes unit ada untuk melindungi Anda (dan orang lain) dari diri Anda (dan diri mereka sendiri).
Mengapa menyimpan tes itu ide yang bagus;
sumber
Dokumentasi Pengembang
Dokumentasi Pengguna
sumber