Apa keuntungan nyata untuk Tes Unit yang tepat dari Tes Fungsional yang disebut tes unit

9

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?

Jackie
sumber
3
Mungkin kode yang Anda tulis dapat mengambil manfaat dari beberapa perubahan struktural agar lebih mudah diuji. Kami menggunakan pengujian unit secara luas di fasilitas kami tanpa kerangka kerja yang mengejek, dan tampaknya bekerja cukup baik bagi kami.
Robert Harvey
Wow saya terkesan saya akan tertarik melihat bagaimana Anda mengelola ini dengan integrasi JAR pihak ketiga. Apakah Anda punya contoh atau tautan?
Jackie
1
Kami tidak menggunakan integrasi JAR pihak ketiga. :) Kami, bagaimanapun, membuat bertopik, sesuai kebutuhan; kerangka kerja mengejek hanyalah kenyamanan untuk mencapai hal yang sama. Namun, jika proses itu terbukti terlalu sulit, kami memikirkan kembali pendekatan pengkodean kami.
Robert Harvey

Jawaban:

8
  • 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.

Roc Martí
sumber
4

Pertanyaan saya adalah, apa manfaat nyata dunia nyata dari pengujian unit yang tepat yang dapat saya gunakan untuk mendorong kembali?

Tes unit yang baik adalah (per Kode Bersih, dan di tempat lain):

  • Cepat
  • Independen
  • Diulang
  • Memvalidasi sendiri
  • Tepat waktu

Tidak memiliki unit test yang benar melanggar tiga yang pertama (dan biasanya yang terakhir). Ini mengarah ke beberapa masalah yang cukup signifikan:

  1. Tes Anda lambat. Tes lambat jarang dilakukan. Tes yang tidak berjalan hampir tidak berguna.
  2. Tes Anda dapat gagal karena alasan yang tidak terkait dengan kode yang Anda uji. Ini membuatnya lebih sulit untuk mengetahui mengapa tes gagal, membuang-buang waktu dan mengarahkan orang untuk menyalahkan lingkungan daripada kode.
  3. Ketika database berubah, hasil Anda berubah. Mendapatkan beberapa basis data dalam kondisi yang diketahui konsisten, terpelihara dengan baik untuk tes itu membosankan, menjengkelkan dan rawan kesalahan.

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.

Telastyn
sumber
2

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.

mattnz
sumber
Saya pasti bisa melihat dari mana Anda berasal dari sini, namun, saya lebih mencari bagaimana membuat kasus bisnis ini. Tidak hanya itu mengkhawatirkan kualitas pada margin adalah biaya mahal.
Jackie
1

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.

Ryathal
sumber
Tidak persis ini bukan bahan kerangka kerja dan lebih merupakan bahan memungkinkan tes untuk mengakses sumber daya lain. Dengan demikian pada dasarnya membuat mereka tes fungsional bukan tes unit. "Kerangka kerja" keduanya JUnit dan EasyMock (Meskipun versi yang lebih lama). Saya menyarankan menambahkan kerangka kerja BARU yang tergantung.
Jackie
1

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).

TMN
sumber