Di tempat kerja, salah satu proyek saya kebanyakan tentang mengambil data yang diteruskan dari klien eksternal dan bertahan dalam database. Ini adalah aplikasi Java enterprise yang menggunakan JPA dan sebagian besar logika kami berkisar pada operasi CRUD.
Mayoritas bug kami melibatkan JPA dengan satu atau lain cara.
- Contoh 1: Jika Anda mengklik tombol simpan dua kali, JPA mungkin mencoba memasukkan entitas yang sama ke dalam database untuk kedua kalinya, menyebabkan pelanggaran kunci primer.
- Contoh 2: Anda mengambil entitas dari database, mengeditnya dan mencoba memperbarui datanya. JPA dapat mencoba membuat instance baru alih-alih memperbarui yang lama.
Seringkali solusinya perlu menambah / menghapus / mengubah anotasi JPA. Lain waktu ada hubungannya dengan memodifikasi logika DAO.
Saya tidak tahu bagaimana cara mendapatkan kepercayaan pada kode kami menggunakan unit test dan TDD. Saya tidak yakin apakah itu karena unit test dan TDD cocok, atau jika saya mendekati masalahnya salah.
Tes unit sepertinya tidak cocok karena saya hanya dapat menemukan masalah ini saat runtime dan saya perlu menggunakan server aplikasi untuk mereproduksi masalah. Biasanya database perlu dilibatkan yang saya anggap berada di luar definisi uji unit: Ini adalah tes integrasi.
TDD sepertinya kurang pas karena putaran + tes umpan balik sangat lambat sehingga membuat saya sangat tidak produktif. Putaran umpan balik penerapan + pengujian membutuhkan waktu lebih dari 3 menit, dan itu hanya jika saya menjalankan tes secara khusus tentang kode yang saya tulis. Untuk menjalankan semua tes integrasi, dibutuhkan 30+ menit.
Ada kode di luar cetakan ini dan saya selalu menguji unit kapan pun saya bisa. Tetapi sebagian besar bug kami dan time sink terbesar selalu melibatkan JPA atau database.
Ada pertanyaan lain yang serupa , tetapi jika saya mengikuti saran saya akan membungkus bagian yang paling tidak stabil dari kode saya (JPA) dan menguji semuanya kecuali itu. Dalam konteks pertanyaan saya, saya akan berada dalam situasi buruk yang sama. Apa langkah selanjutnya setelah membungkus JPA? IMO pertanyaan itu (mungkin) langkah untuk menjawab pertanyaan saya, tetapi bukan jawaban untuk itu.
sumber
unit testing != TDD
)Jawaban:
Salah satu opsi adalah menggunakan database pengujian di-memori seperti H2 ; ini cenderung sekitar 10x lebih cepat dari database menggunakan disk standar, dan dengan waktu startup / teardown yang lebih rendah.
Apakah itu akan membantu memang sangat tergantung pada apakah masalah JPA yang Anda alami cukup umum sehingga mereka akan gagal pada database yang berbeda. Tidak banyak gunanya menjalankan tes lebih cepat jika mereka melewatkan sebagian besar masalah.
Tetapi jika Anda dapat melakukan 10 kali berjalan dengan H2 untuk setiap orang dengan sistem penuh, itu bisa membuahkan hasil.
sumber
Database bisa sangat mudah untuk unit test - Anda memerlukan prosedur dan transaksi yang tersimpan.
Ini yang dikatakan Microsoft tentang pengujian unit Database . Anda juga dapat menjalankan tes unit terhadap basis data, menulis tes Anda di Java atau C # dengan mengatur koneksi DB, memulai transaksi, menulis data apa pun yang ingin Anda gunakan untuk tes ke DB, menjalankan tes dan kemudian rollback. Tidak ada kerusakan pada DB jika Anda menggunakannya, Anda juga menggunakan dan Anda mendapatkan tes sepenuhnya terisolasi.
Semoga ini bisa memberi Anda wawasan bagaimana melakukannya dalam kerangka kerja Anda.
sumber
Orang lain telah menjawab dengan "Mock out DB Anda!" - tapi apa gunanya mengejek lapisan DB Anda jika Anda benar-benar perlu menguji bagaimana itu berinteraksi dengan kode Anda?
Apa yang Anda cari adalah tes integrasi dan / atau tes UI otomatis. Anda menyebutkan bahwa masalah terjadi ketika:
Satu-satunya cara untuk menguji ini adalah dengan menulis tes UI otomatis untuk mengklik tombol dua kali. Mungkin periksa Selenium.
Anda mungkin juga akan membutuhkan unit pengujian DB dan untuk pengujian Anda arahkan ke sana. Rasa sakit untuk dipertahankan tetapi selamat datang di TDD di dunia nyata.
sumber
Dalam contoh yang Anda berikan dalam pertanyaan Anda, Anda tidak dapat menguji unit / TDD jalan Anda ke dalam situasi mengklik tombol dua kali untuk menyebabkan kesalahan dengan sangat mudah. Tetapi apa yang dapat Anda uji unit adalah bahwa dalam kode yang dipanggil ketika Anda mengklik tombol, jika Anda mendapatkan pengecualian dari lapisan kegigihan Anda menanganinya dengan tepat (dengan mengejek lapisan persistensi atau dengan menggunakan database dalam memori sebagai telah disarankan dalam jawaban lain) - baik dengan memikirkan kembali atau menampilkan kesalahan atau apa pun.
Anda benar bahwa TDD dapat mulai mogok ketika Anda perlu melakukan tes yang tidak cocok untuk tes unit (yaitu tes integrasi / sistem) - ini membentuk cukup banyak diskusi dalam "Is TDD" baru-baru ini. Mati?" perdebatan antara Kent Beck, Martin Fowler dan David Heinemeier Hansson: http://martinfowler.com/articles/is-tdd-dead/
sumber