Apa yang dimaksud dengan tes integrasi?

110

Teman-teman saya dan saya telah berjuang untuk mengklasifikasikan dengan tepat apa itu tes integrasi.

Sekarang, dalam perjalanan pulang, saya baru menyadari, bahwa setiap kali saya mencoba memberikan contoh dunia nyata dari tes integrasi, ternyata menjadi tes penerimaan, yaitu. sesuatu yang akan diucapkan oleh pebisnis dengan jelas yang menjelaskan apa yang seharusnya diberikan oleh sistem.

Saya memeriksa dokumentasi Ruby on Rails untuk klasifikasi jenis pengujian ini, dan sekarang saya benar-benar terlempar.

Bisakah Anda memberi saya deskripsi akademis singkat tentang tes integrasi dengan contoh dunia nyata?

Martin Blore
sumber
76
BTW, ketika Anda memiliki frase kata benda ("Saya dan beberapa teman"), Anda harus berhati-hati dalam memilih orang pertama mana yang Anda gunakan. Inilah tesnya. Jatuhkan teman dan lihat apakah masih berfungsi. "Aku telah berjuang" vs "Aku telah berjuang". Tes ini memberi tahu Anda bahwa "Saya dan teman-teman saya ..." Dan - untuk bersikap sopan - kita daftar yang lain terlebih dahulu. "Teman-teman saya dan saya". Pengujian itu penting.
S.Lott
58
Saya pikir S.Lott baru saja memberi Anda tes integrasi tata bahasa> masyarakat.
Jordan

Jawaban:

78

Saat ini saya menyukai pernyataan ini: "Tidak penting apa yang Anda sebut, tetapi apa fungsinya" dibuat oleh Gojko Adzic dalam artikel ini .

Anda benar-benar perlu menentukan dengan orang yang berbicara tentang tes apa yang ingin Anda uji.

Ada banyak orang yang memiliki pandangan berbeda, tergantung pada apa peran mereka.

Untuk penguji metodologi tes yang berlaku umum di Belanda adalah TMap . TMap membuat perbedaan berikut.

  • unit test
  • uji integrasi unit
  • uji sistem
  • uji integrasi sistem
  • tes penerimaan (semua jenis / level)
  • uji penerimaan fungsional
  • tes penerimaan pengguna
  • tes penerimaan produksi

Mereka memiliki jenis tes yang lebih spesifik yang dapat dilakukan dalam tes yang disebutkan di atas. Lihatlah kata doc ini untuk ikhtisar.

Wikipedia juga memiliki ikhtisar yang bagus .

The buku programmer pragmatis mengatakan:

  • tes unit adalah tes yang melatih modul
  • tes integrasi menunjukkan bahwa bagian utama dari sistem bekerja dengan baik bersama-sama

Melihat berbagai sumber ini dan memasukkan beberapa pengalaman dan pendapat saya sendiri, saya akan mulai dengan membuat perbedaan berdasarkan tiga kategori

  • siapa yang melakukan pengujian secara umum
  • apa yang diuji
  • apa tujuan dari tes ini

    • Uji unit : uji logika di kelas oleh pemrogram untuk menunjukkan kebenaran tingkat kode. Mereka harus cepat dan tidak bergantung pada bagian lain dari sistem yang tidak ingin Anda uji
    • Tes penerimaan fungsional : skenario kasus penggunaan pada kumpulan data yang terbatas (dibuat khusus) yang dilakukan oleh departemen pengujian untuk menunjukkan bahwa setiap skenario yang ditentukan berfungsi sebagaimana ditentukan.
    • Tes penerimaan pengguna : skenario kasus penggunaan pada data seperti produksi yang dilakukan oleh perwakilan pengguna untuk membuat mereka secara resmi menerima aplikasi
    • Tes integrasi : Uji jalur komunikasi antara berbagai bagian modul yang dilakukan oleh departemen pengujian atau oleh pengembang untuk menunjukkan bahwa semua modul bekerja dengan benar bersama.

Daftar saya di atas hanyalah permulaan dan saran tetapi saya benar-benar berpikir: "Tidak penting apa yang Anda sebut, tetapi apa artinya"

Semoga ini membantu.

26-10-2016 Sunting: Baru-baru ini pengantar yang sangat bagus ditempatkan pada tes Unit YouTube vs tes Integrasi - Renungan MPJ - FunFunFunction # 55

KeesDijk
sumber
3
+1 Untuk "tidak masalah apa sebutannya". Sayangnya tidak ada definisi universal dari jenis tes apa pun. Bahkan unit-test yang baik adalah sedikit variabel. Apakah menguji DOM untuk aplikasi web dianggap sebagai tes unit? Ada yang bilang ya, ada yang bilang tidak.
Laurent Bourgault-Roy
2
Tautan ke kata doc tidak tersedia.
Paul Rougieux
6
"Tidak penting apa yang Anda sebut" berlaku untuk semua ilmu komputer, dan bahkan hampir semua bidang. Saya menemukan banyak argumen panas yang masuk ke orang-orang dapat diringkas menjadi "kami berdebat tentang definisi frasa sewenang-wenang".
Gardenhead
+1 menyetujui definisi: Saya sudah berada di tempat "Unit Test" ment bahwa programmer mencoba sistem dengan setidaknya satu input sampel ... secara manual ... dan secara visual memeriksa output jika "tampaknya benar" . Tidak ada kontrak untuk apa yang diharapkan, tidak ada input yang dikontrol, dll
Newtopian
Tautan ke Gojko mengembalikan 404. Anda dapat mengakses arsip di sini: web.archive.org/web/20150104002755/http://gojko.net/2011/01/12/…
Eduardo Copat
32

tes integrasi, ternyata menjadi tes penerimaan

Jelas sekali.

Keduanya hampir sama. Tetapi ada beberapa dimensi yang sedikit berbeda dengan definisi tes.

Integrasi == sistem secara keseluruhan.

Penerimaan == sistem secara keseluruhan.

Satu-satunya perbedaan - dan ini halus - adalah definisi dari kasus uji.

Integrasi == uji kasus untuk menguji kedalaman dan tingkat integrasi. Apakah ini bekerja untuk semua kasing tepi dan kasing sudut? Kasus uji cenderung teknis, ditulis oleh desainer dan coders.

Penerimaan == kasus uji hanya untuk menjalankan 80% dari set fitur yang berfokus pada pengguna akhir. Tidak semua kasing tepi dan sudut. Kasus uji cenderung non-teknis, ditulis oleh pengguna akhir.

S.Lott
sumber
7
Satu-satunya hal yang akan saya tambahkan ke sini adalah bahwa tes integrasi juga dapat menguji hanya bagian dari sistem, tetapi lebih dari satu bagian sekaligus. Setiap kali Anda mencari bug yang disebabkan oleh dua atau lebih bagian dari sistem yang bekerja bersamaan (terintegrasi bersama), Anda sedang menguji integrasi. Integrasi berjalan dari dua komponen yang nyata dan segala sesuatu yang lain diejek, ke seluruh rangkaian aplikasi yang bekerja bersama, dan bahkan mungkin lebih jauh lagi dengan memeriksa integrasi dengan aplikasi lain (misalnya, "Bagaimana cara kerja MS Office dengan Internet Explorer?").
Ethel Evans
1
@Ethel Evans: Poin bagus. Tes masih akan buram antara integrasi dan penerimaan, bahkan jika hanya sebagian dari sistem yang terlibat. Pengujian terjadi pada tingkat yang cukup tinggi sehingga penerimaan dan integrasi akan terasa serupa.
S.Lott
3
Tes integrasi tentu tidak (dan mungkin seharusnya tidak) menguji "sistem secara keseluruhan". Di mana saja dua atau lebih komponen diuji bersama, khususnya ketika menguji komponen eksternal (database, jaringan, dll.) Anda melakukan pengujian integrasi. Karena mahalnya pengujian "seluruh sistem" Anda ingin menghindari ini sebanyak mungkin, alih-alih lakukan tes integrasi sistem parsial (lihat Uji piramida
Schneider
1
@ Schneider mengatakannya dengan baik, tes integrasi tidak boleh menguji "sistem secara keseluruhan". Tes semacam itu akan dianggap "tes ujung ke ujung" atau "tes sistem", tergantung pada ruang lingkup yang Anda pertimbangkan dalam proyek Anda. Tes ujung ke ujung mungkin mencakup aliran data "secara keseluruhan" yang berjalan melalui beberapa sistem, dan sistem hanya menguji "satu sistem secara keseluruhan".
RoyB
Inilah cara saya mendefinisikan mereka untuk menghindari kebingungan seputar penggunaan luas tes "Integrasi". Tes unit -> tes unit kerja terkecil, sebuah metode di kelas, yang tidak memanggil kode lain di luar metode itu (mengejek ketergantungan jika diperlukan) Tes integrasi -> tes yang lebih luas dalam lingkup dari tes unit di mana mereka dapat dan harus menguji lapisan aplikasi yang bekerja bersama, tetapi BUKAN seluruh aplikasi dikerahkan di suatu tempat.) Tes Fungsional / tes penerimaan -> tes yang menguji versi aplikasi yang dikerahkan
Kevin M
16

Saya pribadi suka menganggap tes integrasi sebagai tes fitur ketika setiap komponen sistem adalah nyata , tidak ada benda tiruan.

Repositori nyata, basis data nyata, antarmuka nyata. Anda menguji fungsionalitas tertentu ketika sistem sepenuhnya dirakit dan seperti seharusnya saat digunakan.


sumber
4
Saya setuju kecuali itu tidak perlu sistem "sepenuhnya dirakit". Anda dapat (dan harus) melakukan pengujian integrasi dengan himpunan bagian dari sistem lengkap karena ini biasanya lebih murah / mudah.
Schneider
Integrasi antara 2 unit / komponen juga dapat "diuji integrasi" sementara sisanya masih diejek. Oleh karena itu, banyak kerangka pengujian integrasi memungkinkan ejekan :)
RoyB
1
Saya memiliki tes dalam aplikasi Spring Boot yang menguji ujung depan (kontrak api) dalam wadah Spring tetapi mengejek lapisan repositori / data. Jadi itu menggunakan repositori / data mocked, tetapi menggabungkan lapisan controller dan melakukan marshalling jackson, dll. Tes Integrasi.
Kevin M
8

Dalam sedikit pengalaman saya (saya akui), saya mengerti bahwa kata integrasi benar-benar dapat menciptakan kesalahpahaman: sungguh, sulit untuk menemukan sesuatu yang sepenuhnya terisolasi dalam suatu sistem, beberapa elemen pasti memerlukan integrasi.

Jadi, saya terbiasa membuat perbedaan berikut:

  • Saya menggunakan unit test untuk mengidentifikasi, mendokumentasikan dan menekankan semua perilaku yang harus saya capai oleh kelas yang saya uji.
  • Saya melakukan tes integrasi setiap kali saya memiliki komponen (mungkin lebih dari satu) di sistem saya yang sedang melakukan percakapan dengan sistem " eksternal " lainnya. (berlanjut di bawah ...)
  • Saya menerapkan tes penerimaan untuk mendefinisikan, mendokumentasikan dan menekankan alur kerja tertentu yang diharapkan oleh sistem.

Dalam definisi uji integrasi, yang saya maksud adalah sistem eksternal yang berada di luar jangkauan pengembangan saya : Saya tidak dapat segera mengubah cara mereka berperilaku, karena alasan apa pun. Ini bisa berupa perpustakaan, komponen sistem yang tidak dapat diubah (yaitu dibagikan dengan proyek lain di perusahaan), sebuah dbms, dll. Untuk tes ini saya perlu mengatur sesuatu yang sangat mirip dengan lingkungan nyata sistem akan bekerja di: sistem eksternal harus diinisialisasi dan diatur ke keadaan tertentu; data realistis harus didaftarkan di db; dll.

Sebaliknya, ketika saya melakukan pengujian penerimaan, saya memalsukan hal-hal: Saya mengerjakan sesuatu yang berbeda, saya mengerjakan spesifikasi sistem, bukan pada kemampuannya untuk berkolaborasi dengan entitas eksternal.

Ini benar-benar pandangan yang lebih sempit dibandingkan dengan apa yang dijelaskan KeesDijk sebelumnya, namun saya kira proyek yang saya kerjakan sampai sekarang cukup kecil untuk membuat saya tingkat penyederhanaan ini.

Marco Ciambrone
sumber
6

Tes integrasi memverifikasi bahwa komponen-komponen sistem yang kompleks (misalnya perangkat lunak, pesawat terbang, pembangkit listrik) bekerja bersama sebagaimana dirancang.

Mari kita bayangkan kita berbicara tentang pesawat terbang (dengan perangkat lunak lebih abstrak, dan sulit untuk membuat perbedaan). Tes integrasi meliputi, memverifikasi:

  • interaksi yang benar antara beberapa komponen. Contoh: saat menekan tombol start, mesin hidup dan baling-baling mencapai kecepatan rotasi yang diharapkan (pesawat masih tetap di darat)
  • interaksi yang benar dengan komponen eksternal. Contoh: periksa apakah radio tertanam dapat berkomunikasi dengan radio stasioner (pesawat masih di darat)
  • interaksi yang benar antara semua komponen yang terlibat, sehingga sistem secara keseluruhan berfungsi seperti yang diharapkan. Contoh: awak pilot uji coba dan insinyur memulai pesawat, dan terbang bersamanya (mereka semua memakai parasut ...).

The uji integrasi membahas masalah teknis , yaitu bahwa sistem bekerja meskipun subdivisi ke dalam komponen. Dalam perangkat lunak komponen dapat menggunakan kasing, modul, fungsi, antarmuka, perpustakaan, dll ...

The tes penerimaan memverifikasi bahwa produk ini cocok untuk tujuan. Mereka pada prinsipnya dilakukan oleh pelanggan. Mengambil analogi pesawat, mereka termasuk memverifikasi bahwa:

  • skenario bisnis yang dibayangkan mengarah pada hasil yang diharapkan dalam situasi yang hampir nyata. Contoh: berlatihlah naik dengan penumpang uji untuk memeriksa bahwa staf dapat memantau naik seperti yang diharapkan dengan prosedur operasi. Beberapa skenario bisa sangat sederhana sehingga akan terlihat seperti unit test, tetapi dilakukan oleh pengguna (misalnya coba colokan listrik dengan peralatan perusahaan).
  • sistem bekerja dalam situasi bisnis yang hampir nyata. Contoh: buat penerbangan uji kosong antara dua tujuan nyata, dengan pilot yang baru dilatih dari maskapai untuk memeriksa konsumsi bahan bakar yang dijanjikan.

The tes penerimaan membahas lebih masalah tanggung jawab . Dalam hubungan klien / pemasok itu bisa menjadi tanggung jawab kontraktual (kepatuhan dengan semua persyaratan). Tetapi bagaimanapun juga itu adalah tanggung jawab organisasi yang menggunakan untuk memastikan bahwa tugas mereka dapat dijalankan dengan sistem dan untuk mencegah masalah yang tidak terduga (misalnya seperti perusahaan kereta api ini yang menemukan selama tes penerimaan bahwa mereka harus mempersingkat quais karena gerbong baru 5 cm terlalu besar - jangan bercanda!).

Kesimpulan: Tes integrasi dan penerimaan tumpang tindih. Mereka berdua bermaksud menunjukkan bahwa sistem itu secara keseluruhan berfungsi. Namun "keseluruhan" bisa lebih besar untuk pelanggan (karena sistem itu sendiri dapat menjadi bagian dari sistem organisasi yang lebih besar), dan lebih teknis untuk integrator sistem:

masukkan deskripsi gambar di sini

Christophe
sumber
1

Pengujian integrasi tidak lain adalah mengecek koneksi dan kebenaran aliran data antara dua modul.

Sebagai Contoh: Ketika kami menulis email (satu modul) dan mengirimkannya ke beberapa ID pengguna yang valid (modul kedua), pengujian integrasi adalah untuk memeriksa apakah email yang dikirim ada di item yang dikirim.

Anita
sumber
3
Selamat Datang di Programmer. Apa yang ditambahkan jawaban Anda yang belum disediakan oleh jawaban yang ada? Programmers.SE tidak seperti forum tradisional. Ini berfokus pada T&J berkualitas tinggi daripada banyak obrolan. Silakan lihat halaman tur untuk informasi lebih lanjut tentang bagaimana situs beroperasi.
0

Salah satu definisi praktis dari tes integrasi adalah: Setiap tes yang memerlukan interaksi dengan sesuatu di luar proses.

Sebagai contoh:

  • Sistem file
  • Jaringan
  • Database
  • API eksternal

Ada semacam kontrak antara proses Anda dan dunia eksternal, dan minimal memverifikasi bahwa kontrak harus menjadi tujuan dari tes integrasi. yaitu harus melakukan tidak lebih dari memverifikasi kontrak. Jika ya maka Anda bergerak menuju ruang sistem / ujung ke ujung.

Unit test dapat menguji semua logika dalam batas proses Anda, dan mereka dapat melakukannya dengan mudah justru karena kurangnya ketergantungan pada lambat / rapuh / kompleks "dunia luar".

Sementara ada tes integrasi definisi ini tidak mencakup (karenanya mengapa saya menyebutnya definisi praktis ) Saya pikir mereka jauh lebih umum / berguna.

NB Sebenarnya, ya definisi ini akan mencakup pengujian sistem / ujung-ke-ujung juga. Dalam filosofi saya mereka adalah bentuk uji integrasi 'ekstrem', karenanya mengapa nama mereka menekankan aspek lain. Di arah lain, tes unit dapat dianggap sebagai tes integrasi komponen nol yaitu Semua tes dapat dianggap berada di suatu tempat pada spektrum integrasi, mengintegrasikan antara komponen 0-n :-)

Schneider
sumber
Ketika Anda memiliki dua unit, Anda menguji masing-masing dengan unit test. Ketika kedua unit terintegrasi satu sama lain, Anda menguji integrasi dengan tes integrasi. Mereka tidak harus "keluar dari proses", dan jenis tes ini sangat umum.
Bryan Oakley
Anda sepenuhnya benar - hal-hal tidak harus keluar dari proses untuk menjadi tes integrasi. Itu sebabnya saya berusaha menjelaskan bahwa jawaban saya lebih merupakan "aturan praktis" (tetapi mungkin gagal). Saya tidak setuju bahwa tes integrasi antar unit "sangat umum" sekalipun. Tes integrasi tanpa proses jauh lebih umum dalam pengalaman saya dan seringkali sangat berharga, oleh karena itu jawaban saya menekankan aspek pengujian integrasi.
Schneider