Menguji kesenjangan antara unit dan integrasi: Integrasi dalam Tes Integrasi Kecil, Komponen, Unit

9

Selama beberapa minggu terakhir saya telah merenungkan dan meneliti bagaimana mengisi celah dalam metodologi pengujian kami. Secara sederhana tes unit terlalu kecil dan tes integrasi tradisional terlalu besar.

Skenario yang sering muncul di mana Adan Bkeduanya menggunakan komponen C. Namun Adan Bmemiliki persyaratan yang sedikit berbeda untuk, dan membuat asumsi yang sedikit berbeda C. Jika saya adalah pengembang tentang Abagaimana dan di mana saya menguji asumsi saya C?

Jelas pengujian unit Adengan asumsi yang diejek tentang Citu baik untuk pengujian Asecara terpisah, tetapi itu tidak menguji asumsi itu sendiri.

Kemungkinan lain adalah menambahkan unit test untuk C. Namun ini tidak ideal karena, sementara Adalam pengembangan, mengubah tes Cdengan asumsi yang berkembang dari Aakan terlalu canggung. Memang Apengembang bahkan mungkin tidak memiliki akses yang memadai ke tes unit C(misalnya perpustakaan eksternal).

Untuk membingkai ini dengan contoh yang lebih konkret: Asumsikan bahwa ini adalah aplikasi simpul. A, dan Bbergantung pada Cuntuk membaca file (antara lain) dan menyimpan konten file dalam objek yang diteruskan C. Pada awalnya semua file yang Cmenangani berukuran kecil dan dapat dibaca secara serempak tanpa pemblokiran yang signifikan. Namun pengembang Bmenyadari bahwa file-nya semakin besar dan perlu beralih Cke async read. Ini menghasilkan bug sinkronisasi sporadis A, yang masih berasumsi Csedang membaca file secara sinkron.

Ini adalah jenis bug yang terkenal sulit dilacak dari tes integrasi penuh, dan mungkin tidak terperangkap dalam tes integrasi sama sekali. Ini juga tidak ditangkap oleh Aunit test karena Aasumsi itu diejek. Namun itu bisa dengan mudah ditangkap oleh tes integrasi "mini" yang latihan adil Adan C.

Saya hanya menemukan beberapa referensi untuk jenis pengujian ini. Integrasi dalam Kecil , Komponen Integrasi Pengujian , Satuan Integrasi Testing. Ini juga berhubungan dengan arah pengujian BDD daripada pengujian unit TDD formal.

Bagaimana cara saya mengisi celah pengujian ini? Khususnya - di mana saya bisa melakukan tes semacam itu? Bagaimana cara mengejek input Adan Cuntuk tes integrasi "mini"? Dan berapa banyak upaya yang harus dilakukan untuk memisahkan masalah pengujian antara tes ini dan tes unit? Atau ada cara yang lebih baik untuk mengisi celah pengujian?

mjhm
sumber
1
sudahkah Anda mempertimbangkan untuk membuat versi modul AC dan menggunakan beberapa bentuk manajemen ketergantungan?
miraculixx
1
@gnat Terima kasih atas tipnya. Saya membuat pertanyaan itu tidak terlalu kabur.
mjhm
@miraclixx Terima kasih atas saran Anda. Bisakah Anda menguraikan? Jika Anda bermaksud sesuatu seperti blog.nodejitsu.com/package-dependencies-done-right - Saya pikir ini memecahkan masalah yang berbeda dari yang saya tanyakan. Komponen yang saya maksudkan umumnya terlalu kecil untuk versi independen sebagai modul simpul - misalnya file Model atau Komponen pengontrol. Selain itu, versi hanya memberikan petunjuk tentang keamanan dan sumber kegagalan, daripada pengujian eksplisit untuk masalah tertentu.
mjhm

Jawaban:

6

Tampak bagi saya bahwa Anda memiliki masalah mendasar dengan komponen Anda.

C harus melakukan apa yang perlu dilakukan C, dan diuji, didokumentasikan dan dirancang untuk melakukan hal itu. Ketika Anda memiliki situasi di mana C dirancang untuk "melakukan apa yang B inginkan", Anda memiliki hubungan yang kasar, yang menjadi sangat jelas ketika A datang dan ingin C melakukan sesuatu yang sedikit berbeda.

Apa yang seharusnya tidak Anda lakukan adalah pengujian unit C dalam konteks A, dan terutama bukan A dalam konteks C - Anda menguji A secara independen, dan Anda memberikan hasil C yang mengejek ke A. Jika versi dunia nyata dari C tidak memberikan hasil yang sama, maka Anda memiliki bug atau cacat desain di C yang akan tertangkap ketika Anda melakukan tes integrasi besar Anda. Pengujian unit selalu seperti ini - Anda tidak dapat menguji satu unit dengan menguji unit lain secara bersamaan. Pengujian unit tidak dirancang untuk melakukan itu.

Tes integrasi tidak harus menjadi "seluruh program", meskipun mereka sering dibuat seperti itu. Mereka bisa menjadi rig uji yang menjalankan A dan C bersama-sama tanpa menjalankan sisa program (atau sesedikit itu Anda bisa lolos). Pada titik ini saya tidak bisa memberi saran lebih lanjut karena tergantung apa yang komponen-komponen ini lakukan dan bagaimana mereka berinteraksi dengan sisa program Anda, tetapi biasanya Anda bisa menulis test rig yang menyediakan cakupan pengujian kedua komponen. Apakah sepadan dengan usaha untuk melakukan itu, atau apakah lebih efisien untuk menguji integrasi seluruh program sebagai satu (bahkan jika Anda menjalankan subset dari tes integrasi) adalah sesuatu yang hanya dapat Anda jawab. Sebagian besar tes integrasi terdiri dari banyak bagian sehingga mudah-mudahan Anda dapat menjalankan hanya yang relevan dengan 2 komponen ini (dan jika tidak,

gbjbaanb
sumber
Ya, itulah yang saya pikirkan. Ini di luar ruang lingkup dan tujuan pengujian unit. Sayangnya saya tidak hidup di dunia perangkat lunak di mana komponen dependen dirancang, diuji, dan didokumentasikan dengan sempurna. Dan apa yang sedikit pengujian integrasi yang kami miliki umumnya ujung ke ujung dan ditangani oleh spesialis QA, daripada pengembang sumber. Seperti yang Anda duga ada masalah manajemen dan organisasi dalam campuran.
mjhm
Saya kira Anda harus menambahkan tes integrasi Anda sendiri, tetapi menyebutnya tes unit, "kami unit menguji modul login pelanggan" saat Anda menjalankan mentimun atau selenium.
gbjbaanb