Bagaimana Mengetahui Kapan Berhenti Pengujian?

23

Saya tahu ini adalah pertanyaan yang sangat mendasar. Untuk beberapa aplikasi perangkat lunak ada sejumlah besar kasus uji yang sangat tinggi untuk suatu aplikasi. Tidak praktis untuk menguji semua kasus uji tersebut. Bagaimana kami memutuskan kapan harus berhenti pengujian? (selain "ketika uang habis").

rsman
sumber
3
ketika gagal ..
Javier
Saya pikir Anda akan menemukan posting blog Michael Bolton tentang menghentikan heuristik untuk pengujian yang bermanfaat untuk dibaca: http://www.developsense.com/blog/2009/09/when-do-we-stop-test// Anda mungkin mengenali beberapa orang heuristik telah menyarankan di utas ini.
testerab
Menurut pengalaman saya, sudah cukup dengan menerapkan prinsip Pareto .
Amir Rezaei

Jawaban:

3

Buku Glenford Myers The Art of Software Testing memiliki aturan sederhana namun berprinsip baik untuk ini: Pengujian selesai ketika Anda telah berhenti menemukan bug. Atau, lebih praktisnya, ketika kecepatan Anda menemukan bug baru sangat melambat.

Bug cenderung "mengelompok" dalam modul-modul tertentu dan fungsi-fungsi tertentu: Saat Anda menemukan bug dalam satu, Anda tahu bahwa Anda harus mencari bug lebih lanjut di dalamnya. Untuk menemukan bug, Anda dapat menggunakan teknik pengujian blackbox, pengujian whitebox, dan pengujian mutasi. Selama Anda menemukan bug, Anda tahu bahwa proses pengujian Anda berhasil!

Untuk memvisualisasikan kemajuan Anda, buat grafik jumlah bug yang ditemukan tim Anda per hari. Jika grafik menurun, maka Anda tahu teknik yang digunakan tim Anda tidak akan menemukannya. Tentu saja, jika Anda yakin teknik Anda tidak sesuai, maka silakan baca buku Myers dan terapkan prinsip-prinsipnya.

Sekarang, ada kemungkinan Anda mungkin tidak memiliki patch bug baru, dan tingkat menemukan bug akan sangat meningkat jika Anda terus menguji sedikit lebih banyak. Namun, jika Anda yakin teknik Anda bagus, ini tidak mungkin.

Macneil
sumber
Tingkat menemukan bug baru sangat tergantung pada faktor-faktor eksternal, dan sayangnya - beberapa manajer proyek akan mengatasinya. Cem Kaner mengutip contoh tim uji yang dikirim ke film sehingga tingkat penemuan bug akan turun, dan PM dapat mengirim.
testerab
14

Jawaban sederhana adalah itu tergantung pada sistem. Jika Anda menulis perangkat lunak tertanam untuk monitor jantung atau alat pemantauan keselamatan untuk reaktor nuklir maka standarnya jauh lebih tinggi daripada jika Anda menulis platform blogging.

Ini benar-benar pertanyaan untuk penguji sistem yang baik (dan saya bukan satu) tetapi saya akan mencobanya.

Ukuran dasar Anda akan menjadi cakupan uji: Berapa banyak aplikasi sebenarnya telah diuji (baik dengan uji unit dan secara fungsional).

Anda perlu menilai setiap kasus penggunaan potensial (dan parameter untuk kasus penggunaan itu) untuk kemungkinan penggunaan sebenarnya (sehingga Anda dapat menjatuhkan kasus tepi), kompleksitas (hal-hal sederhana yang cenderung mengandung bug, atau lebih cenderung mengandung keras untuk menemukan bug), biaya untuk menguji (dalam hal waktu) dan potensi dampak cacat jika ditemukan di daerah itu (di sinilah platform reaktor nuklir vs blogging).

Berdasarkan penilaian itu, Anda perlu menentukan yang mana yang akan diuji dan seberapa detail. Setelah Anda memiliki daftar seperti itu, tim (termasuk manajer produk / manajer proyek / perwakilan pengguna) dapat melalui daftar itu dan memprioritaskan berdasarkan kendala yang Anda miliki.

Salah satu teknik yang berguna untuk dipikirkan adalah Anda juga dapat memvariasikan use case yang diuji dengan setiap rilis. Misalnya, Anda mungkin memiliki daftar kasus uji non-kritis dan menguji setengah dari mereka dengan satu rilis dan setengah dengan yang berikutnya (kemudian bergantian). Dengan cara ini Anda meningkatkan cakupan tes total yang Anda dapatkan untuk upaya (meskipun dengan risiko bug regresi diperkenalkan).

Ini juga dapat diperluas ke pengujian platform - jika Anda mendukung dua ujung belakang basis data (atau beberapa browser) menguji setengah aplikasi pada satu, setengah lainnya pada yang lain dan kemudian menukar rilis berikutnya.

(Saya pikir ini disebut striping tetapi jangan mengutip saya tentang itu.)

Dan kemudian hal terakhir untuk dipikirkan bukanlah apa yang Anda uji tetapi apa yang sebenarnya Anda perbaiki ketika masalah ditemukan. Sudah umum untuk mengatakan "perbaiki semua bug" tetapi kenyataannya adalah bahwa ada tekanan waktu dan tidak semua bug sama. Sekali lagi, scrub bug reguler dengan semua pihak terkait adalah cara terbaik untuk maju. Ini sangat relevan di mana perbaikan bug mungkin sangat mengganggu karena pekerjaan tambahan dalam pengujian ulang dan pengujian regresi yang dihasilkannya mungkin lebih penting daripada manfaat perbaikannya.

Jon Hopkins
sumber
4

Ketika risiko yang terkait dengan penggunaan perangkat lunak telah berkurang ke tingkat yang dapat diterima.


sumber
7
Nah itu pernyataan masalahnya, baru saja diulang-ulang, bukan?
Martin Wickman
@ Martin: rupanya tidak. Daripada memulai dengan test case 1 dan diakhiri dengan test case ∞, jawaban ini harus mengarahkan penanya untuk memulai dengan test case yang paling penting dan selesai ketika mereka tidak lagi menambah nilai.
1
Meskipun secara filosofis benar (dan bijaksana), saya pikir OP sedang mencari sesuatu yang sedikit lebih langsung.
Martin Wickman
"dapat diterima" dapat didefinisikan sebelumnya. Itu sedikit membantu.
@ Thorbjørn: "Dapat didefinisikan". Ya tapi bagaimana? Itulah yang dicari OP.
Martin Wickman
3

"Pengujian program dapat digunakan untuk menunjukkan keberadaan bug, tetapi tidak pernah menunjukkan ketidakhadiran mereka!" --Edsger Dijkstra

Sesuatu yang baik untuk diingat ketika melakukan pengujian apa pun, otomatis atau sebaliknya. Anda hanya dapat membuktikan bahwa Anda belum menemukan bug lagi, bukan berarti tidak ada lagi.

Tetapi semakin banyak mata yang Anda masukkan pada bagian kode, semakin yakin Anda bisa melakukan operasi yang benar. Ini sangat mirip dengan kutipan Knuth tentang optimasi dalam hal itu: Anda dapat menguji hal-hal yang salah dengan sangat mudah, dan Anda dapat menguji pada waktu yang salah dalam pengembangan Anda.

Intinya, Anda ingin diliput di dua tempat besar:

  1. Apakah perangkat lunak tersebut lulus tes BDD yang menunjukkannya memenuhi persyaratan yang ditentukan. Perangkat lunak bahkan tidak bisa disebut selesai jika ini tidak benar.

  2. Apakah segmen yang paling kritis, kompleks, dan tidak pasti memiliki tes yang memadai untuk memberikan kepercayaan diri? Jika itu adalah loop inti, atau sesuatu yang harus Anda optimalkan atau hack: uji di atasnya. Jika rumit dan memiliki banyak pemisahan logis: lakukan banyak tes di atasnya. Jika Anda tidak dapat mengujinya, atau tertanam terlalu dalam untuk secara langsung menguji: pastikan kode telah ditinjau, dan kode secara tidak langsung diuji dengan tangan.

CodexArcanum
sumber
2

Jika Anda menunggu sampai proyek selesai, Anda memang akan memiliki jumlah kasus uji yang sangat besar. Jika Anda melakukan pengiriman terus-menerus, dengan fokus pada pengiriman kecil, Anda akan memiliki lebih sedikit kasus uji pada setiap iterasi dan Anda akan dapat menguji semuanya. Jika Anda tidak dapat melakukan pengiriman kecil, prioritaskan dan mulai pengujian dari prioritas terbesar dan lakukan pengujian hingga Anda harus berhenti.

Fernando
sumber
+1 untuk pengiriman kecil terus menerus dan pengujian awal. Ini juga memiliki efek cacat yang lebih mudah diperbaiki, karena programmer asli masih dalam konteks dan belum pindah ke area lain. Saya sekarang bekerja di lingkungan tempat kami melakukan ini dan menakutkan betapa jauh lebih produktifnya setiap orang.
testerab
2

Jika Anda berbicara tentang pengujian unit dan Anda melakukan TDD (menulis tes terlebih dahulu) maka ini bukan masalah: Anda hanya berhenti menguji ketika fitur selesai.

Dalam TDD tambahan, Anda menulis tes yang gagal, lalu menerapkan jumlah kode terkecil yang dapat lulus, kemudian refactor. Terus tambahkan tes dengan cara ini sampai metode selesai fitur.

Ini contoh yang bagus.

Brad Cupit
sumber
2

Para ahli statistik juga telah melihat masalah ini - sebenarnya pada awal tahun 1970-80an. Dengan asumsi yang tepat tentang bagaimana bug ditemukan, mereka mencoba memperkirakan jumlah bug dari data pengujian. Ini kemudian digunakan untuk menentukan kapan harus berhenti berdasarkan pada mengoptimalkan fungsi kerugian. Lihat misalnya https://rpubs.com/hoehle/17920 ... untuk perawatan singkat dari salah satu makalah tentang masalah ini termasuk kode R tentang cara melakukan ini dalam praktik.

Tentu saja satu masalah akan selalu menjadi asumsi tentang proses penemuan bug. Misalnya, dalam perawatan di atas diasumsikan bahwa bug ditemukan secara independen satu sama lain. Dalam praktiknya, memperbaiki satu bug besar dapat, misalnya, menyebabkan bug baru, dll. Tetapi itu memberi permulaan dan menambah perasaan usus.

mhatsu
sumber
1

Ketika tanggal pengiriman telah tiba. Tidak ada akhir untuk pengujian perangkat lunak. Tetapi sekali lagi ada sesuatu yang dikenal sebagai jadwal. Anda harus menguji sebagian besar fungsi Anda dalam waktu yang dijadwalkan dan memperbaiki bug yang Anda temui. Tidak ada cara Anda dapat menjamin bahwa perangkat lunaknya sempurna.

Manoj R
sumber
3
Jadi, bahkan jika Anda belum menguji setengahnya, Anda mengirimnya? Ini semua yang salah dengan pengembangan perangkat lunak. Anda tidak boleh lagi mengirim dengan pengujian tidak lengkap yang Anda tidak akan mengkodekannya.
Jon Hopkins
2
Ini hanya akan menghasilkan pengunduran diri psikologis tertentu dalam tester. Saya akan berpikir "tidak peduli apa yang saya lakukan, saya tidak dapat menguji hal ini sepenuhnya karena itu akan dikirimkan pada xth Januari jadi saya hanya akan melakukan apa pun yang saya bisa sampai saat itu". Bukan cara kita seharusnya membangun perangkat lunak bukan?
rsman
Sebagai seorang penguji sistem, saya jarang berada pada posisi di mana tanggal rilis tertunda untuk pengujian lebih lanjut. Saya tahu saya tidak akan pernah menguji apa pun sepenuhnya - apa yang saya coba lakukan adalah memprioritaskan. Jelas, kualitas panggilan yang saya lakukan tentang area mana yang akan diuji terlebih dahulu tergantung pada informasi yang saya dapatkan tentang risiko teknis dan kepentingan bisnis. Yang paling penting adalah bahwa itu SELALU harus menjadi keputusan bisnis dan bukan keputusan dev / test tentang tingkat risiko apa yang bersedia diambil oleh perusahaan. Kami dapat memberi saran, tetapi bisnislah yang harus memutuskan.
testerab
Meskipun saya sepenuhnya setuju: itu tidak dilakukan sampai diuji. (Saya cenderung setuju dengan gagasan bahwa kita akan lebih baik menggunakan istilah "memperbaiki fase" daripada fase pengujian.) Ketidaksepakatan saya hanya karena saya pikir pengujian secara inheren bersifat terbuka - Anda tidak pernah dapat menarik garis dan berkata "tidak ada lagi tes yang bisa kami lakukan sekarang", hanya "tidak ada lagi tes yang kami pikir layak untuk dilakukan sekarang".
testerab
1

Hal pertama yang akan diuji adalah "happy path", edge case, dan input yang tidak valid. Jika akan ada lebih dari satu pengguna secara bersamaan, Anda harus menguji masalah konkurensi seperti kondisi penguncian dan ras. Jika aplikasi menggunakan sumber daya eksternal, Anda harus menguji bagaimana aplikasi berperilaku ketika sumber daya tersebut tidak tersedia. Setelah itu, Anda dapat menggunakan kode untuk mencari hal-hal yang mungkin menyebabkannya rusak dan diuji untuk itu. Ketika semua tes lulus, rasio biaya / manfaat dari pengujian lebih lanjut mulai naik, jadi masuk akal untuk berhenti pada titik itu.

Larry Coleman
sumber
1

Semuanya bermuara pada kepercayaan diri. Apakah Anda merasa yakin bahwa sistem ini cukup teruji?

Jelas, "tingkat kepercayaan" sangat subyektif karena Anda tidak pernah bisa merasa benar-benar yakin, tetapi cukup yakin - dan itulah yang kami cari. Untuk itu, Anda perlu membuat daftar indikator, yang umumnya dikenal sebagai definisi selesai dan harus menjadi sesuatu yang disetujui seluruh tim Anda.

Berikut adalah beberapa tes terkait "Selesai-indikator":

  • Apakah pembuatan dan pemasangan Anda sepenuhnya otomatis dan semua pengujian (unit, gui, integrasi) dijalankan secara otomatis?
  • Apakah Anda menulis tes saat (atau sebaiknya sebelum) menulis kode, bukan setelahnya?
  • Apakah Anda merasa cukup aman untuk membuat refactoring kode besar tanpa memperkenalkan bug?
  • Apakah level cakupan kode Anda cukup tinggi?
  • Apakah Anda memiliki penguji khusus di tim Anda? Apakah dia terlibat setiap hari sepanjang pengembangan dan tidak hanya pada akhirnya?
  • Apakah penguji Anda secara manual (eksplorasi) mencoba memecahkannya tanpa hasil?

Jika Anda dapat memeriksa poin-poin ini, maka Anda mungkin dapat mengatakan bahwa Anda telah cukup menguji.

Martin Wickman
sumber
1

Tidak pernah, saya pikir Anda tidak akan pernah menyelesaikan pengujian dalam suatu sistem .. ada begitu banyak variabel yang tidak dapat Anda kelola.

Tapi, seperti yang kita tahu, Anda tidak dapat menguji "selamanya", jadi saya pikir batasnya pada dasarnya bergantung pada:

  • Ketika risiko yang terkait dengan penggunaan perangkat lunak telah berkurang ke tingkat yang dapat diterima. (seperti yang dikatakan @Graham Lee)
  • Siapa pengguna sistem? bisa jadi Anda atau presiden dari negara-negara bersatu. Dalam kasus pertama Anda tidak terlalu peduli jika bug muncul karena Anda menyelesaikannya dan selesai. Dalam kasus kedua Anda tidak ingin bug APA PUN muncul.
  • Apa hubungan Anda dengan klien Anda? Mungkin kliennya ayahmu, jadi tidak terlalu buruk, atau mungkin itu perusahaan besar.
  • Seberapa serius bagi pengguna sistem bug? Apakah ini akan menyebabkan perang dunia ketiga atau hanya pesan yang jelek?
Diego
sumber
0

Ketika orang-orang yang harus keluar pada penyebaran puas.

atau dalam beberapa kasus mayoritas pihak yang bertanggung jawab puas.

Tagihan
sumber