Sedikit konteks: Sebelumnya hari ini saya harus memperbarui beberapa kode SQL yang disediakan oleh rekan saya yang lain, dan karena ini skrip yang cukup besar, disimpan sebagai file terpisah (yang kemudian dibaca dan dieksekusi saat runtime). Saat melakukan ini, saya secara tidak sengaja memperkenalkan kembali dua bug yang kami miliki beberapa bulan lalu, yaitu:
- Untuk alasan apa pun file ASCII dikodekan dalam UTF-16 (kolega mengirimi saya email file tersebut, yang mungkin menyebabkannya).
- Script tidak ada
SET
pernyataan awal (diperlukan karena beberapa hal driver pada produksi, tetapi tidak pada instalasi yang bersih secara lokal).
Setelah men-debug ini sekitar satu jam (lagi) saya memutuskan untuk menulis beberapa tes unit untuk memastikan ini tidak akan terjadi lagi (dan termasuk cara cepat untuk memperbaikinya dalam pesan pernyataan untuk memberikan perbaikan yang mudah bagi pengembang masa depan).
Namun ketika saya mendorong kode ini rekan lain (yang juga pemimpin tim kami) menghampiri saya dan mengatakan bahwa saya tidak boleh membuat hal-hal ini lagi karena:
"Benda-benda ini tidak termasuk dalam unit test"
"Tes unit seharusnya hanya digunakan untuk memeriksa aliran kode Anda"
Saya cukup konflik sekarang karena saya masih berpikir apa yang saya lakukan tidak salah, karena bug ini tidak akan diperkenalkan kembali di masa depan, namun kolega ini bekerja sebagai senior dan pada akhirnya harus memutuskan apa kita menghabiskan waktu kita. Apa yang harus saya lakukan? Apakah saya salah melakukannya dengan cara ini? Apakah itu dianggap praktik yang buruk?
sumber
Jawaban:
Kemungkinan besar tes yang Anda tulis lebih dekat dengan tes integrasi atau regresi daripada tes unit. Sementara baris bisa sangat kabur dan kadang-kadang beralih ke pedantry atas apa yang bukan tes unit, saya akan kembali ke kolega Anda dan bertanya di mana tes yang Anda tulis harus karena mereka menambah nilai memastikan kebenaran kode.
Saya tidak akan terlalu fokus pada apa yang merupakan tes unit atau tidak dan menyadari bahwa bahkan jika tes integrasi, masih ada nilai dalam tes.
sumber
Secara teknis, ini bukan tes unit, dan lebih merupakan langkah validasi. Pendekatan yang tepat benar-benar tergantung pada apa alur kerja Anda seharusnya. Pimpinan tim Anda benar tentang tujuan tes unit. Perasaan saya adalah bahwa ini adalah kasus menggunakan alat yang salah untuk pekerjaan yang masih perlu dilakukan. Jadi mulailah dengan ini:
Dengan deskripsi, Anda perlu memvalidasi bahwa skrip basis data apa pun mematuhi beberapa standar.
Kualitas kode sumber biasanya diperiksa oleh alat analisis statis . Jika Anda tidak memiliki alat analisis statis untuk memvalidasi SQL Anda, maka Anda dapat membuat alat cepat dan kotor yang melakukan pemeriksaan pada setiap file SQL yang diteruskan ke dalamnya. Tidak ada salahnya untuk memeriksa apakah ada alat analisis statis yang dapat menangani masalah yang Anda bicarakan.
Jika Anda menjadikan itu bagian dari infrastruktur build Anda, seperti memasukkannya ke Jenkins atau semacamnya, itu dapat diterapkan ke semua file SQL di proyek Anda.
Tes unit hanya memecahkan masalah untuk file Anda saat ini.
Ini cukup mudah, Anda berbicara dengan pimpinan tim Anda. Ia dapat bekerja dengan pemilik produk dan Anda untuk menentukan risiko / imbalan berinvestasi dalam perkakas. Jika ini kemungkinan merupakan masalah satu kali saja maka tooling mungkin akan berlebihan. Jika alat untuk menangkap masalah terbesar itu mudah, mungkin layak hanya untuk pemeriksaan kewarasan.
Pimpinan tim Anda mungkin memiliki beberapa gagasan yang Anda (atau saya) belum pertimbangkan, yang dapat mengatasi masalah dengan lebih benar.
sumber
Merupakan praktik yang buruk untuk memanggil tes yang mengakses file "Tes Unit".
Sayangnya, jenis tes apa yang ada dan bagaimana mereka diorganisasikan sepenuhnya khusus untuk perusahaan. Jadi, Anda harus mencari tahu bagaimana perusahaan Anda menangani tes ini.
Jika Anda belum memiliki cara untuk menjalankan tes otomatis selain dari Tes Unit, pendekatan pragmatis adalah dengan menandai Tes Unit yang sebenarnya bukan Tes Unit dengan awalan, sampai Anda memiliki cukup banyak dari mereka untuk mulai mencari tahu seperti apa tes yang sebenarnya Anda miliki / butuhkan. Setelah itu Anda bisa mulai mengatur.
sumber
Michael Feathers mengatakan ini dalam bukunya Bekerja Efektif dengan Kode Legacy:
Apakah tes Anda membantu melokalisasi kesalahan dengan cepat dan berjalan cepat? Jika ya, maka lakukanlah! Jika tidak, maka jangan! Sesederhana itu!
Yang sedang berkata, Anda bekerja di lingkungan dengan orang lain dan harus bergaul dengan mereka. Anda mungkin harus akhirnya melakukannya dengan caranya, bahkan jika Anda secara pribadi tidak setuju dengan itu.
sumber
Saya pernah menulis tes serupa, kadang-kadang, terhadap file kode sumber, file konfigurasi, dan sebagainya. Saya tidak akan menyebut mereka unit-test karena (a) mereka mengakses sistem file dan mungkin tidak ultra-cepat (b) Saya tidak peduli jika mereka dieksekusi pada setiap check-in (sebagai lawan dari malam pada Server CI).
Anda bisa menyebutnya tes integrasi; tentu saja, mereka lebih dekat ke perspektif itu daripada tes unit.
Istilah saya sendiri untuk mereka adalah tes sumber daya . IMHO, mereka sepenuhnya dibenarkan jika dijalankan setiap malam di server CI: ada biaya minimal dan, ketika digunakan dengan bijaksana, jelas menambah nilai. Satu definisi bijaksana : jika tes memeriksa masalah yang menyebabkan masalah (seperti pengkodean yang Anda sebutkan).
sumber
Tes unit adalah semua tentang pengujian metode atau 'unit' kode. Anda sedang menguji kelompok logika dan kode terkecil dalam perangkat lunak Anda.
Kemudian, ketika Anda bergabung dengan unit lain Anda akan melakukan pengujian integrasi.
Saya harap pimpinan tim Anda mendorong inisiatif Anda dan seharusnya menawarkan saran alternatif. Anda pasti memiliki ide yang tepat.
SQL Anda adalah kode sama seperti bahasa generasi lebih rendah seperti C # atau Java dan harus diuji seperti itu. Dan verifikasi dan validasi adalah milik semua level pengujian. Jadi, pengkodean dan pernyataan SET disertakan, tetapi belum tentu diuji secara eksklusif. Hal-hal umum seperti ujung garis atau penutup Anda biasanya dapat menggunakan kait atau fitur SCM.
Praktik terbaik adalah memiliki tes regresi untuk memastikan bahwa bug masa lalu tidak diperkenalkan kembali. Umumnya, tes dibuat berdampingan dengan resolusi bug apa pun. Jika bug ini tidak dicakup oleh uji regresi pada unit / integrasi atau tingkat sistem dan kemudian diperkenalkan kembali itu adalah masalah tim, masalah proses, bukan individu.
Masalahnya adalah ... kesalahan sintaksis, pernyataan yang hilang atau blok logika di dalam 'unit' biasanya tidak diuji. Anda menguji input dan output unit dalam kombinasi yang berbeda, menguji banyak kemungkinan yang dapat dihasilkan.
Kembali ke pernyataan SET yang hilang - mereka membantu menginformasikan banyak kemungkinan input dan output untuk diuji. Tes apa yang akan Anda tulis yang akan GAGAL jika Anda kehilangan SET yang dipilih?
sumber
Jika Anda memiliki file yang menjadi bagian dari produk Anda, maka isinya harus benar. Tidak ada alasan mengapa Anda tidak akan memverifikasi ini. Sebagai contoh jika Anda memerlukan enam gambar 1024x 1024 di beberapa folder, maka tentu saja menulis tes unit yang memeriksa Anda memiliki persis itu.
Tetapi Anda mungkin tidak hanya memiliki file, Anda juga memiliki beberapa kode yang membaca file. Anda bisa menulis unit test untuk kode itu. Dalam contoh di atas, apakah fungsi untuk membaca salah satu dari enam gambar mengembalikan gambar 1024 x 1024 dalam memori (atau apa pun yang seharusnya dihasilkan).
Bagaimanapun, ini mungkin bukan tes unit, tetapi ini adalah tes yang berguna. Dan jika Anda menggunakan kerangka kerja unit test yang memungkinkan Anda untuk melakukan tes yang berguna (itu bukan tes unit), mengapa tidak menggunakan kerangka kerja unit test?
sumber
Mungkin saya salah paham masalah Anda, tetapi bagi saya ini terdengar seperti masalah yang seharusnya tidak perlu ditangkap dengan segala macam tes khusus tetapi hanya dengan sistem kontrol versi . Setiap perubahan pada basis kode harus ditinjau berdasarkan patch-by-patch sebelum melakukan. Cara sederhana untuk melakukan ini di git adalah menambahkan perubahannya
Ini akan untuk setiap perubahan dalam file teks direktori kerja bertanya apakah Anda benar-benar ingin menyimpannya. Itu akan memungkinkan Anda untuk melihat, misalnya, penghapusan "
SET
pernyataan awal " tersebut.Dalam kasus pengkodean seluruh file berubah, sesuatu yang berbeda akan terjadi: algoritma akan gagal untuk diff file lama dan baru, dan karena
git add -p
itu tidak akan menambahkan apa pun sama sekali. Ini kemudian akan terlihat di perintah lain yang akan saya lakukan sebelum komit, yaituDi sini Anda akan melihat file disorot dalam warna merah, menunjukkan bahwa ada yang berubah. Menyelidiki mengapa ini tidak berhasil
git add -p
akan dengan cepat membuat masalah menjadi jelas.sumber
git
adalah contoh terbaik dari itu - alat yang hebat, namun hampir tidak dapat digunakan untuk manusia biasa .Sudut lain untuk dipertimbangkan: karena kedua syarat tersebut adalah persyaratan untuk menjalankan program Anda, bukankah Anda harus menanamkan logika di dekat logika eksekusi? Maksud saya: Anda menguji keberadaan file sebelum membacanya dan / atau memvalidasi kontennya, bukan? jadi bagaimana ini berbeda? Saya pikir karena ini adalah sumber daya kode-eksternal, harus divalidasi saat runtime, sebelum benar-benar digunakan. Hasil: aplikasi yang lebih kuat, tidak perlu menulis tes tambahan.
sumber
Tes adalah kode yang sama dengan yang lain dan, jika cukup kompleks, juga mendapat manfaat dari ... pengujian unit. Tampaknya paling sederhana untuk menambahkan pemeriksaan prasyarat seperti itu langsung ke dalam tes.
Sebagian besar tes cukup sederhana untuk tidak memerlukan ini, tetapi jika beberapa cukup kompleks, saya tidak melihat ada yang salah secara fundamental dengan pemeriksaan pra-kondisi ini. Tentu saja, tes juga harus gagal tanpa mereka, tetapi tes unit yang baik juga memberitahu unit mana yang gagal.
Sebuah skrip yang digunakan sebagai bagian dari pengujian dan harus memiliki konten dan penyandian tertentu mungkin merupakan unit. Mungkin memiliki lebih banyak kode dan logika daripada tes lainnya. Pengujian dengan skrip semacam itu bukanlah desain terbaik yang pernah ada dan, jika mungkin, harus dire-refored menjadi sesuatu yang lebih langsung (kecuali ini adalah tes integrasi).
sumber
Pertama - salah satu tujuan tes adalah untuk mencegah masalah berulang dalam kode Anda - jadi Anda harus tetap menulis tes seperti ini.
Kedua - penamaan itu sulit. Ya, ini jelas bukan "unit test", tetapi itu bisa menjadi bagian yang diinginkan dan diperlukan dari proses build, karena mereka melindungi Anda dari kesalahan yang jelas, dan karena mereka memberi Anda umpan balik tentang kesalahan lebih cepat (terutama mengingat Anda tidak melihat konsekuensi pada kotak dev).
Jadi, pertanyaannya adalah (seharusnya dalam konteks Anda) lebih banyak tentang kapan dan bagaimana tes ini dijalankan daripada apa itu.
Saya telah menggunakan tes semacam ini secara luas di masa lalu - mereka telah menyelamatkan kita dari rasa sakit yang cukup.
sumber
Tes unit adalah tentang mengeksekusi unit kode secara terpisah untuk mengonfirmasi bahwa ia menghasilkan hasil yang benar untuk input yang benar. Isolasi harus membuat unit yang diuji dan tes itu sendiri berulang yaitu tidak boleh bergantung pada atau menimbulkan efek samping.
SQL bukanlah sesuatu yang dapat diuji secara terpisah, jadi setiap pengujian SQL bukanlah uji unit, dan, kecuali untuk pernyataan SELECT, hampir pasti memiliki efek samping. Kita bisa menyebutnya tes integrasi daripada tes unit.
Itu selalu bijaksana untuk memastikan bahwa setiap cacat yang dapat diperkenalkan dapat dideteksi sedini mungkin dalam siklus pengembangan, dan bermanfaat untuk melakukannya dengan cara yang memudahkan untuk mengidentifikasi sumber cacat sehingga dapat dengan cepat dikoreksi.
Tes yang dimaksud mungkin lebih tepat dipindahkan keluar dari badan "unit test" dan ditempatkan di tempat lain, tetapi tidak boleh dihapus sama sekali jika mereka melakukan sesuatu yang berguna seperti menjaga terhadap kemungkinan pengenalan cacat yang bisa memakan waktu berjam-jam untuk dilacak. turun.
sumber