Apa perbedaan antara tes unit, fungsional, penerimaan, dan integrasi? [Tutup]

799

Apa perbedaan antara pengujian unit, fungsional, penerimaan, dan integrasi (dan jenis tes lain yang gagal saya sebutkan)?

Andrew
sumber
1
Lihat juga sqa.stackexchange.com/a/23396/8992
Michael Durrant
1
Saya pikir Anda lupa memasukkan pengujian beban!
Bicara Murah Tunjukkan kode

Jawaban:

1350

Tergantung di mana Anda melihat, Anda akan mendapatkan jawaban yang sedikit berbeda. Saya sudah banyak membaca tentang subjek ini, dan inilah distilasi saya; sekali lagi, ini sedikit berbulu dan yang lain mungkin tidak setuju.

Tes Unit

Menguji unit fungsi terkecil, biasanya metode / fungsi (mis. Diberi kelas dengan status tertentu, memanggil metode x pada kelas harus menyebabkan y terjadi). Tes unit harus difokuskan pada satu fitur tertentu (misalnya, memanggil metode pop ketika stack kosong harus melempar a InvalidOperationException). Segala sesuatu yang disentuhnya harus dilakukan dalam memori; ini berarti bahwa kode uji dan kode yang sedang diuji tidak boleh:

  • Panggil ke kolaborator (non-sepele)
  • Akses jaringan
  • Memukul database
  • Gunakan sistem file
  • Putar utas
  • dll.

Segala jenis ketergantungan yang lambat / sulit dipahami / diinisialisasi / dimanipulasi harus dihapus / diolok-olok / apa pun menggunakan teknik yang sesuai sehingga Anda dapat fokus pada apa yang dilakukan unit kode, bukan apa yang dilakukan ketergantungannya.

Singkatnya, tes unit sesederhana mungkin, mudah di-debug, andal (karena faktor eksternal berkurang), cepat dieksekusi dan membantu membuktikan bahwa blok bangunan terkecil dari fungsi program Anda sebagaimana dimaksudkan sebelum disatukan. Peringatannya adalah bahwa, meskipun Anda dapat membuktikan bahwa mereka bekerja dengan sempurna dalam isolasi, unit kode mungkin meledak ketika digabungkan yang membawa kita ke ...

Tes Integrasi

Tes integrasi dibangun berdasarkan pengujian unit dengan menggabungkan unit kode dan pengujian yang menghasilkan kombinasi berfungsi dengan benar. Ini bisa berupa jeroan dari satu sistem, atau menggabungkan beberapa sistem bersama untuk melakukan sesuatu yang bermanfaat. Juga, hal lain yang membedakan tes integrasi dari tes unit adalah lingkungan. Tes integrasi dapat dan akan menggunakan utas, mengakses database atau melakukan apa pun yang diperlukan untuk memastikan bahwa semua kode dan perubahan lingkungan yang berbeda akan bekerja dengan benar.

Jika Anda telah membuat beberapa kode serialisasi dan unit menguji jeroan tanpa menyentuh disk, bagaimana Anda tahu itu akan berfungsi ketika Anda memuat dan menyimpan ke disk? Mungkin Anda lupa menyiram dan membuang aliran file. Mungkin izin file Anda salah dan Anda telah menguji jeroan menggunakan dalam aliran memori. Satu-satunya cara untuk mengetahui dengan pasti adalah mengujinya 'nyata' menggunakan lingkungan yang paling dekat dengan produksi.

Keuntungan utama adalah bahwa mereka akan menemukan bug yang tidak dapat diuji unit seperti bug pengkabelan (misalnya turunan kelas A yang secara tak terduga menerima turunan nol dari B) dan bug lingkungan (berfungsi dengan baik pada mesin CPU-tunggal saya, tetapi saya 4 mesin inti kolega tidak dapat lulus tes). Kerugian utama adalah bahwa tes integrasi menyentuh lebih banyak kode, kurang dapat diandalkan, kegagalan lebih sulit untuk didiagnosis dan tes lebih sulit untuk dipertahankan.

Selain itu, tes integrasi tidak serta merta membuktikan bahwa fitur lengkap berfungsi. Pengguna mungkin tidak peduli dengan detail internal program saya, tapi saya tahu!

Tes Fungsional

Tes fungsional memeriksa fitur tertentu untuk kebenaran dengan membandingkan hasil untuk input yang diberikan terhadap spesifikasi. Tes fungsional tidak berkaitan dengan hasil antara atau efek samping, hanya hasilnya (mereka tidak peduli bahwa setelah melakukan x, objek y memiliki status z). Mereka ditulis untuk menguji bagian dari spesifikasi seperti, "memanggil fungsi Square (x) dengan argumen 2 mengembalikan 4".

Tes Penerimaan

Pengujian penerimaan tampaknya dibagi menjadi dua jenis:

Pengujian penerimaan standar melibatkan pengujian pada sistem lengkap (mis. Menggunakan halaman web Anda melalui browser web) untuk melihat apakah fungsionalitas aplikasi memenuhi spesifikasi. Misalnya "mengklik ikon zoom harus memperbesar tampilan dokumen hingga 25%." Tidak ada rangkaian hasil yang nyata, hanya hasil yang gagal atau gagal.

Keuntungannya adalah bahwa pengujian dijelaskan dalam bahasa Inggris dan memastikan perangkat lunak, secara keseluruhan, fitur lengkap. Kerugiannya adalah Anda telah memindahkan level lain ke atas piramida pengujian. Tes penerimaan menyentuh kumpulan kode, sehingga melacak kegagalan bisa jadi rumit.

Juga, dalam pengembangan perangkat lunak yang gesit, pengujian penerimaan pengguna melibatkan pembuatan tes untuk mencerminkan kisah pengguna yang dibuat oleh / untuk pelanggan perangkat lunak selama pengembangan. Jika tes lulus, itu berarti perangkat lunak harus memenuhi persyaratan pelanggan dan cerita dapat dianggap lengkap. Paket tes penerimaan pada dasarnya adalah spesifikasi yang dapat dieksekusi yang ditulis dalam bahasa khusus domain yang menjelaskan tes dalam bahasa yang digunakan oleh pengguna sistem.

Kesimpulan

Mereka semua saling melengkapi. Kadang-kadang menguntungkan untuk fokus pada satu jenis atau untuk menghindari mereka sepenuhnya. Perbedaan utama bagi saya adalah bahwa beberapa tes melihat hal-hal dari perspektif programmer, sedangkan yang lain menggunakan fokus pelanggan / pengguna akhir.

Mark Simpson
sumber
19
+1. @ Markus Simpson Bisakah pengujian fungsional dan penerimaan disimpulkan sebagai "pengujian sistem"? Di mana tes end-to-end cocok? (kosakata yang terlalu berbeda untuk seleraku)
Torsten Engelbrecht
3
@ Franz Saya berbicara tentang kemampuan dan kemudahan yang Anda dapat mengurangi risiko melalui mengisolasi unit kode dan mengujinya. Tapi Anda benar, bahasa yang saya gunakan agak longgar, karena tes tidak dapat membuktikan bahwa kode bebas bug.
Mark Simpson
15
Meskipun suara-up, ini benar-benar salah. Tes unit tidak menguji bahkan kolaborator "sepele"; setiap ketergantungan yang disuntikkan harus diejek. Tes fungsional tidak menguji "perilaku"; mereka hanya menguji "fungsi", yaitu "f (A) mengembalikan B". Jika efek samping itu penting, itu "perilaku". Jika ini termasuk panggilan sistem, itu juga merupakan tes "sistem", seperti pada "tes sistem perilaku". (Lihat testerab @ di bawah.) Tes "Penerimaan" adalah bagian dari "tes sistem perilaku" yang mencakup tumpukan penuh. "Integrasi" menguji ke atas, mensimulasikan penggunaan aktual; ini menguji bahwa semua dependensi dapat diintegrasikan dalam praktik.
cdunn2001
7
@ cdunn2001: Jangan khawatir, kritik yang membangun selalu baik :) Komentar Anda mengajari saya beberapa hal yang tidak saya ketahui dan sedikit membersihkan terminologi saya. Saya selalu ingin mempelajari hal-hal baru dari pengembang yang tertarik pada pengujian. Saya ingat pertama kali saya menemukan blog Miško Hevery - itu seperti harta karun :)
Mark Simpson
11
@ MarkSimpson meskipun jawaban Anda sangat baik saya ingin sedikit lebih detail mengenai tes fungsional. Maksud saya dalam jawaban Anda, bagi saya, sulit untuk membedakan antara tes fungsional dan tes unit. Saya harap Anda punya waktu untuk ini, terus bekerja dengan baik!
Andrei Sandulescu
90

Yang penting adalah Anda tahu apa arti istilah-istilah itu bagi kolega Anda. Kelompok yang berbeda akan memiliki definisi yang sedikit berbeda tentang apa yang mereka maksudkan ketika mereka mengatakan tes "ujung ke ujung", misalnya.

Saya menemukan sistem penamaan Google untuk pengujian mereka baru-baru ini, dan saya lebih suka - mereka memotong argumen dengan hanya menggunakan Small, Medium, dan Large. Untuk menentukan kategori mana yang cocok dengan pengujian, mereka melihat beberapa faktor - berapa lama waktu yang diperlukan untuk menjalankan, apakah itu mengakses jaringan, database, sistem file, sistem eksternal dan sebagainya.

http://googletesting.blogspot.com/2010/12/test-sizes.html

Saya membayangkan perbedaan antara Kecil, Sedang, dan Besar untuk tempat kerja Anda saat ini mungkin berbeda dari Google.

Namun, ini bukan hanya tentang ruang lingkup, tetapi tentang tujuan. Poin Markus tentang perbedaan perspektif untuk tes, misalnya programmer vs pelanggan / pengguna akhir, sangat penting.

testerab
sumber
6
1 untuk hal penamaan tes google karena membantu memberikan sedikit perspektif tentang mengapa berbagai organisasi / orang memiliki definisi yang berbeda untuk tes.
Mark Simpson
Ini juga merupakan artikel yang sangat bagus tentang mengapa Anda akan menggunakan tingkat tes yang berbeda dan apa yang Anda dapatkan darinya: kentcdodds.com/blog/unit-vs-integration-vs-e2e-tests
testerab
63

http://martinfowler.com/articles/microservice-testing/

Posting blog Martin Fowler berbicara tentang strategi untuk menguji kode (Terutama dalam arsitektur layanan mikro) tetapi sebagian besar berlaku untuk aplikasi apa pun.

Saya akan mengutip dari slide rangkumannya:

  • Tes unit - gunakan perangkat lunak terkecil yang dapat diuji dalam aplikasi untuk menentukan apakah berperilaku seperti yang diharapkan.
  • Tes integrasi - memverifikasi jalur komunikasi dan interaksi antara komponen untuk mendeteksi cacat antarmuka.
  • Tes komponen - batasi cakupan perangkat lunak yang dijalankan untuk sebagian dari sistem yang diuji, memanipulasi sistem melalui antarmuka kode internal dan menggunakan uji ganda untuk mengisolasi kode yang sedang diuji dari komponen lain.
  • Tes kontrak - verifikasi interaksi pada batas layanan eksternal yang menyatakan bahwa layanan tersebut memenuhi kontrak yang diharapkan oleh layanan konsumen.
  • Tes ujung ke ujung - verifikasi bahwa suatu sistem memenuhi persyaratan eksternal dan mencapai tujuannya, menguji seluruh sistem, dari ujung ke ujung.
Pepatah
sumber
Omong-omong, artikel yang bagus. Namun saya tidak sepenuhnya mengerti untuk apa tes kontrak itu. Bukankah mereka berlebihan dalam uji komponen dan integrasi?
wheleph
Dalam beberapa bahasa (yang digunakan oleh Pak Fowler), Anda dapat mengimplementasikan antarmuka yang tidak terpapar ketika menggunakan definisi standar suatu kelas misalnya void IMyInterface.MyMethod (). Yang pada gilirannya akan secara logis memiliki tes sendiri. Meskipun pada saat itu Anda sedang menuju kembali ke BDD .. Yang ironisnya Mr Fowler telah memiliki perampasan tanah juga.
Skarsnik
2
itu bukan artikel Fowler btw, hanya diposting di sana. Tes kontrak adalah tes yang dilakukan setelah klien mulai menggunakan layanan Anda, Anda kemudian menulis tes yang memeriksa jika Anda tidak melanggar sesuatu untuk klien tertentu, yaitu mengubah api layanan.
Rafał Łużyński
@pembuh unit, pengujian integrasi dan komponen sebagian besar berbicara untuk internal perangkat lunak yang sangat dikontrol oleh pengembang. Masalah di tiga yang pertama berarti mengubah sumber Anda untuk memperbaiki masalah tersebut. - Tes kontrak menyentuh apa yang dijanjikan kepada Anda dalam fungsi tetapi Anda mungkin tidak dapat mengubah secara langsung dalam menghadapi cacat. Ini membutuhkan penambahan kode dukungan untuk mengatasi masalah-masalah yang mungkin terjadi alih-alih hanya memperbaiki kerusakan. - Jadi Anda akan bekerja di sekitar layanan web memberi Anda kembali json cacat bahkan jika spesifikasi kontrak mengatakan kepada Anda itu dari struktur tertentu.
Yemi Bedu
31

Unit Testing - Seperti namanya, metode ini menguji pada tingkat objek. Komponen perangkat lunak individual diuji untuk setiap kesalahan. Pengetahuan tentang program diperlukan untuk pengujian ini dan kode pengujian dibuat untuk memeriksa apakah perangkat lunak berperilaku sebagaimana mestinya.

Pengujian Fungsional - Dilakukan tanpa sepengetahuan kerja internal sistem. Penguji akan mencoba menggunakan sistem hanya dengan mengikuti persyaratan, dengan memberikan input berbeda dan menguji output yang dihasilkan. Tes ini juga dikenal sebagai pengujian kotak tertutup atau kotak hitam.

Pengujian Penerimaan - Ini adalah tes terakhir yang dilakukan sebelum perangkat lunak diserahkan kepada klien. Hal ini dilakukan untuk memastikan bahwa perangkat lunak yang dikembangkan memenuhi semua persyaratan pelanggan. Ada dua jenis pengujian penerimaan - satu yang dilakukan oleh anggota tim pengembangan, yang dikenal sebagai pengujian penerimaan internal (pengujian Alpha), dan yang lainnya dilakukan oleh pelanggan atau pengguna akhir yang dikenal sebagai (pengujian Beta)

Pengujian Integrasi - Modul individual yang sudah mengalami pengujian unit terintegrasi satu sama lain. Secara umum kedua pendekatan ini diikuti:

1) Top-Down
2) Bottom-Up

Shah
sumber
Apa yang Anda maksud dengan top-down dan bottom-up? Apakah pengujian integrasi sama dengan pengujian ujung ke ujung?
tamj0rd2
18

Ini sangat sederhana.

  1. Unit testing: Ini adalah pengujian yang sebenarnya dilakukan oleh pengembang yang memiliki pengetahuan pengkodean. Pengujian ini dilakukan pada tahap pengkodean dan merupakan bagian dari pengujian kotak putih. Ketika sebuah perangkat lunak datang untuk pengembangan, itu dikembangkan menjadi potongan kode atau potongan kode yang dikenal sebagai satu unit. Dan pengujian individual dari unit-unit ini disebut unit testing yang dilakukan oleh pengembang untuk mengetahui beberapa jenis kesalahan manusia seperti kehilangan cakupan pernyataan dll.

  2. Pengujian fungsional: Pengujian ini dilakukan pada tahap pengujian (QA) dan merupakan bagian dari pengujian kotak hitam. Eksekusi aktual dari test case yang ditulis sebelumnya. Pengujian ini sebenarnya dilakukan oleh penguji, mereka menemukan hasil aktual dari setiap fungsionalitas di situs dan membandingkan hasil ini dengan hasil yang diharapkan. Jika mereka menemukan perbedaan maka ini adalah bug.

  3. Pengujian penerimaan: kenal sebagai UAT. Dan ini sebenarnya dilakukan oleh penguji serta pengembang, tim manajemen, penulis, penulis, dan semua yang terlibat dalam proyek ini. Untuk memastikan proyek akhirnya siap untuk dikirim dengan bug gratis.

  4. Pengujian integrasi: Unit-unit kode (dijelaskan dalam poin 1) terintegrasi satu sama lain untuk menyelesaikan proyek. Unit-unit kode ini dapat ditulis dalam teknologi pengkodean yang berbeda atau mungkin ini versi yang berbeda sehingga pengujian ini dilakukan oleh pengembang untuk memastikan bahwa semua unit kode tersebut kompatibel dengan yang lain dan tidak ada masalah integrasi.

Rakesh Kumar
sumber
1
@OlegTsyba jawabannya datang 4 tahun setelah pertanyaan dijawab.
bentesha
1
Kita seharusnya tidak pernah memulai jawaban dengan "Ini sangat sederhana", terutama jika itu adalah topik yang kompleks seperti ini.
milosmns
6

Beberapa (relatif) ide-ide baru terhadap penghinaan berlebihan dan pengujian unit murni:

cdunn2001
sumber
Saya baru mengenal kode pengujian. Tes unit sepertinya hanya buang-buang waktu saja. Saya pikir saya sedang melakukan pengujian unit tetapi saya melakukan pengujian integrasi dan kemudian saya membaca tentang pengujian unit dan sepertinya konyol, mungkin bagi orang-orang dengan sedikit pengalaman? Ada kemungkinan saya melewatkan beberapa hal.
PixMach
Jika Unit didefinisikan secara luas, maka Anda benar-benar menguji unit. Saya menentang detail implementasi pengujian. Kelas privat tidak boleh "diuji unit". Namun, jika Anda memiliki beberapa kelas publik, Anda mungkin tergoda untuk mengejek satu saat menguji yang lain. Itulah perdebatan sesungguhnya. Apakah Unit (a) seluruh perpustakaan Anda? (B) setiap kelas publik di perpustakaan? Atau (c), setiap metode publik dalam setiap kelas? Saya lebih suka menguji perpustakaan yang diberikan sebagai komponen terintegrasi, tetapi untuk mengejek atau memalsukan dependensi eksternal (kecuali jika cepat dan dapat diandalkan). Jadi kupikir aku bersamamu.
cdunn2001
1
@PixMach: sebenarnya itu sebaliknya. Tidak memiliki tes unit (baik) di tempat, buang banyak waktu Anda, jika Anda (atau orang lain) harus mengubah kode itu di masa depan. Jika Anda memiliki pengalaman menjaga kode dengan dan tanpa unit test, Anda akan tahu bedanya. Idenya adalah, bahwa jika tes unit rusak, Anda harus tahu persis bagian mana dari kode yang harus diperbaiki. Tes penerimaan / integrasi berskala besar yang gagal sering kali hanya memberi tahu Anda: itu tidak berhasil. Dan kemudian Anda harus mulai
men-
@ Goodsquirrel, itu tergantung apa yang Anda sebut "unit". Itulah masalahnya. Tes yang salah akan dihapus selama refactoring. Tes yang baik masih akan membantu. Tes yang buruk tidak menambah nilai dan menghalangi. Tes yang baik mendokumentasikan diri sendiri dan sangat dihargai. Mari kita spesifik. Saya memiliki metode pribadi untuk mengembalikan nilai jika nilai lain Benar, jika tidak nilai default. (Kode lama.) Haruskah metode itu diuji? Aku bilang tidak. Metode pribadi lain mengembalikan nomor Fibonacci n. Haruskah itu diuji? Saya katakan ya.
cdunn2001
1
Kode terbuka terkecil . Perbedaan besar.
cdunn2001
5

Saya akan menjelaskan ini kepada Anda dengan contoh praktis dan tanpa teori:

Pengembang menulis kode. Belum ada GUI yang diterapkan. Pengujian pada level ini memverifikasi bahwa fungsi berfungsi dengan benar dan tipe data sudah benar. Fase pengujian ini disebut Pengujian unit.

Ketika GUI dikembangkan, dan aplikasi ditugaskan untuk penguji, ia memverifikasi persyaratan bisnis dengan klien dan mengeksekusi berbagai skenario. Ini disebut pengujian fungsional. Di sini kami memetakan persyaratan klien dengan aliran aplikasi.

Pengujian integrasi: katakanlah aplikasi kita memiliki dua modul: SDM dan Keuangan. Modul SDM disampaikan dan diuji sebelumnya. Sekarang Keuangan dikembangkan dan tersedia untuk diuji. Fitur saling tergantung juga tersedia sekarang, jadi pada fase ini, Anda akan menguji poin komunikasi antara keduanya dan akan memverifikasi mereka berfungsi sebagaimana diminta dalam persyaratan.

Pengujian regresi adalah fase penting lainnya, yang dilakukan setelah pengembangan baru atau perbaikan bug. Tujuannya adalah untuk memverifikasi fungsi yang sebelumnya berfungsi.

fahad shaikh
sumber
1
"Seorang pengembang menulis kode. Belum ada GUI yang diimplementasikan. Pengujian pada tingkat ini memverifikasi bahwa fungsi-fungsi bekerja dengan benar dan tipe data sudah benar. Fase pengujian ini disebut pengujian Unit" Ini tidak benar. GUI sebenarnya hanya "plugin". Anda sudah dapat menulis tes E2E ke output API Anda. (atau objek respons apa pun yang Anda hasilkan)
user3790897
4

unit test: pengujian modul individu atau komponen independen dalam suatu aplikasi dikenal sebagai pengujian unit, pengujian unit akan dilakukan oleh pengembang.

uji integrasi: menggabungkan semua modul dan menguji aplikasi untuk memverifikasi komunikasi dan aliran data antara modul bekerja dengan baik atau tidak, pengujian ini juga dilakukan oleh pengembang.

uji fungsional memeriksa fungsionalitas individu aplikasi dimaksudkan untuk pengujian fungsional

pengujian penerimaan pengujian ini dilakukan oleh pengguna akhir atau pelanggan apakah aplikasi bangun sesuai dengan kebutuhan pelanggan, dan spesifikasi pelanggan ini dikenal sebagai pengujian penerimaan

malini
sumber