Mengapa Cem Kaner menganggap tes tidak mengungkapkan bug sebagai pemborosan waktu?

15

Bagaimana dengan mengonfirmasi fungsi dalam tes positif, membuktikannya berfungsi - haruskah saya katakan itu buang-buang waktu? Konsep apa yang ada di balik kutipan ini?

Tes yang gagal, yaitu tes yang tidak menemukan kesalahan adalah buang-buang waktu.

Teknik Web: Disiplin Pengembangan Sistematis Aplikasi Web mengutip Cem Kaner .

John V
sumber
2
Tidak juga. Kaner mengklaim bahwa secara umum, pengujian seharusnya hanya menemukan cacat.
John V
4
Itu posisi yang sangat akademis. Tuan Kaner dan Tuan Schrödinger perlu duduk untuk minum kopi kapan-kapan.
Blrfl
2
@ Bllfl satu-satunya masalah dengan itu adalah bahwa Tuan Schrödinger sudah mati. Oh, tunggu ... um ...
ikmac
1
Pernyataan tanpa konteks itu terdengar konyol sekali ...
Rig
1
“Mengonfirmasi fungsionalitas dalam tes positif” - Ini pada dasarnya tidak mungkin. Anda tidak dapat membuktikan sesuatu yang benar, Anda hanya bisa membuktikannya salah.
Konrad Rudolph

Jawaban:

37

Saya menulis sebagian besar Pengujian Perangkat Lunak Komputer lebih dari 25 tahun yang lalu. Sejak itu saya menunjuk beberapa bagian buku yang saya anggap ketinggalan jaman, atau hanya salah. Lihat http://www.kaner.com/pdfs/TheOngoingRevolution.pdf

Anda dapat melihat lebih banyak (tampilan saat ini, tetapi tanpa penunjuk eksplisit kembali ke TCS) di situs saya untuk Kursus Pengujian Perangkat Lunak Black Box (video dan slide tersedia secara gratis), www.testingeducation.org/BBST

Budaya pengujian saat itu sebagian besar konfirmasi.

Dalam pengujian modern, pendekatan pengujian unit sebagian besar bersifat konfirmasi - kami menulis koleksi besar pengujian otomatis yang hanya memverifikasi bahwa perangkat lunak terus berkinerja sebagaimana dimaksud. Tes berfungsi sebagai detektor perubahan - jika ada sesuatu di bagian lain dari kode dan bagian ini sekarang memiliki masalah, atau jika nilai data yang sebelumnya tidak mungkin di dunia nyata sekarang mencapai aplikasi, maka detektor perubahan akan menyala, memperingatkan programmer ke masalah pemeliharaan.

Saya pikir pola pikir konfirmasi sesuai untuk pengujian unit, tetapi bayangkan sebuah dunia di mana semua pengujian sistem adalah konfirmasi (untuk orang-orang yang membuat perbedaan, silakan tafsirkan "pengujian integrasi sistem" dan "pengujian penerimaan" sebagaimana tercantum dalam komentar saya pada sistem pengujian.) Maksud pengujian adalah untuk mengonfirmasi bahwa program memenuhi spesifikasinya dan pendekatan yang dominan adalah untuk membangun satu juta (atau setidaknya beberapa ratus) tes regresi tingkat sistem yang memetakan bagian-bagian spesifikasi untuk perilaku program. (Saya pikir konfirmasi spec-to-behavior berguna, tetapi saya pikir itu adalah sebagian kecil dari tujuan yang lebih besar.)

Masih ada kelompok uji yang beroperasi dengan cara ini, tetapi ini bukan lagi pandangan dominan. Saat itu, dulu. Saya menulis dengan tegas dan membuat perbedaan yang tajam untuk menunjukkan kepada orang-orang yang secara konsisten dilatih dalam pola pikir ini. Hari ini, beberapa kontras yang tajam (termasuk yang dikutip di sini) sudah usang. Mereka disalahartikan sebagai serangan terhadap pandangan yang salah.

Seperti yang saya lihat, pengujian perangkat lunak adalah proses empiris untuk mempelajari informasi terkait kualitas tentang produk atau layanan perangkat lunak.

Tes harus dirancang untuk mengungkapkan informasi yang bermanfaat.

Ngomong-ngomong, tidak ada yang berbicara tentang pengujian sebagai metode untuk mengungkapkan "informasi". Saat itu, pengujian adalah untuk (beberapa versi ...) menemukan bug atau untuk (beberapa versi ...) memverifikasi (memeriksa) program terhadap spesifikasi. Saya tidak berpikir bahwa pernyataan bahwa tes adalah untuk mengungkapkan informasi yang berguna masuk ke dalam kosa kata pengujian sampai abad ini.

Bayangkan uji peringkat dalam hal nilai informasinya. Tes yang sangat mungkin untuk mengajarkan kita sesuatu yang tidak kita ketahui tentang perangkat lunak akan memiliki nilai informasi yang sangat tinggi. Tes yang sangat mungkin untuk mengkonfirmasi sesuatu yang sudah kita harapkan dan yang telah ditunjukkan berkali-kali sebelumnya, akan memiliki nilai informasi yang rendah. Salah satu cara untuk memprioritaskan tes adalah menjalankan tes nilai informasi yang lebih tinggi sebelum tes nilai informasi yang lebih rendah.

Jika saya terlalu menyederhanakan prioritas ini sehingga akan menarik perhatian seorang programmer, manajer proyek, atau manajer proses yang tidak mengerti tentang pengujian perangkat lunak, saya akan mengatakan "UJI YANG TIDAK DIRANCANG UNTUK MENGUNGKAPKAN BUG ADALAH BUANG-BUANG ADALAH BUANG-BUANG WAKTU . " Ini bukan terjemahan yang sempurna, tetapi bagi pembaca yang tidak bisa atau tidak akan mengerti seluk beluk atau kualifikasi, itu sedekat yang akan didapat.

Saat itu, dan saya melihatnya lagi di sini, beberapa orang yang tidak memahami pengujian akan menjawab bahwa tes yang dirancang untuk menemukan kasus sudut adalah buang-buang waktu dibandingkan dengan tes penggunaan utama fungsi utama. Mereka tidak mengerti dua hal. Pertama, saat penguji menemukan waktu untuk memeriksa nilai batas, penggunaan utama dari fungsi utama telah dilakukan beberapa kali. (Ya, ada pengecualian, dan sebagian besar kelompok uji akan memperhatikan dengan hati-hati pengecualian itu.) Kedua, alasan untuk menguji dengan nilai ekstrem adalah bahwa program lebih cenderung gagal dengan nilai ekstrem. Jika tidak gagal secara ekstrim, Anda menguji sesuatu yang lain. Ini adalah aturan yang efisien. Di sisi lain, jika itu TIDAK gagal pada nilai ekstrim, tester mungkin berhenti dan melaporkan bug atau tester mungkin memecahkan masalah lebih lanjut, untuk melihat apakah program gagal dengan cara yang sama pada nilai yang lebih normal. Siapa yang melakukan pemecahan masalah (penguji atau pemrogram) adalah masalah budaya perusahaan. Beberapa perusahaan menganggarkan waktu penguji untuk ini, beberapa menganggarkan programmer, dan beberapa mengharapkan programmer memperbaiki bug sudut apakah bisa digeneralisasikan atau tidak sehingga pemecahan masalah tidak relevan. Kesalahpahaman umum - bahwa penguji membuang-buang waktu (daripada memaksimalkan efisiensi) dengan menguji nilai-nilai ekstrim adalah alasan lain bahwa "Tes yang tidak dirancang untuk mengungkapkan bug adalah buang-buang waktu" adalah pesan yang sesuai untuk penguji. Ini berlawanan dengan dorongan dari beberapa programmer untuk (pada dasarnya) tidak pernah menjalankan tes yang mungkin menantang program. Pesannya terlalu disederhanakan, tetapi seluruh diskusi disederhanakan.

Omong-omong, "nilai informasi" tidak bisa menjadi satu-satunya sistem prioritas. Itu bukan aturan saya ketika saya merancang suite tes unit. Ini bukan aturan saya ketika saya merancang tes verifikasi bangunan (alias cek kewarasan). Dalam kedua kasus tersebut, saya lebih tertarik pada jenis cakupan daripada pada kekuatan tes individu. Ada kasus-kasus lain (mis. Tes otomatis bervolume tinggi yang murah untuk dipasang, dijalankan, dan dipantau) di mana kekuatan tes individu tidak relevan dengan desain saya. Saya yakin Anda dapat memikirkan contoh tambahan.

Tetapi sebagai aturan umum, jika saya bisa menyatakan hanya satu aturan (misalnya berbicara dengan seorang eksekutif yang kepalanya meledak jika dia mencoba memproses lebih dari satu kalimat), itu akan berarti bahwa tes nilai-informasi yang rendah biasanya hanya membuang-buang waktu.

Cem Kaner
sumber
4
+1 untuk meluangkan waktu untuk menjawab pertanyaan yang menjadi sumber otorisasi Anda, serta memvalidasi penggunaan saya atas istilah "Bangun Uji Verifikasi" yang oleh banyak orang dipandang lucu untuk digunakan ... Selalu menyenangkan untuk melihat orang perawakanmu meluangkan waktu untuk membantu orang-orang di sekitar sini
Jimmy Hoffa
1
Eric G: Saya pikir jika Anda membaca kembali Anda akan melihat Cem menyatakan bahwa sebagai bagian dari pembaca memahami bahwa pandangannya tentang subjek telah berkembang dari waktu ke waktu. Atau Anda bisa melanjutkan dan mengabaikan kehalusan dan kualifikasi, untuk parafrase Cem. (dan saya mengambil "kualifikasi" bukan sebagai kredensial, tetapi sebagai pengecualian.)
Jim Holmes
Kutipan Anda mengingatkan saya pada sesuatu yang telah saya amati tentang sains: seseorang tidak dapat membuktikan (atau bahkan mendukung) teori ilmiah dengan melakukan eksperimen yang diharapkan akan memberikan hasil yang konsisten dengan teori; cara untuk mendukung teori adalah dengan melakukan upaya yang bonafid untuk percobaan perangkat yang tidak akan mendukungnya, tetapi tidak dapat melakukannya.
supercat
@ supercat Anda dapat mendukung teori dengan tes untuk sesuatu yang konsisten dengan teori jika tes tidak akan terjadi kepada Anda sebelum teori (misalnya menunjukkan percepatan objek jatuh dalam ruang hampa adalah seperti yang Anda hitung sebagai mengatakan lebih dari menunjukkan bahwa itu jatuh). Tes kasus tepi adalah analog; Saya mungkin mengharapkan perangkat lunak untuk berperilaku dengan benar ketika berhadapan dengan nilai-nilai ekstrem, tetapi itu memberikan lebih percaya diri dalam kualitas untuk melihat itu terjadi daripada mengulangi nilai input yang mungkin dilihatnya selama pengembangan, bersama dengan lebih mungkin untuk menemukan bug.
Jon Hanna
@ JonHanna: Ungkapan saya buruk: masalahnya bukan harapan, tapi usaha. Seseorang tidak dapat membuktikan teori dengan mencoba menemukan tes yang akan dilaluinya; seseorang harus melakukan upaya yang bonafid untuk menemukan tes yang akan gagal jika tidak valid.
supercat
11

Idenya adalah, menurut Kaner, "karena Anda akan kehabisan waktu sebelum kehabisan uji kasus, sangat penting untuk menggunakan waktu yang tersedia seefisien mungkin."

Konsep di balik kutipan yang Anda tanyakan disajikan dan dijelaskan dengan sangat rinci dalam artikel Pengujian Perangkat Lunak Komputer oleh Cem Kaner , Jack Falk, Hung Quoc Nguyen, dalam bab "TUJUAN DAN BATAS PENGUJIAN":

JADI, MENGAPA UJI?

Anda tidak dapat menemukan semua bug. Anda tidak dapat membuktikan programnya benar, dan Anda tidak mau. Itu mahal, membuat frustrasi, dan tidak memenangkan kontes popularitas apa pun. Jadi, mengapa repot-repot menguji?

TUJUAN MENGUJI PROGRAM ADALAH MENCARI MASALAH DI DALAMNYA

Menemukan masalah adalah inti dari pekerjaan Anda. Anda harus mencari sebanyak mungkin; semakin serius masalahnya, semakin baik.

Karena Anda akan kehabisan waktu sebelum kehabisan kasus pengujian, penting untuk menggunakan waktu yang tersedia seefisien mungkin. Bab 7,8,12, dan 13 mempertimbangkan prioritas secara rinci. Prinsip panduan dapat secara sederhana:


Tes yang mengungkapkan masalah adalah keberhasilan. Tes yang tidak mengungkapkan masalah adalah buang-buang waktu.


Perhatikan analogi berikut, dari Myers (1979). Misalkan ada yang salah dengan Anda. Anda pergi ke dokter. Dia seharusnya menjalankan tes, mencari tahu apa yang salah, dan merekomendasikan tindakan korektif. Dia menjalankan tes demi tes demi tes. Pada akhirnya, dia tidak dapat menemukan kesalahan. Apakah dia seorang penguji hebat atau ahli diagnosa yang tidak kompeten? Jika Anda benar-benar sakit, dia tidak kompeten, dan semua ujian mahal itu hanya buang-buang waktu, uang, dan usaha. Dalam perangkat lunak, Anda adalah diagnosa. Program ini adalah pasien (pasti) yang sakit ...


Soalnya, poin di atas adalah Anda harus memprioritaskan pengujian Anda dengan bijak. Pengujian diharapkan untuk mengambil jumlah waktu terbatas dan tidak mungkin untuk menguji semuanya dalam waktu yang diberikan.

Bayangkan Anda menghabiskan satu hari (minggu, bulan) menjalankan tes, tidak menemukan bug dan membiarkan beberapa bug lolos karena Anda tidak punya waktu untuk menjalankan tes yang akan mengungkapkannya. Jika ini terjadi, Anda tidak bisa hanya mengatakan "itu bukan salah saya karena saya sibuk menjalankan tes lain" untuk membenarkan kehilangan ini - jika Anda berkata begitu, Anda masih akan bertanggung jawab.

Anda membuang-buang waktu menjalankan tes yang tidak mengungkapkan bug dan karena ini, Anda melewatkan tes yang akan menemukan bug.

(Dalam kasus jika Anda bertanya-tanya, meleset seperti di atas umumnya dapat dihindari tidak peduli bagaimana Anda mencoba, dan ada yang cara untuk menangani ini, tapi itu akan menjadi lebih topik untuk pertanyaan terpisah ... dan mungkin lebih cocok untuk SQA. SE.)

agas
sumber
12
Jawaban ini dengan tepat mewakili posisinya, tetapi perlu menunjukkan bahwa banyak orang berpikir posisinya salah. Diberi pilihan antara tes yang menunjukkan fungsi paling penting dalam aplikasi bekerja dengan benar (pengujian penerimaan, jika Anda mau) dan tes yang menemukan bug sepele (sejajar dengan satu piksel) di sudut aplikasi yang jarang digunakan, saya tahu mana yang akan saya pilih dalam waktu terbatas saya. Dan untuk analogi dokter: jika saya akan MELAKUKAN PERIKSA daripada menanggapi gejala, mengkonfirmasikan jantung baik, paru-paru baik dll dll adalah hasil yang baik. Jadi disana.
Kate Gregory
@KateGregory Saya setuju, saya kira sama. Saya persoanlly menemukan pendapatnya salah, kami menguji terutama untuk mengumpulkan informasi ..
John V
2
@KateGregory setuju - Saya tidak berpikir itu akurat untuk melabeli semua tes yang lulus sebagai total buang. Padahal, saya pikir satu hal yang dia buat adalah abadi : jika bug lolos dari pengujian rilis, QA akan membutuhkan sesuatu yang lebih dari "oh tapi kami sibuk menjalankan tes lain" untuk menutupinya. Saya telah melalui ini sebagai penguji sendiri di masa lalu, dan melihat ini sekitar sekarang bahwa saya seorang pengembang, dan saya tidak berpikir itu akan pernah memudar
nyamuk
4

Yah, saya tidak tahu Pak Caner, tapi IMHO

tes yang tidak berpotensi menemukan kesalahan

membuang-buang waktu. Itu termasuk situasi di mana Anda sudah memiliki beberapa tes (tidak masalah apakah itu otomatis atau hanya pada daftar periksa), dan Anda menambahkan tes baru yang memvalidasi kasus yang sama pada dasarnya sudah Anda miliki. Jadi tes baru Anda tidak akan menemukan kesalahan lebih dari yang ada.

Situasi seperti itu dapat terjadi, misalnya, jika Anda hanya melalui daftar secara acak - saya dapat mengatakan juga "dengan tanpa belas kasihan" (maafkan saya kata itu) - memilih test case di program Anda, tanpa berpikir apakah mereka memeriksa case edge baru, kesetaraan baru kelas data input Anda, atau jika mereka meningkatkan cakupan kode sehubungan dengan tes yang sudah ditulis.

Doc Brown
sumber
-1

Menurut pendapat saya kutipan ini mengacu pada tes yang terlalu umum atau tidak aman.

Jika Anda membuat tes untuk fungsi yang memvalidasi email dan pada tes Anda hanya memberikan email yang valid, tes itu sama sekali tidak berguna. Anda harus menguji fungsi ini untuk kemungkinan string "any", email tidak valid, email terlalu panjang, karakter unicode (áêñç ....)

Jika Anda membuat kode tes yang hanya memeriksa bahwa [email protected] mengembalikan benar dan nama @ com kembali salah, tes itu sama dengan tidak ada tes sama sekali.

Juanmi Rodriguez
sumber