Sebuah proyek yang sedang saya kerjakan memiliki banyak tes warisan yang tidak diejek dengan benar. Karena ini satu-satunya dependensi yang dimilikinya adalah EasyMock, yang tidak mendukung statika, konstruktor dengan argumen, dll. Tes ini bergantung pada koneksi basis data dan semacamnya untuk "menjalankan" tes. Menambahkan powermock untuk menangani kasus-kasus ini ditembak karena biaya mahal karena kebutuhan untuk meningkatkan proyek yang ada untuk mendukungnya (Diskusi lain).
Pertanyaan saya adalah, apa manfaat nyata dunia nyata dari pengujian unit yang tepat yang dapat saya gunakan untuk mendorong kembali? Apakah ada? Apakah saya hanya menjadi ngotot dengan mengatakan bahwa tes unit buruk (bahkan jika mereka bekerja) buruk? Apakah cakupan kode sama efektifnya?
sumber
Jawaban:
Sumber daya
Anda memerlukan database pengujian untuk menjalankan tes. Perangkat keras untuk menjalankan database lebih mahal daripada menggunakan powermock. Melepaskan sumber daya yang digunakan untuk pengujian unit terhadap database berarti perusahaan tidak perlu segera memperbarui server.
Keandalan
Tes dapat gagal karena basis data turun atau dalam kondisi tidak konsisten. Coba tebak, build Anda gagal karena DBA menurunkan dev server pada siang hari untuk melakukan beberapa upgrade (dan sekarang pengembang mencoba untuk mencari tahu apa yang salah dalam kode - ketika bukan kode).
Perawatan tambahan
Tes dapat dijalankan dalam urutan apa pun. Menambah atau menghapus tes seharusnya tidak menyebabkan suite tes gagal. Berlari melawan basis data berarti ada beberapa keadaan di suatu tempat (dalam basis data). Biasanya, tes-tes ini memerlukan pemeliharaan ekstra untuk memastikan bahwa database mempertahankan kondisi yang tepat untuk menjalankan tes berikutnya.
Konkurensi
Dua pengembang menjalankan pengujian unit pada saat bersamaan. Memiliki basis data berarti bahwa tes dapat bertabrakan dengan basis data. Solusi untuk ini adalah dengan mengkloning database untuk setiap tes yang dijalankan, yang merupakan penghalang pada database nyata. Yang mengarah ke opsi lain untuk dipertimbangkan.
Pertimbangkan juga menggunakan HSQLDB dengan dialek database apa pun yang Anda gunakan. Dengan cara ini seseorang dapat membuat basis data dalam memori untuk setiap tes. Tes unit berjalan, membangun database yang diperlukan, memuat data, koneksi database dari kode terhubung ke HSQLDB dan berjalan melawan data uji.
sumber
Tes unit yang baik adalah (per Kode Bersih, dan di tempat lain):
Tidak memiliki unit test yang benar melanggar tiga yang pertama (dan biasanya yang terakhir). Ini mengarah ke beberapa masalah yang cukup signifikan:
Secara umum, kurangnya isolasi dalam tes unit mengarah ke tes yang lebih buruk yang membutuhkan waktu lebih lama untuk menulis, lebih lama untuk berinvestasi, dan kurang memberikan kepercayaan pada basis kode Anda. Yang pada gilirannya menyebabkan orang menulis lebih sedikit tes atau mengabaikan tes lebih banyak yang merupakan spiral ke kekacauan.
sumber
Tes unit hanyalah alat yang digunakan untuk membantu pengembang memberikan kode yang andal. Jika Anda berpikir seperti yang dipikirkan bos Anda, Anda akan dapat meyakinkannya jika apa yang Anda usulkan masuk akal. Namun, jika Anda menyajikannya sebagai penginjil di kereta band, Anda tidak akan mendapatkan sumber daya yang dialokasikan. Anda perlu menjelaskan kepadanya bagaimana dia mendapat manfaat dengan menghabiskan waktu dan sumber daya unit retrofit untuk aplikasi warisan Anda.
Anda menyebutkan tes warisan - yang menyiratkan kode warisan. Sayangnya, pemasangan unit test ke kode yang tidak dirancang untuk diuji unit adalah proses yang sulit, memakan waktu dan mahal. Kasus bisnis menjadi lebih sulit jika Anda memiliki tes yang memberikan hasil yang bermanfaat, dan semua yang akan Anda capai adalah (dari POV kasus bisnis) tes alternatif memberikan hasil yang sama. Anda harus fokus pada penghematan biaya (waktu) .....
Dugaan saya adalah bahwa Anda tidak akan dapat menghadirkan atasan Anda dengan kasus bisnis yang kuat karena tidak ada.
sumber
Dari apa yang Anda gambarkan, sepertinya Anda tidak menyukai kerangka uji A dan ingin beralih ke kerangka uji B, keduanya berfungsi. Mengisapnya dan menggunakan apa yang ada dan bekerja, jangan membuat lebih banyak pekerjaan menciptakan kembali roda sehingga Anda dapat menggunakan kerangka uji pilihan Anda.
Dibutuhkan lebih dari sekadar keinginan untuk menggunakan rasa terbaru dari kerangka kerja bulan untuk membenarkan membuang kode kerja yang ada dan menghabiskan banyak waktu dan uang untuk manfaat yang pada dasarnya nol bagi pengguna.
sumber
Tes unit yang baik memberikan lokalisasi. Tes fungsional mungkin memberi tahu Anda "fungsi tambah pengguna rusak", tetapi tes unit yang baik akan memberi tahu Anda bahwa itu rusak karena seseorang mengubah bidang USER.LAST_NAME dalam database menjadi non-null. Mungkin juga untuk menguji perubahan kecil secara langsung, alih-alih membutuhkan lingkungan pengujian yang rumit (yang mungkin perlu diinisialisasi ulang atau dibersihkan untuk beberapa tes).
sumber