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 A
dan B
keduanya menggunakan komponen C
. Namun A
dan B
memiliki persyaratan yang sedikit berbeda untuk, dan membuat asumsi yang sedikit berbeda C
. Jika saya adalah pengembang tentang A
bagaimana dan di mana saya menguji asumsi saya C
?
Jelas pengujian unit A
dengan asumsi yang diejek tentang C
itu baik untuk pengujian A
secara terpisah, tetapi itu tidak menguji asumsi itu sendiri.
Kemungkinan lain adalah menambahkan unit test untuk C
. Namun ini tidak ideal karena, sementara A
dalam pengembangan, mengubah tes C
dengan asumsi yang berkembang dari A
akan terlalu canggung. Memang A
pengembang 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 B
bergantung pada C
untuk membaca file (antara lain) dan menyimpan konten file dalam objek yang diteruskan C
. Pada awalnya semua file yang C
menangani berukuran kecil dan dapat dibaca secara serempak tanpa pemblokiran yang signifikan. Namun pengembang B
menyadari bahwa file-nya semakin besar dan perlu beralih C
ke async read. Ini menghasilkan bug sinkronisasi sporadis A
, yang masih berasumsi C
sedang 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 A
unit test karena A
asumsi itu diejek. Namun itu bisa dengan mudah ditangkap oleh tes integrasi "mini" yang latihan adil A
dan 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 A
dan C
untuk 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?
Jawaban:
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,
sumber