Haruskah saya menulis unit test untuk ekspresi reguler yang kompleks dalam aplikasi saya?
- Di satu sisi: mereka mudah untuk diuji karena format input dan output seringkali sederhana dan terdefinisi dengan baik, dan mereka sering menjadi sangat kompleks sehingga pengujian mereka secara khusus bernilai.
- Di sisi lain: mereka sendiri jarang menjadi bagian dari antarmuka beberapa unit. Mungkin lebih baik hanya menguji antarmuka dan melakukannya dengan cara yang secara implisit menguji regex.
EDIT:
Saya setuju dengan Doc Brown yang dalam komentarnya mencatat bahwa ini adalah kasus khusus pengujian unit komponen internal .
Tetapi sebagai komponen internal, regex memiliki beberapa karakteristik khusus:
- Regex baris tunggal bisa sangat kompleks tanpa benar-benar menjadi modul terpisah.
- Regex input peta ke output tanpa efek samping dan karenanya sangat mudah untuk diuji secara terpisah.
Jawaban:
Mengesampingkan dogmatisme, pertanyaan sebenarnya adalah apakah itu memberikan nilai pada unit test ekspresi reguler yang kompleks. Tampaknya cukup jelas bahwa ia memberikan nilai (terlepas dari apakah regex merupakan bagian dari antarmuka publik) jika regex cukup kompleks, karena memungkinkan Anda untuk menemukan dan mereproduksi bug dan mencegah dari regresi.
sumber
isValid
,parse
,tryParse
, atau entah apa lagi, tergantung persis bagaimana itu digunakan), sehingga bahwa kode klien tidak harus tahu bahwa itu saat ini diterapkan menggunakan regex. Unit pembungkus kemudian akan memiliki tes terperinci, yang - sekali lagi - tidak perlu mengetahui implementasi saat ini. Tes-tes ini, tentu saja, secara de facto menguji regex, tetapi dengan cara implementasi-agnostik.FooValidator
input dan outputnya, maka Anda tidak perlu khawatir tentang bagaimana hal itu dilakukan. ++Regex bisa menjadi alat yang ampuh, tetapi itu bukan alat yang bisa Anda percayai untuk tetap berfungsi jika Anda membuat perubahan kecil pada regex yang kompleks.
Jadi buat banyak tes yang mendokumentasikan kasus-kasus yang harus diliput. Dan membuat banyak tes yang mendokumentasikan kasus itu harus gagal, jika digunakan untuk validasi.
Setiap kali Anda perlu mengubah regex Anda, Anda menambahkan case baru sebagai tes, memodifikasi regex Anda dan berharap yang terbaik.
Jika saya berada di organisasi yang secara umum tidak menggunakan tes unit, saya masih akan menulis program uji yang akan menguji setiap regex yang kami gunakan. Saya bahkan akan melakukannya pada waktu saya sendiri jika harus, rambut saya tidak perlu kehilangan warna lagi.
sumber
Ekspresi reguler adalah kode bersama dengan sisa aplikasi Anda. Anda harus menguji bahwa keseluruhan kode melakukan apa yang Anda harapkan. Ini memiliki beberapa tujuan:
Karena ada rintangan ekstra untuk diatasi dengan memiliki kode dalam bahasa yang berbeda tertanam dengan yang lain, Anda kemungkinan besar harus memberikan perhatian ekstra ini untuk kepentingan pemeliharaan.
sumber
Singkatnya, Anda harus menguji aplikasi Anda, titik. Apakah Anda menguji regex Anda dengan tes otomatis yang menjalankannya secara terpisah, sebagai bagian dari kotak hitam yang lebih besar atau jika Anda hanya mengotak-atiknya dengan tangan adalah hal kedua yang perlu Anda pastikan agar berfungsi.
Keuntungan utama dari unit test adalah mereka dapat menghemat waktu. Mereka membiarkan Anda menguji benda sebanyak yang Anda suka sekarang atau di titik mana pun di masa depan. Jika ada alasan untuk percaya bahwa regex Anda pada titik mana saja akan di-refactored, di-tweak, mendapatkan lebih banyak kendala dll, maka ya, Anda mungkin ingin beberapa tes regresi untuk itu, atau ketika Anda mengubahnya, Anda harus pergi melalui satu jam memikirkan semua kasus tepi sehingga Anda tidak memecahkannya. Itu, atau Anda belajar hidup dengan takut akan kode Anda dan tidak pernah mengubahnya.
sumber
Saya pikir dengan ini Anda menjawab sendiri. Regex dalam suatu unit kemungkinan besar merupakan detail implementasi.
Apa yang berlaku untuk pengujian SQL Anda mungkin juga berlaku untuk regex. Ketika Anda mengubah sepotong SQL, Anda mungkin menjalankannya melalui beberapa klien SQL dengan tangan untuk melihat apakah itu menghasilkan apa yang Anda harapkan. Hal yang sama berlaku ketika saya mengubah regex saya menggunakan beberapa alat regex dengan beberapa input sampel untuk melihat apakah ia melakukan apa yang saya harapkan.
Apa yang saya temukan berguna adalah komentar di dekat regex dengan sampel teks yang harus cocok.
sumber
Jika Anda harus bertanya, jawabannya adalah ya.
Misalkan beberapa FNG datang dan berpikir dia dapat "meningkatkan" regex Anda. Sekarang, dia seorang FNG, jadi otomatis itu idiot. Persis seperti orang yang tidak boleh menyentuh kode berharga Anda dalam keadaan apa pun, pernah! Tapi mungkin dia punya hubungan keluarga dengan PHB atau semacamnya, jadi tidak ada yang bisa Anda lakukan.
Kecuali Anda tahu PHB akan menyeret Anda menendang dan berteriak kembali ke proyek ini untuk "mungkin memberi orang itu beberapa petunjuk tentang bagaimana Anda membuat kekacauan ini" ketika semuanya memburuk. Jadi, Anda menuliskan semua kasus yang telah Anda pertimbangkan dengan hati - hati ketika membangun karya agung Anda yang indah untuk berekspresi.
Dan karena Anda telah menuliskan semuanya, Anda dua pertiga dari cara memiliki satu set kasus uji, karena - mari kita hadapi itu - kasus uji regex mati mudah dijalankan setelah kerangka kerja dibangun.
Jadi sekarang, Anda memiliki serangkaian kondisi tepi, alternatif, dan hasil yang diharapkan. Dan tiba - tiba kasus uji adalah dokumentasi seperti yang dijanjikan dalam semua posting blog saya Agile. Anda hanya menunjukkan kepada FNG bahwa jika "perbaikannya" tidak lulus uji kasus yang ada, itu tidak banyak perbaikan, bukan? Dan di mana diusulkannya kasus uji baru yang menunjukkan beberapa masalah dengan kode asli, yang sejak berhasil ia tidak perlu memodifikasi lagi !!!
sumber