Apa saja praktik terbaik untuk mengisi dan menggunakan database uji?

8

Jadi, saya sedang mengembangkan beberapa layanan web Java yang digerakkan oleh database, menggunakan Hibernate dan MySQL. Untuk tujuan pengujian, saya menggunakan database H2 di memori. H2 bagus dan cepat, jadi ini bekerja dengan sangat baik. Satu-satunya masalah adalah bahwa mengisi tabel DB sebelum tes saya agak membosankan. Saya pada dasarnya membuat dan bertahan banyak objek dengan tangan. Saya bertanya-tanya apakah mungkin saya salah jalan.

Tolong beritahu saya, apa praktik terbaik untuk melakukan apa yang saya coba lakukan? Adakah alat yang bisa membantu saya? Adakah strategi atau tip umum?

ketenangan dlm menghadapi bahaya
sumber

Jawaban:

4

Saya akan menganggap Anda telah merancang API Anda sehingga Anda dapat DI detail DB Anda, jika tidak maka kami dapat membantu Anda melalui itu.

Dalam hal terminologi, Anda ingin menggunakan Uji Ganda Palsu . Dalam kasus khusus ini, saya akan merekomendasikan menggunakan DB dalam-memori yang sama (H2), tetapi gunakan DBUnit untuk bekerja dengan JUnit untuk membuat tabel Anda, mengisi mereka sebelum setiap tes, memotong data setelah setiap tes dan akhirnya teardown tabel setelah TestSuite Anda selesai.

Ada solusi lain seperti Grails dan Spring Roo yang membuat beberapa data uji untuk Anda, tetapi DBUnit akan bekerja untuk Anda sekarang.

Martijn Verburg
sumber
+1 untuk DBUnit. Membuat unit menguji kode DB jadi sangat menyenangkan.
TMN
Keren - Saya pasti akan memeriksanya. Saat ini, saya memberi tahu Hibernate untuk membuat tabel secara otomatis, menggunakan hibernate.hbm2ddl.auto = properti create-drop. Apakah itu akan bekerja dengan DBUnit, atau haruskah saya berhenti melakukan ini?
sangfroid
Ini akan bekerja dengan itu ya - sebenarnya salah satu cara untuk meniru DBUnit adalah dengan hanya memasukkan data sebagai POJO melalui Hibernate
Martijn Verburg
Luar biasa! Oke, saya akan periksa ini.
sangfroid
Juga, apakah perlu menggunakan DI untuk ini? Saat ini saya memiliki persistance.xml di folder / main / resources / META-INF saya yang menentukan server DB acutal saya, dan persisten.xml di folder saya / test / resources / META-INF yang menentukan H2. Ini tampaknya bekerja dengan sangat baik. Secara umum, saya super-ultra-100% bingung tentang Spring - Saya belum pernah menggunakannya sebelumnya dan tidak mengerti bagaimana ini bisa membantu saya di sini, meskipun semua orang mengatakan saya harus menggunakannya.
sangfroid
1

Mungkin Anda akan mendapat manfaat dengan memanfaatkan kerangka kerja mengejek dalam pengujian unit otomatis Anda?

Ada beberapa yang berbeda untuk dipilih:

maple_shaft
sumber
Ya, saya sudah menggunakan Mockito untuk pengujian unit. Tapi saya juga ingin melakukan (integrasi?) Tes yang menjangkau DB.
sangfroid
+1 untuk menyarankan kerangka kerja mengejek atas solusi basis data. Pendekatan database memperkenalkan kompleksitas yang seringkali tidak perlu yang sebagian besar berakhir dengan menguji Hibernate daripada DAO Anda. Juga, saya akan menambahkan JMockit dalam daftar itu - itu melakukan segalanya . String Tidak Berubah? Saya kira tidak.
Gary Rowe
1
Yah, saya harus menyebutkan bahwa saya baru mengenal Hibernate. Jadi sebenarnya penting bagi saya untuk menguji bahwa saya telah melakukan semua hal hibernate saya dengan benar. Juga, sepertinya banyak operasi tidak dapat diuji dengan kerangka kerja mengejek. Misalnya, Anda memiliki metode yang mengembalikan banyak catatan. Bagaimana Anda bisa menguji metode yang benar-benar mengembalikan banyak catatan jika Anda tidak memiliki database untuk melawan?
sangfroid
@sangfroid, Ini poin bagus dan sesuatu yang bisa saya manfaatkan juga. Logika hibernasi dan kueri HQL secara khusus tidak menguji unit dengan baik dalam arti tradisional. Di masa lalu saya bergantung pada tes unit integrasi untuk memverifikasi fungsionalitas tetapi ini hampir selalu spesifik lingkungan dan rapuh. DBUnit disebutkan dalam jawaban sebelumnya dan sepertinya layak dilihat kedua.
maple_shaft
1

Yang benar-benar dapat Anda lakukan adalah bertahan objek dengan tangan atau memiliki database prebuilt yang Anda muat. Anda juga perlu memastikan bahwa database diatur ulang setelah setiap tes.

Dalam sebuah proyek yang sedang saya kerjakan, saya baru mengenal Hibernate, jadi saya memiliki banyak tes untuk hubungan dasar dan operasi kaskade. Menggunakan TestNG, saya memiliki GenericHbTestkelas tempat semua tes Hibernate diperluas. Ini memiliki @BeforeMethodmetode yang mengekspor kembali skema db dan beberapa metode utilitas untuk menghasilkan berbagai objek DAO. Ini memungkinkan saya untuk menyesuaikan lingkungan untuk setiap tes.

Satu-satunya kelemahan untuk mengekspor kembali skema setiap tes adalah bahwa dibutuhkan waktu yang sangat lama untuk menyelesaikan tes yang berjalan. Tetapi saya hanya perlu memastikan bahwa semuanya terpisah dan bersih. Jika Anda lebih berpengalaman dengan Hibernate dan memiliki skema yang lebih stabil maka mengekspor kembali sebelum setiap tes mungkin tidak perlu. Setidaknya meskipun menghapus semua tabel sebelumnya

TheLQ
sumber
1

Sudahkah Anda mempertimbangkan serialisasi objek? Ini adalah metode tercepat dan termudah yang saya gunakan.

Terdiri dari menciptakan status yang Anda inginkan, membuat serial menjadi disk. Anda menggunakan file-file itu untuk mengisi basis data dalam memori yang Anda gunakan untuk pengujian Anda.

Salah satu keuntungannya adalah Anda dapat mengedit file secara manual nanti.

Sebagai alternatif, jika Anda terorganisasi dengan baik dalam pengujian unit Anda, Anda bisa membuat generator objek. Ketika tes dimulai, basis data akan dipakai dan skema diekspor (menggunakan nHibernate). Objek dihasilkan dan diisi dalam database.

Metode ini memiliki keunggulan dibandingkan yang pertama: generator objek Anda berevolusi dengan kode Anda, jadi Anda tidak perlu khawatir tentang file Anda seperti pada saran sebelumnya.


sumber
Memberi +1 untuk pendekatan yang menarik, tetapi mungkin agak rapuh.
Gary Rowe