Saya memiliki kerangka kerja MVC kecil yang telah saya kerjakan. Itu basis kode pasti tidak besar, tetapi tidak lagi hanya beberapa kelas. Saya akhirnya memutuskan untuk mengambil risiko dan mulai menulis tes untuk itu (ya, saya tahu saya harus melakukan itu selama ini, tapi API itu super tidak stabil sampai sekarang)
Bagaimanapun, rencana saya adalah membuatnya sangat mudah untuk diuji, termasuk tes integrasi. Contoh uji integrasi akan menghasilkan sesuatu seperti ini:
Objek permintaan HTTP palsu -> kerangka kerja MVC -> objek respons HTTP -> periksa responsnya benar
Karena ini semua bisa dilakukan tanpa keadaan atau alat khusus (otomatisasi browser dll), saya sebenarnya bisa melakukan ini dengan mudah dengan kerangka kerja unit test biasa (saya menggunakan NUnit).
Sekarang pertanyaan besar. Di mana tepatnya saya harus menarik garis antara tes unit dan tes integrasi? Haruskah saya menguji satu kelas saja (sebanyak mungkin) dengan tes unit? Juga, haruskah pengujian integrasi ditempatkan dalam proyek pengujian yang sama dengan proyek pengujian unit saya?
Jawaban:
Integrasi vs. tes unit
Anda harus menjaga tes unit Anda dan tes integrasi Anda sepenuhnya terpisah Unit test Anda harus menguji satu hal dan satu hal saja dan dalam isolasi lengkap dari sisa sistem Anda. Unit didefinisikan secara longgar tetapi biasanya bermuara pada suatu metode atau fungsi.
Masuk akal untuk memiliki tes untuk setiap unit sehingga Anda tahu algoritma mereka diterapkan dengan benar dan Anda segera tahu apa yang salah di mana, jika implementasi cacat.
Karena Anda menguji dalam isolasi lengkap saat pengujian unit, Anda menggunakan objek rintisan dan tiruan untuk berperilaku seperti aplikasi lainnya. Di sinilah tes integrasi masuk. Menguji semua unit dalam isolasi itu bagus tetapi Anda perlu tahu apakah unit tersebut benar-benar bekerja bersama.
Ini berarti mengetahui apakah suatu model benar-benar disimpan dalam database atau jika peringatan benar-benar dikeluarkan setelah algoritma X gagal.
Pengembangan yang digerakkan oleh tes
Mengambil langkah mundur dan melihat Test Driven Development (TDD) ada beberapa hal yang perlu dipertimbangkan.
Integrasi dulu vs Integrasi lalu
Tes integrasi masuk ke dalam siklus TDD ini dalam salah satu dari dua cara. Saya tahu orang-orang yang suka menulisnya sebelumnya. Mereka menyebut tes integrasi tes end-to-end dan mendefinisikan tes ujung ke ujung sebagai tes yang benar-benar menguji seluruh jalur usecase (pikirkan untuk menyiapkan aplikasi, bootstrap, pergi ke controller, menjalankannya, memeriksa hasil, keluaran, dll ...). Kemudian mereka mulai dengan tes unit pertama mereka, membuatnya lulus, menambahkan kedua, membuatnya lulus, dll ... Perlahan-lahan semakin banyak bagian dari lulus uji integrasi juga hingga fitur selesai.
Gaya lainnya adalah membangun uji unit fitur dengan uji unit dan menambahkan tes integrasi yang dianggap perlu sesudahnya. Perbedaan besar antara keduanya adalah bahwa dalam hal uji integrasi terlebih dahulu Anda harus memikirkan desain aplikasi. Jenis ini tidak setuju dengan premis bahwa TDD adalah tentang desain aplikasi dan juga tentang pengujian.
Kepraktisan
Di pekerjaan saya, kami memiliki semua tes kami di proyek yang sama. Namun ada beberapa kelompok berbeda. Alat integrasi berkelanjutan menjalankan apa yang ditandai sebagai unit test terlebih dahulu. Hanya jika yang berhasil adalah pengujian integrasi yang lebih lambat (karena mereka membuat permintaan nyata, menggunakan database nyata, dll) juga dijalankan.
Kami biasanya menggunakan satu file tes untuk satu kelas.
Bacaan yang disarankan
sumber
Apa yang penting dalam setiap strategi pengujian, adalah Cakupan Tes - yaitu mampu menunjukkan bahwa semua fungsionalitas sedang diuji.
Saya umum, dan kecuali Anda memiliki persyaratan khusus yang bertentangan (mis. DO178 Level A, IEC61508 SIL 4 dll) yang tampaknya tidak menjadi kasus dalam situasi Anda, maka jika Anda dapat menguji fungsi penuh dari kelas atau modul (dan menunjukkan bahwa Anda memiliki) pada level sistem, maka pengujian level sistem memadai. Dan seterusnya. Pengujian unit hanya diperlukan bila Anda belum membahas pengujian lebih lanjut.
Mengingat pengujian integrasi biasanya lebih mudah, lebih cepat dan lebih murah, tarik garis sejauh yang Anda bisa ...
Tergantung pada ruang lingkup, sekali lagi ... menurut definisi, uji unit menguji satu unit. Tetapi jika Anda dapat sepenuhnya menguji modul penuh dalam sekali jalan, maka jika Anda mau, lakukanlah. Anda sebenarnya memenuhi beberapa tes unit dalam satu pukulan.
Tidak ada alasan mendasar mengapa tidak ... kecuali pengujian tingkat yang lebih tinggi dilakukan oleh penguji independen, di mana Anda hanya harus mengeluarkan instrumentasi yang dapat dieksekusi dan minimal.
sumber
Ketika saya memiliki proyek kecil saya hanya memasukkan semua tes ke proyek yang sama. Karena proyek yang lebih besar akan memiliki perpecahan ini saya hanya memastikan bahwa itu mungkin untuk menggoda mereka jika diperlukan.
Dengan tes unit, saya biasanya hanya menguji satu kelas (SUT) dalam file.
sumber