Katakanlah kita memiliki algoritma pencarian rute kami:
def myHeuristicTSP(graph):
/*implementation*/
return route
Sekarang kami ingin menguji unit ini:
class TestMyHeuristicTSP:
def testNullGraphRaiseValueError(self):
self.assertRaises(ValueError, myHueristicTSP(None))
def testSimpleTwoNodeGraphReturnsRoute:
self.assertEquals(expectedResult, myHeuristicTSP(input))
Pertanyaannya adalah, untuk algoritma TSP non-heuristik, kita dapat memberikan berbagai grafik dan memeriksa apakah mereka selalu mengembalikan rute terpendek secara absolut.
Tetapi karena algoritma heurtistik, sementara masih deterministik, kurang dapat diprediksi, apakah hanya dimaksudkan untuk memahami bagaimana algoritma itu dimaksudkan untuk bekerja, dan menemukan kasus tepi itu?
unit-testing
heuristics
djohnston
sumber
sumber
Jawaban:
Untuk algoritma heuristik yang seharusnya tidak mengembalikan solusi ideal tetapi "cukup baik", Anda akan memiliki berbagai kasus uji dan memeriksa
sumber
Sebagian besar algoritma pengoptimalan (termasuk heuristik) berfungsi pada beberapa konfigurasi (dalam contoh Anda rute) dengan menerapkan operasi pada mereka. Operasi untuk dirinya sendiri harus menjamin bahwa mereka hanya memberikan konfigurasi yang valid, jadi pertama-tama harus ada unit test untuk masing-masing. Ketika Anda tahu pasti algoritma pengoptimalan hanya menggunakan operasi-operasi itu, biasanya tidak perlu ada uji validitas untuk hasil algoritma.
Untuk membuat unit test yang baik untuk semua jenis algoritma yang lebih kompleks, kita harus mengetahui algoritma itu sendiri secara detail . Untuk heuristik sederhana seperti "mendaki bukit", Anda biasanya dapat memprediksi hasil untuk input kecil. Misalnya, untuk rute awal 3 hingga 5 poin, ketika diberikan dalam urutan tertentu, Anda dapat memprediksi apa yang akan terjadi. Ini akan tetap berlaku untuk sebagian besar algoritma heuristik deterministik yang saya ketahui, jadi itu mungkin tempat yang baik untuk memulai.
Untuk algoritma yang lebih kompleks, dan ukuran input yang lebih besar, ketika Anda hanya memasukkan input ke dalam algoritma dan mencoba memeriksa output, Anda sebenarnya tidak melakukan tes unit lagi, Anda sedang melakukan tes penerimaan atau integrasi. Alasan mengapa Anda memiliki masalah untuk "tes unit" algo seperti itu karena biasanya terdiri dari segelintir bagian yang lebih kecil (unit individu). Jadi untuk unit yang benar-benar menguji algoritma semacam itu, Anda harus mengidentifikasi bagian-bagian itu dan mengujinya secara individual. Selain itu, Anda dapat menggunakan cakupan kode atau teknik cakupan cabang untuk memastikan Anda memiliki cukup kasus uji.
Jika Anda tidak mencari tes unit, tetapi tes penerimaan atau integrasi otomatis, Anda dapat mencoba apa yang disarankan oleh @Phillip pada (2) atau (3) .
sumber