Apa perbedaan antara pengujian unit, fungsional, penerimaan, dan integrasi (dan jenis tes lain yang gagal saya sebutkan)?
Apa perbedaan antara pengujian unit, fungsional, penerimaan, dan integrasi (dan jenis tes lain yang gagal saya sebutkan)?
Jawaban:
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:
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.
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.
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.
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
Ini sangat sederhana.
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.
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.
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.
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.
Beberapa (relatif) ide-ide baru terhadap penghinaan berlebihan dan pengujian unit murni:
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.
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