Tes unit vs Tes fungsional

Jawaban:

254

Uji Unit - menguji unit individual, seperti metode (fungsi) di kelas, dengan semua dependensi diejek.

Uji Fungsional - Tes Integrasi AKA, menguji sepotong fungsionalitas dalam suatu sistem. Ini akan menguji banyak metode dan dapat berinteraksi dengan dependensi seperti Database atau Layanan Web.

bapa
sumber
170
Biarkan saya tidak setuju dengan "Tes Integrasi AKA". Tes integrasi, memeriksa integrasi antara 2 atau lebih sistem / subsistem dalam kode Anda. Contoh, memeriksa kueri SQL melalui ORM, memeriksa apakah ORM dan database berfungsi dengan baik. Tes Fungsional AKA End to End IMHO.
graffic
7
Saya setuju dengan @graffic Uji Fungsional! = Uji Integrasi Anda harus membingungkan "integrasi" sub-komponen sistem dalam satu sama lain seperti keadaan bertahan dll. Tetapi secara umum pengujian Integrasi memiliki cakupan yang jauh lebih luas.
nabster
4
Tidak, tidak bingung tentang apa pun.
bpapa
3
Tes Integrasi IS-A Uji Fungsional. Tapi tidak sebaliknya. Google "pengujian fungsional dan non fungsional" dan periksa "Gambar".
Andrejs
4
Jawaban ini SALAH! Pengujian fungsional bahkan TIDAK dekat dengan tes integrasi ..
sotn
517

Tes unit memberi tahu pengembang bahwa kode melakukan sesuatu dengan benar; tes fungsional memberi tahu pengembang bahwa kode melakukan hal yang benar .

Anda dapat membaca lebih lanjut di Pengujian Unit versus Pengujian Fungsional


Analogi kehidupan nyata yang dijelaskan dengan baik tentang pengujian unit dan pengujian fungsional dapat dijelaskan sebagai berikut,

Berkali-kali pengembangan suatu sistem disamakan dengan pembangunan rumah. Meskipun analogi ini tidak sepenuhnya benar, kita dapat mengembangkannya untuk tujuan memahami perbedaan antara tes unit dan fungsional.

Pengujian unit dianalogikan dengan inspektur bangunan yang mengunjungi lokasi konstruksi rumah. Ia fokus pada berbagai sistem internal rumah, fondasi, framing, listrik, pipa ledeng, dan sebagainya. Dia memastikan (tes) bahwa bagian-bagian rumah akan bekerja dengan benar dan aman, yaitu, memenuhi kode bangunan.

Tes fungsional dalam skenario ini analog dengan pemilik rumah yang mengunjungi situs konstruksi yang sama ini. Dia berasumsi bahwa sistem internal akan berperilaku tepat, bahwa inspektur bangunan sedang melakukan tugasnya. Pemilik rumah berfokus pada bagaimana rasanya tinggal di rumah ini. Dia prihatin dengan bagaimana rumah terlihat, apakah berbagai kamar ukuran yang nyaman, apakah rumah sesuai dengan kebutuhan keluarga, adalah jendela di tempat yang bagus untuk menangkap matahari pagi.

Pemilik rumah sedang melakukan tes fungsional di rumah. Ia memiliki perspektif pengguna.

Inspektur bangunan sedang melakukan tes unit di rumah. Dia memiliki perspektif pembangun.


Sebagai ringkasan,

Tes Unit ditulis dari perspektif pemrogram . Mereka dibuat untuk memastikan bahwa metode tertentu (atau unit ) dari kelas melakukan serangkaian tugas tertentu.

Tes Fungsional ditulis dari sudut pandang pengguna . Mereka memastikan bahwa sistem berfungsi seperti yang diharapkan pengguna.

Anthony Forloney
sumber
18
Kutipan ini agak kabur bagi seseorang yang baru mengenal konsep ini.
2
@ fig-gnuton, saya mencoba untuk menjelaskan semoga tidak membuat deskripsi sebagai kabur. Di dalam tautan mereka memberikan contoh yang baik, saya dapat memperbarui jawaban dengan kutipan jika Anda berpikir itu mungkin membantu OP.
Anthony Forloney
148
Mungkin cara lain untuk mengatakannya adalah, "Uji unit memastikan kode melakukan apa yang diinginkan programmer, Uji fungsional memastikan programmer melakukan apa yang diinginkan pelanggan"?
JS.
3
Saya suka itu tetapi akan menyesuaikannya. Sebuah Uji Fungsional memastikan aplikasi memungkinkan pengguna untuk melakukan suatu tindakan. Sebuah Unit Uji memastikan para berperilaku kode bagaimana mengharapkan programmer.
Adam
2
Bukankah yang diinginkan oleh pemrogram mematuhi apa yang diinginkan pengguna akhir? Mengapa menulis tes yang tidak sesuai dengan harapan pelanggan?
O.Badr
140
  • Tes unit menguji unit perilaku independen . Apa itu unit perilaku? Ini adalah bagian terkecil dari sistem yang dapat diuji secara independen. (Definisi ini sebenarnya melingkar, TKI itu benar-benar bukan definisi sama sekali , tetapi tampaknya berfungsi cukup baik dalam praktiknya, karena Anda dapat memahaminya secara intuitif.)

  • Tes fungsional menguji fungsi independen.


  • Satu unit perilaku sangat kecil: sementara saya benar-benar tidak menyukai mantra "satu unit uji per metode" bodoh ini, dari sudut pandang ukuran itu hampir benar. Unit perilaku adalah sesuatu antara bagian dari suatu metode dan mungkin beberapa metode. Paling banyak objek, tetapi tidak lebih dari satu.

  • Sepotong fungsi biasanya terdiri dari banyak metode dan memotong beberapa objek dan seringkali melalui beberapa lapisan arsitektur.


  • Tes unit akan menjadi sesuatu seperti: ketika saya memanggil validate_country_code()fungsi dan memberikannya kode negara 'ZZ'itu harus kembali false.

  • Tes fungsional adalah: ketika saya mengisi formulir pengiriman dengan kode negara ZZ, saya harus diarahkan ke halaman bantuan yang memungkinkan saya untuk mengambil kode negara saya dari menu.


  • Tes unit ditulis oleh pengembang, untuk pengembang, dari perspektif pengembang.

  • Tes fungsional mungkin menghadap pengguna, dalam hal ini ditulis oleh pengembang bersama dengan pengguna (atau mungkin dengan alat yang tepat dan pengguna yang tepat bahkan oleh pengguna itu sendiri), untuk pengguna, dari perspektif pengguna. Atau mereka mungkin menghadap pengembang (misalnya ketika mereka menggambarkan beberapa fungsi internal yang tidak dipedulikan oleh pengguna), dalam hal ini ditulis oleh pengembang, untuk pengembang, tetapi masih dari perspektif pengguna.


  • Dalam kasus sebelumnya, tes fungsional juga dapat berfungsi sebagai tes penerimaan dan sebagai pengkodean persyaratan fungsional yang dapat dieksekusi atau spesifikasi fungsional, dalam kasus terakhir, tes tersebut juga dapat berfungsi sebagai tes integrasi.

  • Tes unit sering berubah, tes fungsional tidak boleh berubah dalam rilis utama.


Jörg W Mittag
sumber
jawaban yang sangat bagus! satu hal - "tes fungsional tidak boleh berubah dalam rilis utama" mengapa begitu?
Lazer
5
@ Lazer, @cdeszaq: Dalam banyak proyek, perubahan dalam nomor versi utama digunakan untuk menunjukkan ketidaksesuaian mundur dan OTOH jika versi utama tidak berubah, kompatibilitas ke belakang dijamin . Apa yang dimaksud dengan "kompatibilitas ke belakang"? Ini berarti "tidak mengubah perilaku yang terlihat pengguna". Dan tes fungsional adalah pengkodean yang dapat dieksekusi dari spesifikasi perilaku yang dapat dilihat pengguna. Jadi, jika jumlah besar tidak berubah, maka tes fungsional tidak diperbolehkan untuk perubahan baik dan sebaliknya, jika tets fungsional melakukan perubahan, maka jumlah besar harus berubah juga.
Jörg W Mittag
2
Catatan: Saya tidak mengatakan apa-apa tentang menambahkan tes fungsional! Apakah menambah fungsionalitas yang tidak ada sebelumnya merupakan perubahan yang tidak kompatibel ke belakang, tergantung pada proyek. Untuk perangkat lunak pengguna akhir, mungkin tidak. Tetapi untuk bahasa pemrograman? Mungkin: memasukkan kata kunci baru, misalnya, membuat program yang sedang berjalan yang menggunakan kata kunci itu sebagai nama variabel tidak valid, dan karenanya merupakan perubahan yang tidak kompatibel ke belakang.
Jörg W Mittag
3
@ JörgWMittag menyukai gagasan itu: 'tes fungsional adalah pengkodean yang dapat dieksekusi dari spesifikasi perilaku yang dapat dilihat pengguna' ... apakah ahli super lain benar-benar setuju, ini membantu saya dengan pertanyaan asli, untuk menjelaskan "perbedaan antara 'em "
mike rodent
1
"Tes fungsional adalah: ketika saya mengisi formulir pengiriman dengan kode negara ZZ, saya harus diarahkan ke halaman bantuan yang memungkinkan saya untuk mengambil kode negara saya dari menu." Ini agak pilih-pilih, tapi saya akan menyebutnya "tes penerimaan." Tes fungsional akan menguji bahwa memasukkan ZZ pada formulir pengiriman meneruskan pengguna ke URL yang benar atau melemparkan pengecualian atau kesalahan tertentu.
Bob Ray
98

TLDR:

Untuk menjawab pertanyaan: Unit Testing adalah subtipe dari Pengujian Fungsional.


Ada dua kelompok besar: Pengujian Fungsional dan Non-Fungsional . Ilustrasi (tidak lengkap) terbaik yang saya temukan adalah yang ini (sumber: www.inflectra.com ):

masukkan deskripsi gambar di sini

(1) Unit Testing: pengujian potongan kode kecil (fungsi / metode). Ini dapat dianggap sebagai pengujian fungsional (kotak putih).

Ketika fungsi disatukan, Anda membuat modul = bagian mandiri, mungkin dengan Antarmuka Pengguna yang dapat diuji (Modul Pengujian). Setelah Anda memiliki setidaknya dua modul terpisah, maka Anda merekatkannya dan kemudian datang:

(2) Pengujian Integrasi: ketika Anda menempatkan dua atau lebih potongan (sub) modul atau (sub) sistem bersama-sama dan melihat apakah mereka bermain bersama dengan baik.

Kemudian Anda mengintegrasikan modul ke-3, lalu ke-4 dan ke-5 dalam urutan apa pun yang Anda atau tim Anda inginkan, dan begitu semua potongan gambar ditempatkan bersama, datang

(3) Pengujian Sistem: menguji SW secara keseluruhan. Ini cukup banyak "pengujian Integrasi semua bagian".

Jika tidak apa-apa, maka datanglah

(4) Pengujian Penerimaan: apakah kita membangun apa yang sebenarnya diminta pelanggan? Tentu saja, Pengujian Penerimaan harus dilakukan sepanjang siklus hidup , tidak hanya pada tahap terakhir, di mana Anda menyadari bahwa pelanggan menginginkan mobil sport dan Anda membangun sebuah van.

masukkan deskripsi gambar di sini

Andrejs
sumber
2
Saya melihat banyak gambar seperti itu di google, yang menggambarkan "Tes unit" sebagai semacam "Tes fungsional". Tetapi mengapa kemudian jawaban lain di sini menggambarkan konsep yang sangat berbeda: "Tes fungsional" lebih merupakan tes ujung ke ujung dan tes unit bukan tes fungsional? Aku bingung. Ada dua "agama" yang berbeda yang mendefinisikan istilah "tes fungsional" secara berbeda atau apa?
Ruslan Stelmachenko
Jawaban (bahkan yang sangat tinggi) juga bisa salah;)
Andrejs
1
Saya suka gambarnya, tetapi untuk Pengujian Integrasi Sistem, teka-teki tersebut seharusnya tampak "lengkap", tanpa ada tempat lagi untuk dihubungkan dengan bagian lain.
Jonathon Reinhart
4
@ JonathonReinhart - belum tentu. Tepi terbuka dapat mewakili perpanjangan yang mudah dari sistem dengan fitur baru, yang sangat berguna jika menggunakan pendekatan pengembangan seperti Agile.
Myles
Dari beberapa jawaban yang bertentangan di atas, jelas Functional Testbukan istilah standar dan memiliki arti berbeda untuk orang yang berbeda.
Penghe Geng
12

"Tes fungsional" tidak berarti Anda menguji fungsi (metode) dalam kode Anda. Itu berarti, secara umum, bahwa Anda menguji fungsionalitas sistem - ketika saya menjalankan foo file.txtdi baris perintah, garis-garis di file.txtmenjadi terbalik, mungkin. Sebaliknya, tes unit tunggal umumnya mencakup satu kasus metode tunggal - length("hello")harus mengembalikan 5, dan length("hi")harus mengembalikan 2.

Lihat juga garis IBM antara pengujian unit dan pengujian fungsional .

Mark Rushakoff
sumber
Yah, menarik, tetapi tautan yang Anda tampilkan memiliki arti berbeda: fungsional adalah tentang fungsi yang harus dijalankan melalui implementasi, yaitu pengujian dari sudut pandang pengguna, yaitu fungsi untuk pengguna.
Stefano Scarpanti
8

Perbedaan mendasarnya adalah uji fungsional menguji aplikasi dari luar, dari sudut pandang pengguna. Tes unit menguji aplikasi dari dalam, dari sudut pandang programmer. Tes fungsional harus membantu Anda membangun aplikasi dengan fungsionalitas yang tepat, dan menjamin Anda tidak pernah secara tidak sengaja memecahkannya. Tes unit akan membantu Anda menulis kode yang bersih dan bebas bug.

Diambil dari buku "Python TDD" karya Harry Percival

Humoyun Ahmad
sumber
8

Menurut ISTQB keduanya tidak sebanding. Pengujian fungsional bukan pengujian integrasi.

Unit test adalah salah satu level tes dan pengujian fungsional adalah tipe pengujian.

Pada dasarnya:

Fungsi suatu sistem (atau komponen) adalah 'apa yang dilakukannya'. Ini biasanya dijelaskan dalam spesifikasi persyaratan, spesifikasi fungsional, atau dalam kasus penggunaan.

sementara

Pengujian komponen, juga dikenal sebagai pengujian unit, modul dan program, mencari cacat pada, dan memverifikasi fungsi perangkat lunak (misalnya modul, program, objek, kelas, dll.) Yang dapat diuji secara terpisah.

Menurut tes komponen / unit ISTQB dapat fungsional atau tidak-fungsional:

Pengujian komponen dapat mencakup pengujian fungsionalitas dan karakteristik non-fungsional spesifik seperti perilaku sumber daya (misalnya kebocoran memori), pengujian kinerja atau ketahanan, serta pengujian struktural (misalnya cakupan keputusan).

Kutipan dari Yayasan pengujian perangkat lunak - sertifikasi ISTQB

Dominik
sumber
Saya setuju tentang terlalu banyak bulu, tetapi bagaimanapun mereka adalah pemain terbesar di sana dan pertanyaan ini adalah tentang teori, jadi saya pikir ISTQB harus cukup baik.
Dominik
6

Di Rails, folder unit dimaksudkan untuk mengadakan tes untuk model Anda, folder fungsional dimaksudkan untuk mengadakan tes untuk pengendali Anda, dan folder integrasi dimaksudkan untuk mengadakan tes yang melibatkan sejumlah pengendali yang berinteraksi. Perlengkapan adalah cara mengatur data uji; mereka berada di folder perlengkapan. File test_helper.rb menyimpan konfigurasi default untuk pengujian Anda. u bisa mengunjungi ini .

Bhimasen Rautaray
sumber
3

Cara saya memikirkannya adalah seperti ini: Tes unit menetapkan bahwa kode melakukan apa yang Anda inginkan kode (misalnya Anda ingin menambahkan parameter a dan b, Anda sebenarnya menambahkannya, dan tidak mengurangi mereka), tes fungsional menguji bahwa semua kode bekerja bersama untuk mendapatkan hasil yang benar, sehingga apa yang Anda maksudkan kode sebenarnya mendapatkan hasil yang tepat dalam sistem.

Yishai
sumber
3

AFAIK, pengujian unit BUKAN pengujian fungsional. Izinkan saya menjelaskan dengan contoh kecil. Anda ingin menguji apakah fungsi masuk aplikasi web email berfungsi atau tidak, sama seperti yang dilakukan pengguna. Untuk itu, tes fungsional Anda harus seperti ini.

1- existing email, wrong password -> login page should show error "wrong password"!
2- non-existing email, any password -> login page should show error "no such email".
3- existing email, right password -> user should be taken to his inbox page.
4- no @symbol in email, right password -> login page should say "errors in form, please fix them!" 

Haruskah pengujian fungsional kami memeriksa apakah kami dapat masuk dengan input yang tidak valid? Misalnya. Email tidak memiliki simbol @, nama pengguna memiliki lebih dari satu titik (hanya satu titik yang diizinkan), .com muncul sebelum @ dll? Secara umum, tidak! Pengujian semacam itu masuk ke unit test Anda.

Anda dapat memeriksa apakah input yang tidak valid ditolak di dalam unit test seperti yang ditunjukkan pada tes di bawah ini.

class LoginInputsValidator
  method validate_inputs_values(email, password)
    1-If email is not like [email protected], then throw error.
    2-If email contains abusive words, then throw error.
    3-If password is less than 10 chars, throw error.

Perhatikan bahwa uji fungsional 4 sebenarnya melakukan apa yang dilakukan uji unit 1. Terkadang, tes fungsional dapat mengulangi beberapa (tidak semua) pengujian yang dilakukan oleh unit test, karena berbagai alasan. Dalam contoh kami, kami menggunakan uji fungsional 4 untuk memeriksa apakah pesan kesalahan tertentu muncul saat memasukkan input yang tidak valid. Kami tidak ingin menguji apakah semua input buruk ditolak atau tidak. Itu adalah tugas unit test.

MasterJoe2
sumber
1
Poin bagus tentang pengujian fungsional sering memiliki cakupan yang jauh lebih sempit daripada pengujian unit (dalam hal pengujian fungsional lebih difokuskan pada dasarnya membuktikan fungsi yang diharapkan tercapai), tetapi saya akan mengatakan bahwa mereka semacam menggambarkan dimensi yang berbeda ( komposisi dalam pengujian unit vs tujuan dalam tes fungsional); beberapa tes unit adalah tes fungsional, dan beberapa tes fungsional adalah tes unit, tetapi ada juga banyak Venn yang tidak tumpang tindih.
Myles
Contoh bagus tentang apa yang bisa dan tidak ada dalam ruang lingkup untuk tes fungsional.
Myles
2

PENGUJIAN UNIT

Pengujian unit mencakup pengujian unit kode terkecil yang biasanya merupakan fungsi atau metode. Pengujian unit sebagian besar dilakukan oleh pengembang unit / metode / fungsi, karena mereka memahami inti dari suatu fungsi. Tujuan utama pengembang adalah untuk menutupi kode dengan unit test.

Ini memiliki batasan bahwa beberapa fungsi tidak dapat diuji melalui unit test. Bahkan setelah berhasil menyelesaikan semua tes unit; itu tidak menjamin operasi produk yang benar. Fungsi yang sama dapat digunakan di beberapa bagian sistem sementara tes unit ditulis hanya untuk satu penggunaan.

PENGUJIAN FUNGSIONAL

Ini adalah jenis pengujian Kotak Hitam di mana pengujian akan dilakukan pada aspek fungsional suatu produk tanpa melihat ke dalam kode. Pengujian fungsional sebagian besar dilakukan oleh penguji Software khusus. Ini akan mencakup teknik positif, negatif dan BVA menggunakan data yang tidak terstandarisasi untuk menguji fungsionalitas produk yang ditentukan. Cakupan tes dilakukan dengan cara yang lebih baik dengan tes fungsional daripada dengan tes unit. Ini menggunakan aplikasi GUI untuk pengujian, jadi lebih mudah untuk menentukan apa tepatnya bagian spesifik dari antarmuka yang bertanggung jawab untuk menentukan apa kode fungsi bertanggung jawab.

Ashish Gupta
sumber
2

dengan sangat sederhana kita dapat mengatakan:

  • black box: tes antarmuka pengguna seperti tes fungsional
  • kotak putih: tes kode seperti tes unit

baca lebih lanjut di sini .

Alireza Rahmani Khalili
sumber
@fafl Saya minta maaf, salah saya
Alireza Rahmani Khalili
1

Tes Unit : - Pengujian unit terutama digunakan untuk menguji komponen produk dengan komponen khusus saat produk sedang dalam pengembangan. Jenis alat Junit dan Nunit juga akan membantu Anda menguji produk sesuai Unit. ** Daripada menyelesaikan masalah setelah Integrasi, selalu nyaman untuk menyelesaikannya di awal pengembangan.

Pengujian Fungsional: - Adapun mengenai Pengujian ada dua jenis utama Pengujian sebagai 1. Tes Fungsional 2. Tes Non-Fungsional.

Tes Non-Fungsional adalah tes di mana Penguji akan menguji bahwa Produk akan melakukan semua atribut kualitas yang tidak disebutkan oleh pelanggan tetapi atribut kualitas tersebut harus ada di sana. Seperti: -Kinerja, Kegunaan, Keamanan, Beban, Stres dll. Tetapi dalam Tes Fungsional : - Pelanggan sudah hadir dengan persyaratannya dan yang telah didokumentasikan dengan baik, Tugas penguji adalah untuk memeriksa ulang apakah fungsi aplikasi berfungsi sesuai ke Sistem yang Diajukan atau tidak. Untuk tujuan itu, Penguji harus menguji fungsionalitas yang Diimplementasikan dengan Sistem yang diusulkan.

mohit sarsar
sumber
0

Pengujian unit biasanya dilakukan oleh pengembang. Tujuan melakukan hal yang sama adalah untuk memastikan kode mereka berfungsi dengan baik. Aturan umum adalah untuk mencakup semua jalur dalam kode menggunakan pengujian unit.

Pengujian Fungsional : Ini adalah referensi yang bagus. Penjelasan Pengujian Fungsional

pengguna automation
sumber
6
Harap tempel teks yang paling penting ke jawaban Anda, Anda tidak pernah tahu kapan halaman itu bisa dihapus membuat tautan tidak valid.
Andrejs