(Saya membayangkan ini akan menjadi pertanyaan wawancara yang bagus , tetapi dalam kasus saya ini lebih pragmatis dari itu.)
Kami memiliki aplikasi besar & kompleks yang memodelkan proses reaksi kimia yang sangat panjang dan canggih antara puluhan komponen kimia. Kami berada pada tahap merancang Tes Penerimaan untuk aplikasi, tetapi kami agak gentar dengan jumlah jalur yang mungkin sulit untuk diuji. Terpikir oleh saya bahwa situasi kami sangat mirip dengan apa yang harus dihadapi oleh tim pengembang Google Maps ketika tiba saatnya untuk menguji algoritma perencanaan rute dalam fitur "Dapatkan Arahan" mereka. Jelas mereka tidak dapat menguji (memverifikasi dan memvalidasi) setiap rute yang memungkinkan. Jadi, bagaimana mereka mendapatkan kepercayaan bahwa aplikasi mereka akan bekerja dalam setiap situasi?
Dan karena saya tidak berharap untuk mengetahui bagaimana mereka melakukannya, izinkan saya bertanya kepada Anda: Bagaimana Anda mendesain test suite dengan cakupan kode yang memadai, untuk memuaskan diri Anda bahwa aplikasi yang diberikan kuat - ketika itu benar-benar mustahil untuk menyelidiki setiap jalur potensial melalui sistem?
Apa yang saya cari adalah prinsip-prinsip yang akan Anda gunakan untuk memecah masalah yang tak terselesaikan menjadi bagian-bagian yang lebih kecil, dapat ditelusuri, jumlah yang memberikan perkiraan yang memuaskan dari keseluruhan: "Saya tidak bisa menguji semuanya, tapi saya bisa menguji ini , ini dan ini - dan itu sudah cukup. " Saya tidak mencari pendekatan yang "terbukti benar", melainkan pendekatan yang bijaksana , mengingat keterbatasan waktu / anggaran dunia nyata.
(Saya menggunakan contoh peta Google sebagai sesuatu dari kertas untuk mengumpulkan jawaban yang sespesifik mungkin.)
Jawaban:
Saya bekerja di bidang navigasi mobil lebih dari satu dekade yang lalu.
Langkah A) Gunakan paket referensi dan pilih set sampel besar, jalankan tes A / B. Tidak mencari ketepatan, mencari outlier - Rangkaian referensi menunjukkan Reroute 1234 sejauh 10,34 km, dan kami menghitung 123,5km.
Langkah B) - Saring perangkat lunak kami dan perangkat lunak referensi - Tambahkan lebih banyak sampel dan kurangi toleransi.
Langkah C) - Pengujian internal menggunakan pengetahuan lokal di seluruh rangkaian data global.
Langkah D) UAT ... "Tes Penerimaan Pengguna" Seperti dalam "Jual barang ini dan lihat apa yang paling dikeluhkan pelanggan"
Jika Anda pernah menggunakan produk pemetaan sekitar pertengahan 1990-an, Anda tahu apa yang saya maksud, kami yang masih memeriksa setiap belokan arah secara bergantian.
Kembali ke pertanyaan Anda contoh. Apa yang Anda tanyakan adalah bagaimana membuktikan bahwa suatu perangkat lunak benar. Jika Anda ingin bukti matematis, telah terbukti dapat dilakukan - untuk perangkat lunak sederhana dengan harga yang melebihi anggaran realistis, untuk paket perangkat lunak yang kompleks, yah, itu masih penelitian .... NASA memiliki model untuk menulis perangkat lunak yang sangat andal dalam harga yang dapat dikelola secara ekonomi, seperti halnya DoD dan industri penerbangan - meskipun masih jauh lebih tinggi daripada kebanyakan yang bersedia membayar. Pada akhirnya, tergantung pada seberapa banyak Anda siap untuk membayar .....
Sunting: Saya baru saja membaca ulang OP Anda. Tampaknya apa yang Anda cari adalah cara cepat dan murah untuk Menguji kualitas perangkat lunak yang kompleks. Anda tidak dapat menguji kualitas. Anda harus memiliki proses yang kuat sehingga Anda tahu bahwa apa yang dibangun berfungsi dengan benar. Jika Anda harus berpikir tentang cara membuktikannya benar dan Anda sudah memiliki "aplikasi besar dan kompleks", Anda sudah terlambat.
sumber
Kami salah satu pesaing Google. Jawaban kita? Pada dasarnya dua.
Pertama, kami menghitung solusi alamat-ke-alamat yang lengkap. Yup, itu matriks besar. Lebih buruk lagi, kami melakukannya sepanjang waktu, sepanjang hari dalam seminggu. Ada kesamaan yang cukup di domain input untuk cache hasil antara, yang membuat masalah bisa diselesaikan. Namun, cobalah untuk mendapatkan tingkat curah pada harddisk.
Perhatikan bahwa perhitungan offline ini dilakukan dengan menggunakan algoritma yang berbeda. Ini menggunakan jauh lebih banyak memori daripada algoritma yang ingin kami uji, tetapi tidak lebih linear (yaitu menggunakan kurang dari 1000 kali lebih banyak memori ketika menghitung seribu rute).
Kedua, pengguna yang berpartisipasi memberi kami hasil dunia nyata. Kami memvalidasi jutaan rute yang digerakkan. Apakah rute aktual secepat yang diperkirakan?
Dan tentu saja, Anda memang menemukan bug seperti itu. Setiap saat. Misalnya bentangan jalan yang dibatasi di kedua sisi oleh "zona hanya lalu lintas lokal" *. Hanya ada satu cara;) yang akan Anda temukan dalam pengujian, dan saat itulah Anda merencanakan rute ke jalan tertentu.
* "Zona khusus lalu lintas lokal" hanya dapat digunakan saat Anda memulai atau mengakhiri rute di zona tersebut. Karenanya, bentangan di tengah terputus dari jaringan jalan utama. Ini bisa berupa zonasi atau peta kesalahan.
sumber
Ini tidak seperti google menulis kode terpisah untuk setiap pasangan alamat di dunia. Dengan pengecualian heuristik yang menghasilkan skala yang lebih besar, algoritme untuk perjalanan 3 kaki persis sama dengan untuk 3000 kaki. Anda benar-benar menguji jalur yang lebih pendek dan menggunakan induksi untuk menunjukkan pengujian berlaku untuk jalur yang lebih panjang juga.
Anda memilih sampel yang sehat dari rute dunia nyata, dan memeriksanya terhadap apa yang muncul dari manusia. Anda membayar banyak perhatian untuk memberikan umpan balik kepada pengguna di rilis pertama Anda, dan membuatnya mudah bagi mereka untuk memberikannya. Anda menguji kondisi batas, seperti apakah rute terbaik sebenarnya mengharuskan bepergian jauh dari tujuan untuk sementara waktu, atau jika rute terpendek berdasarkan jarak memiliki 18 belokan dibandingkan dengan rute yang lebih langsung yang sedikit lebih lama. Anda melakukan pengujian negatif, seperti jika Anda mencoba mengemudi dari California ke Hawaii, dan memastikan telur paskah yang pintar ada di tempatnya.
sumber