Unit pengujian prosedur tersimpan

44

Saya sudah mempertimbangkan ini sejak lama.

Pertanyaan dasarnya adalah: bagaimana cara menguji prosedur yang tersimpan?

Saya melihat bahwa saya dapat mengatur unit test relatif mudah untuk fungsi dalam arti klasik (maksud saya mereka mendapatkan nol atau lebih argumen dan mengembalikan nilai). Tetapi jika saya menganggap contoh kehidupan nyata dari prosedur yang tampaknya sederhana memasukkan baris di suatu tempat, dengan beberapa pemicu melakukan ini dan itu sebelum atau setelah memasukkan, bahkan mendefinisikan batas-batas 'unit' cukup sulit. Haruskah saya menguji INSERTsendiri saja? Itu cukup mudah, saya pikir - dengan nilai yang relatif rendah. Haruskah saya menguji hasil dari seluruh rangkaian acara? Terlepas dari pertanyaan apakah ini adalah tes unit atau tidak, merancang tes yang cocok bisa menjadi pekerjaan yang berat dengan banyak tanda tanya tambahan yang muncul di jalan.

Dan kemudian muncul masalah mengubah data secara konstan. Dalam kasus yang UPDATEmempengaruhi lebih dari hanya beberapa baris, setiap baris yang berpotensi terpengaruh harus dimasukkan entah bagaimana dalam kasus uji. Kesulitan lebih lanjut dengan DELETEs dan seterusnya dan seterusnya.

Jadi, bagaimana Anda menguji prosedur tersimpan Anda? Apakah ada treshold dalam kompleksitas di mana ia menjadi sama sekali tidak ada harapan? Sumber daya apa yang dibutuhkan untuk pemeliharaan?

EDIT Satu lagi pertanyaan kecil, berdasarkan pada jawaban AlexKuznetsov: Atau adakah treshold yang benar-benar tidak berguna?

dezso
sumber

Jawaban:

32

Kami telah melakukan ini selama hampir lima tahun, dan kami berpikir bahwa pengujian modifikasi secara eksplisit sudah pasti bisa dilakukan, tetapi ini cukup lambat. Selain itu, kami tidak dapat dengan mudah menjalankan tes tersebut secara bersamaan dari beberapa koneksi, kecuali jika kami menggunakan basis data terpisah. Sebagai gantinya, kita harus menguji modfikasi secara implisit - kita menggunakannya untuk membangun setidaknya beberapa data uji, dan memverifikasi bahwa pilihan kita mengembalikan hasil yang diharapkan.

Saya telah menulis sebuah artikel berjudul Tutup Lubang Itu: Pelajaran dari Unit Testing T-SQL , serta beberapa posting blog

Mengenai pertanyaan Anda "Apakah ada treshold dalam kompleksitas di mana ia menjadi benar-benar putus asa?", Modul kompleks membutuhkan tes lebih dari yang sederhana.

Untuk menyederhanakan perawatan, kami menghasilkan hasil yang diharapkan, dan kami menyimpannya dalam file terpisah - yang membuat perbedaan besar.

AK
sumber
15

Ya, Anda harus menguji seluruh rantai peristiwa sebagai satu unit. Jadi, dalam contoh Anda dengan prosedur yang menyisipkan ke dalam tabel dan menyebabkan beberapa pemicu untuk menyala, Anda harus menulis tes unit yang mengevaluasi prosedur untuk berbagai input. Setiap pengujian unit harus lulus atau gagal tergantung pada apakah itu mengembalikan nilai yang benar, mengubah keadaan tabel dengan benar, membuat email yang benar, dan bahkan mengirim paket jaringan yang benar jika dirancang untuk melakukan hal seperti itu. Singkatnya setiap efek yang dimiliki unit harus diverifikasi.

Anda benar, bahwa mendesain unit test memerlukan beberapa pekerjaan, tetapi sebagian besar pekerjaan itu harus dilakukan untuk menguji unit secara manual, Anda hanya menyimpan pekerjaan yang diperlukan untuk menguji unit sehingga ketika perubahan dilakukan di masa depan pengujian bisa sama menyeluruh dan secara signifikan lebih mudah.

Mengubah data memang membuat pengujian lebih sulit, tetapi itu tidak membuat pengujian kurang penting dan benar-benar meningkatkan nilai pengujian unit karena sebagian besar kesulitan hanya harus dipikirkan sekali daripada setiap kali perubahan dilakukan ke unit. Kumpulan data yang disimpan, sisipan / pembaruan / penghapusan yang merupakan bagian dari pengaturan / penghancuran, dan operasi dengan cakupan yang sempit semua dapat digunakan untuk membuatnya lebih mudah. Karena pertanyaan tidak spesifik untuk basis data, detailnya akan beragam.

Tidak ada ambang batas kompleksitas pada ujung atas atau bawah yang seharusnya menghentikan Anda dari pengujian atau pengujian unit. Pertimbangkan pertanyaan-pertanyaan ini:

  1. Apakah Anda selalu menulis kode bebas bug?
  2. Apakah unit kecil selalu bebas bug?
  3. Apakah OK untuk unit besar memiliki bug?
  4. Berapa banyak bug yang diperlukan untuk menyebabkan bencana?

Misalkan Anda memulai pekerjaan baru dan bertugas membuat optimasi ke fungsi kecil yang digunakan di banyak tempat. Seluruh aplikasi ditulis dan dikelola oleh seorang karyawan yang bahkan tidak ada yang ingat. Unit memiliki dokumentasi yang menggambarkan perilaku normal yang diharapkan, tetapi tidak banyak. Manakah dari ini yang Anda lebih suka temukan?

  • Tidak ada unit test di mana pun dalam aplikasi. Setelah melakukan perubahan, Anda dapat melakukan beberapa pengujian manual terhadap unit itu sendiri untuk memastikannya masih mengembalikan nilai yang diharapkan dalam dokumentasi. Anda kemudian dapat menjalankannya untuk produksi, silangkan jari Anda dan berharap itu berfungsi (setelah semua, Anda selalu menulis kode bebas bug dan pengoptimalan dalam satu unit tidak pernah dapat mempengaruhi yang lain) atau menghabiskan banyak waktu untuk mempelajari bagaimana seluruh aplikasi berfungsi agar Anda dapat menguji setiap unit secara langsung atau tidak langsung secara manual.
  • Unit menguji seluruh aplikasi yang berjalan secara otomatis setiap hari atau sesuai permintaan. Mereka memeriksa tidak hanya nilai input normal dan respons yang diharapkan, tetapi juga nilai abnormal dan pengecualian yang diharapkan yang muncul. Anda melakukan perubahan dan menjalankan unit test unit untuk aplikasi segera melihat bahwa tiga unit lainnya tidak lagi menghasilkan hasil yang diharapkan. Dua di antaranya jinak, jadi Anda men-tweak unit test untuk menjelaskan hal itu. Yang ketiga membutuhkan sedikit perbaikan dan uji unit kecil baru. Setelah melakukan perubahan, seluruh rangkaian tes berhasil dan Anda melakukan perubahan dengan percaya diri.
Leigh Riffel
sumber
1
Pertama, terima kasih atas jawaban Anda - saya tidak mengharapkan kemajuan lebih lanjut tentang pertanyaan ini ... Kedua, saya harus mengakui bahwa Anda benar tentang operasi sederhana: bahkan INSERT dua kolom dapat menghasilkan bug. Jika ditulis sehingga urutan kolom dapat dicocokkan dengan argumen maka mungkin OK, tapi kemudian Anda benar, sekali lagi: mungkin lebih baik menjaga seluruh aplikasi di bawah rezim pengujian.
dezso
@dezso Ini pertanyaan yang bagus dan konsep yang membutuhkan lebih banyak paparan di dunia Database.
Leigh Riffel
"Anda harus menguji seluruh rantai peristiwa sebagai satu kesatuan" - ini adalah hal yang paling kontra-intuitif yang bisa Anda katakan. Ini bukan unit jika itu masalahnya. Anda sedang melakukan pengujian integrasi
Joe Phillips
@ Jo Philips - Sebut saja sesuka Anda, pastikan prosedur yang memasukkan dan mengaktifkan beberapa pemicu melakukan apa yang seharusnya perlu dilakukan pengujian otomatis.
Leigh Riffel
8

Untuk PostgreSQL, lihat pgTAP :

pgTAP adalah rangkaian fungsi basis data yang memudahkan untuk menulis tes unit pemancar TAP dalam skrip psql atau fungsi tes gaya xUnit.

Frank Heikens
sumber
Lihat itu, terima kasih. Apakah ada yang punya pengalaman dengan itu?
dezso
Ya, beberapa orang saat ini. Berlangganan ke daftar surat jika Anda memiliki pertanyaan.
teori
6

Jika Anda lebih suka pengujian Anda dari prosedur yang tersimpan dilakukan sepenuhnya pada SQL, maka lihat di http://tsqlt.org/

Ini kompatibel dengan MS SQL 2005 SP2 dan lebih besar, dan keuntungannya adalah pengembang tidak perlu tahu C # atau bahasa lain untuk mengimplementasikan tes.

Ada juga fasilitas untuk membuat tabel tiruan dan pandangan untuk membantu Anda mencapai test suite yang dapat dijalankan kembali.

Alain King
sumber