Saya memiliki banyak kesempatan baru-baru ini di mana saya harus memelihara prosedur dan fungsi yang tersimpan kompleks. Ini sudah rusak, biasanya dalam cara yang cukup halus - ada beberapa kesempatan di mana Anda akan memanggil SP dengan parameter yang valid dan itu hanya tidak berfungsi.
Solusi saya adalah mengembangkan kerangka kerja yang mengeksekusi prosedur tersimpan di dalam transaksi, setelah menginisialisasi database ke kondisi awal yang saya butuhkan, kemudian menguji untuk hasil yang diharapkan, juga dalam transaksi yang sama. Transaksi dibatalkan pada akhir tes.
Ini telah bekerja dengan sangat baik. Tetapi beberapa orang akan menyebutnya "pengujian integrasi" karena melibatkan integrasi dengan database. Saya menyebutnya unit testing, karena saya menguji masing-masing komponen dan kasus uji individual untuk komponen-komponen itu, dan karena saya sepenuhnya mengendalikan keadaan awal basis data.
Tapi di mana garis harus ditarik? Apakah ini pengujian integrasi atau pengujian unit? Adakah alasan praktis mengapa tes semacam ini adalah ide yang buruk? Jika ini "hanya" pengujian integrasi, apakah ada yang punya saran tentang bagaimana melakukan "unit test" yang sebenarnya pada prosedur yang tersimpan ini?
Perbarui, 3 1/2 tahun kemudian. Pada proyek saya saat ini, saya sudah mulai menggunakan tes unit SSDT, dengan sukses, meskipun mereka bisa lebih baik. Lihat Memverifikasi Kode Basis Data dengan Menggunakan Tes Unit SQL Server . Ini biasanya menyebarkan proyek database ke instance Anda dari SQL Server LocalDB, jadi ini menghilangkan pertanyaan tentang lingkungan database yang mempengaruhi pengujian. Saya mengisi database dengan data yang diperlukan selama Pra-Tes, yang menghilangkan pertanyaan tentang konten database. Bahkan, saya menggunakan pernyataan MERGE untuk melakukan ini, memastikan bahwa data apa pun yang saya tidak perlukan untuk pengujian saat ini dihapus, dimasukkan atau diperbarui dari database sebelum pengujian. Mereka memang memiliki masalah:
- Mereka tidak cepat
- Tidak mungkin menggunakan kembali kondisi pengujian
- Tidak mungkin untuk menggunakan kembali pra-tes (kecuali jika Anda membuatnya umum untuk semua tes dalam suatu proyek)
- Antarmuka pengguna dapat ditingkatkan
Salah satu alasan untuk masalah di atas adalah bahwa saya belum mengeluh tentang mereka. Saya sarankan siapa pun yang tertarik harus mencoba fitur ini, dan kemudian mengeluh tentang hal itu. Begitulah cara perbaikan dilakukan.
sumber
Jawaban:
Maksud dari pengujian unit bukanlah untuk membuat peri tes unit sihir datang dan memvalidasi pendapat Anda. Ini untuk menguji blok bangunan terkecil, paling sederhana dari sistem Anda, sehingga Anda tidak menguji beberapa fungsi yang lebih luas dan tersandung karena sesuatu tidak bekerja seperti yang Anda pikirkan. Jadi, bisakah Anda memecah ini lebih lanjut? Saya pikir Anda tidak bisa, dalam hal ini:
(a) Kedengarannya seperti tes unit bagi saya, dan (b) Tidak masalah apakah itu tes unit atau tidak, karena tes ini menguji apa yang Anda butuhkan, yang merupakan titik menggunakan tes unit pada awalnya!
Jika Anda merasa prosedurnya terlalu rumit, Anda mungkin ingin memecahnya sendiri menjadi bagian-bagian yang lebih kecil (dalam prosedur basis data atau dalam kode), tetapi untuk melakukan itu Anda ingin melakukan tes ini terlebih dahulu!
sumber
Pengujian unit menurut definisi berkisar pada pengujian "unit" kode di lingkungan atau platform yang berjalan. Platform yang Anda gunakan adalah database sehingga Anda harus menggunakannya, itu tidak integratif.
Pertanyaan yang lebih baik adalah mengapa Anda peduli. Selama ini otomatis dan menambah nilai, peduli apakah tes Anda dalam tes unit, tes penerimaan, tes asap, atau tes fungsional?
Di pekerjaan saya, kami saat ini memanfaatkan kerangka pengujian unit untuk melakukan Acceptance Test Driven Development (ATDD). Beberapa tes bersifat integratif, beberapa tidak. Hampir tidak ada dari mereka yang merupakan unit test, tetapi kami tidak peduli selama:
Memperbarui
Ini semua masalah biaya dan manfaat. Semakin banyak bagian yang bergerak Anda semakin tinggi risiko memiliki tes non-deterministik. Tes unit klasik memiliki jumlah bagian bergerak yang paling sedikit, dan karena itu memiliki peluang paling kecil untuk menjadi non deterministik. Imbalannya adalah Anda tidak menguji titik integrasi (kode, database, fs, jaringan, dll). Semua ini berguna untuk dicakup dalam tes, selama risiko kegagalan atau kesuksesan palsu cukup rendah.
Tes memberikan nilai pada apa yang tidak mereka lakukan. Kuncinya adalah seberapa sering Anda akan mengalami kegagalan dan kesuksesan palsu. Jika saya memiliki kesalahan palsu selama 2 jam setiap bulan karena itu adalah jendela pemeliharaan untuk jaringan, maka nilai tes jelas. Ketika mereka gagal jelas ada sesuatu yang salah dengan sumber daya jaringan, bukan tes tertentu. Dan sekarang Anda memiliki cakupan pengujian yang lebih tepat karena Anda menguji titik integrasi tersebut.
sumber
Saya pikir itu tergantung dari mana data berasal. Jika Anda membuat kondisi pengujian dalam awalan tes, saya pikir masuk akal untuk menyebutnya tes unit. Kalau tidak, Anda masuk ke argumen rewel tentang apa yang dianggap sebagai "sudah ada" untuk tes unit. Sama seperti tes unit database Anda bergantung pada keberadaan tabel database dan seterusnya, tes unit di luar database bergantung pada hal-hal seperti definisi kelas dan sering kali contoh dari clssses tersebut. Itu tidak buruk, itu realistis.
sumber
Saya akan menganggap itu sebagai pengujian integrasi:
Namun, tes seperti yang Anda gambarkan sangat berharga untuk dimiliki. Kami baru-baru ini mulai menambahkan tes begitu saja, untuk menguji prosedur tersimpan yang tidak mungkin diuji secara manual di lingkungan tertentu. Saya tidak tahu cara lain untuk memiliki tes otomatis untuk prosedur tersimpan.
Jadi, tes ini adalah ide bagus, tetapi menyebutnya tes integrasi - gunakan kategori tes atau akhiran nama untuk membedakannya dari tes unit biasa. Dengan cara ini, Anda dapat menandai kegagalan pengujian integrasi secara berbeda dari kegagalan pengujian unit dalam otomasi bangunan Anda.
sumber
SqlCommand
kelas berfungsi, dan bahwa transport TCP berfungsi. Saya belum salah tentang itu.Di mana tes berjalan? Pada database atau melalui test harness berbasis kode (JUnit)?
Pada database maka kemungkinan unit test (karena mandiri), test harness seperti JUnit kemudian terhubung ke database eksternal dan dengan demikian tes integrasi.
Mengapa mengutip? Tes integrasi bukanlah sejenis binatang buas yang tidak boleh Anda lakukan.
Saya biasanya menemukan satu-satunya unit yang masuk akal untuk prosedur tersimpan adalah kode panggilan dan prosedur. Jadi saya integrasi menguji set lengkap dalam serangkaian tes yang terlihat seperti tes unit.
Karena memungkinkan Anda untuk membagi tes. Tes integrasi membutuhkan waktu lebih lama untuk dijalankan, memerlukan pengaturan tambahan dan kemungkinan akses ke sumber daya yang dibagikan oleh banyak tes (misalnya database).
1) Kode panggilan akan memiliki tes unit tambahan jika diperlukan.
sumber
Microtest adalah istilah yang berguna yang dapat membantu Anda menghindari perdebatan tentang terminologi dan apakah tes Anda merupakan tes unit atau tidak.
Definisi umum dari unit-test mencakup bahwa sistem yang diuji adalah unit fungsionalitas kecil dan Anda harus dapat menjalankan semua tes terhadapnya dalam memori, tanpa bantuan dari sistem file, jaringan, atau mesin basis data . Jika Anda membutuhkan mesin database aktual untuk menjalankannya, maka itu bukan tes unit.
Sementara definisi ini bekerja dengan sangat baik untuk semua lapisan aplikasi, itu tidak sangat membantu untuk lapisan akses basis data terbawah. Kita harus mengakui bahwa itu istimewa. Jika tes Anda hanya menguji unit kecil dari fungsi penyimpanan / pengambilan / perbarui / hapus, maka pengujian Anda jelas sama berharganya dengan tes unit "ketat" yang ditulis terhadap lapisan atas sistem Anda.
sumber
SELECT
, maka saya tidak repot-repot mengujinya.