Saya harus mengakui: Saya sedang membaca
Majalah ACM . Itu membuat saya seorang "kutu buku," bahkan oleh standar programmer. Antara lain, saya belajar dari majalah ini tentang "pengujian metamorf". Saya belum pernah mendengar tentang dia sebelumnya, seperti semua orang yang saya tanyakan. Tetapi literatur ilmiah tentang topik ini secara mengejutkan sangat banyak: ada banyak contoh penerapannya yang sangat sukses dalam bidang penelitian yang sangat berbeda. Jadi mengapa kita belum pernah mendengar tentang dia sebelumnya? Hanya ada
satu artikel untuk orang di luar komunitas ilmiah. Sekarang biarlah ada dua dari mereka.
Latar Belakang Singkat
Kebanyakan tes tertulis menggunakan
nubuat . Artinya, Anda tahu jawabannya dan secara eksplisit memeriksa apakah perhitungannya memberikan jawaban yang benar.
def test_dist(): p1 = (0, 3) p2 = (4, 0) assert dist(p1, p2) == 5
Selain tes oracle, ada juga tes manual. Penguji duduk di depan komputer dan membandingkan data input dengan hasilnya. Ketika sistem menjadi lebih kompleks, pengujian manual menjadi semakin tidak bermanfaat. Masing-masing dari mereka hanya memeriksa satu titik di ruang keadaan yang jauh lebih besar, dan kita membutuhkan sesuatu yang mengeksplorasi seluruh ruang keadaan.
Ini membawa kita ke
pengujian generatif : tes menulis yang mencakup set acak dalam ruang keadaan. Gaya pengujian generatif yang paling populer adalah
pengujian berbasis properti , atau PBT. Kami menemukan "properti" dari fungsi, dan kemudian menghasilkan nilai input dan memeriksa apakah nilai output cocok dengan properti ini.
def test_dist(): p1 = random_point() p2 = random_point() assert dist(p1, p2) >= 0
Keuntungan PBT adalah mencakup lebih banyak ruang. Kerugiannya adalah hilangnya kekhususan. Ini bukan
lagi ujian oracle! Kita tidak tahu harus menjawab apa, dan fungsinya mungkin keliru, tetapi dengan cara yang memiliki properti yang sama. Di sini kita mengandalkan heuristik.
Masalah serius dengan PBT adalah menemukan properti yang bagus. Sebagian besar fungsi memiliki sifat umum, sederhana dan kompleks, spesifik.
Properti umum dapat diterapkan ke sejumlah besar fungsi, tetapi mereka tidak memberi kami banyak informasi. Properti yang lebih spesifik memberikan lebih banyak informasi, tetapi lebih sulit ditemukan dan hanya dapat diterapkan di bidang tugas terbatas. Jika Anda memiliki fungsi yang menentukan apakah grafik asiklik, maka tes properti apa yang akan Anda tulis? Akankah mereka memberi Anda keyakinan bahwa fungsinya benar?
Motivasi
Sekarang pertimbangkan tugas yang lebih kompleks. Bayangkan Anda ingin menulis konverter speech-to-text (STT) untuk bahasa Inggris. Ini menerima file suara, dan menampilkan teks. Bagaimana Anda mengujinya?
Cara termudah untuk menggunakan oracle tangan. Mendikte kalimat dan periksa apakah teks output cocok dengan itu. Tetapi ini bahkan tidak cukup dekat! Jangkauan bicara manusia
sangat besar . Akan lebih baik untuk menguji 1.000 atau bahkan 10.000 file suara yang berbeda. Oracle genggam dengan transkripsi akan terlalu mahal. Ini berarti bahwa kita harus menggunakan pengujian berbasis properti sebagai gantinya.
Tetapi bagaimana kita menghasilkan input? Misalnya, kita dapat membuat garis acak, meneruskannya melalui konverter teks-ke-ucapan (text-to-speech, TTS), dan kemudian memastikan bahwa STT kami menghasilkan teks yang sama. Tetapi ini sekali lagi memberi kita jangkauan suara manusia yang sangat terbatas. Bisakah TTS membuat perubahan intonasi, kata “menelan”, meniru aksen yang kuat? Jika kita tidak bisa mengatasinya, apakah STT akan sangat berguna? Lebih baik menggunakan teks sewenang-wenang, misalnya, rekaman dari radio, dari podcast dan video online.
Sekarang muncul masalah baru. Saat menggunakan TTS, kami mulai dengan teks tertulis. Dalam hal file suara acak, kami tidak memilikinya, dan pada saat yang sama kami tidak ingin menyalin secara manual. Sebaliknya, kami dibatasi untuk menggunakan properti. Properti apa yang perlu kita uji? Contoh properti paling sederhana: "program tidak macet dengan data yang masuk" (properti bagus) atau "tidak mengubah musik akustik menjadi kata-kata" (mungkin?). Properti ini tidak mencakup verifikasi tugas utama program dengan sangat baik dan sedikit meningkatkan kepercayaan terhadap kualitasnya.
Jadi, kami memiliki dua tugas. Pertama, kita membutuhkan sejumlah besar input dalam bentuk pidato. Kedua, kita perlu memahami bagaimana mengubahnya menjadi tes yang bermanfaat tanpa menghabiskan waktu berjam-jam untuk menerjemahkan suara menjadi oracle.
Pengujian metamorf
Untuk semua ini, output dipertimbangkan secara terpisah. Bagaimana jika kita menanamkannya dalam konteks yang lebih luas? Misalnya, jika klip suara ditranskripsi ke output keluar, maka kita harus
selalu out
dengan:
- Volume naik dua kali lipat
- Frekuensi meningkat
- Tingkatkan kecepatan
- Menambahkan suara latar
- Menambahkan kebisingan kendaraan
- Kombinasi apa pun di atas.
Ini semua adalah transformasi "sederhana" yang dapat kita uji dengan mudah. Misalnya, untuk pengujian dengan "kebisingan kendaraan", kita dapat mengambil 10 sampel kebisingan mobil, menaruhnya di klip suara dan memeriksa apakah hasil pengakuan dari semua 11 versi cocok. Kami dapat menggandakan atau menambah volume, mengubah 11 versi menjadi 33 versi, dan kemudian menggandakan kecepatan untuk mendapatkan 66 versi. Prinsip ini dapat diterapkan untuk setiap klip suara di database kami, secara signifikan memperluas ruang data yang masuk.
Kehadiran 66 versi untuk perbandingan cukup nyaman. Tapi itu belum semuanya: kita masih tidak perlu tahu seperti apa hasilnya. Jika semua 66 konversi
out
, maka tes berhasil, jika setidaknya satu mengembalikan yang lain, maka tes gagal. Pada tahap apa pun kita perlu memeriksa apa yang terkandung di dalamnya. Ini sangat penting. Jadi kami secara signifikan meningkatkan ruang uji dengan sangat sedikit keterlibatan manusia. Misalnya, kita dapat mengunduh episode dari seri tersebut, melakukan konversi, dan memeriksa apakah semua hasil konversi ke teks
1 cocok. Kami mendapat tes yang bermanfaat
tanpa mendengarkan klip suara . Sekarang kita dapat menghasilkan tes yang kompleks dan mendalam tanpa menggunakan oracle!
Dua set data input, serta data outputnya terhubung satu sama lain. Properti yang terkait dengan set data masuk / keluar disebut
tautan metamorf 2 . Pengujian yang menggunakan properti ini disebut
pengujian metamorf . Dalam sistem yang kompleks, hubungan metamorfik yang menarik dapat ditemukan lebih mudah daripada sifat menarik dari data masuk / keluar individu.
Mari kita nyatakan sedikit lebih formal: jika kita memiliki
x
dan
f(x)
, maka kita dapat melakukan beberapa transformasi
x
untuk mendapatkan
x2
dan
f(x2)
. Dalam kasus STT, kami hanya memeriksa
f(x) = f(x2)
, tetapi kami dapat menggunakan hubungan apa pun antara dua set data. Mungkin ada hubungan metamorfik seperti
f(x2) > f(x)
atau "is
f(x2)/f(x)
nilai integer." Dengan cara yang sama, prinsip ini dapat diperluas ke beberapa set data input menggunakan
f(x)
dan
f(x3)
. Contohnya adalah membandingkan hasil mesin pencari tanpa filter dengan hasil mesin dengan satu atau dua filter. Di sebagian besar deskripsi kasus penggunaan yang saya baca, hanya dua set data input yang digunakan, karena bahkan mereka cukup untuk menemukan bug gila.
Contoh Penggunaan
Berbicara tentang kasus penggunaan: seberapa efektif pengujian metamorf dalam praktik? Membicarakan teknik secara abstrak atau memberi contoh buatan adalah satu hal. Studi kasus bermanfaat karena tiga alasan. Pertama, ini menunjukkan apakah metode ini benar-benar berfungsi. Kedua, dari mereka Anda dapat belajar tentang kesulitan potensial saat menggunakan MT. Ketiga, contoh menunjukkan kepada kita
bagaimana kita dapat menggunakan teknik ini. Setiap koneksi metamorf yang digunakan dalam contoh penggunaan dapat dicoba untuk beradaptasi dengan solusi dari masalah kita.
Pengujian Metamorf: Tinjauan Tantangan dan Peluang memberikan daftar banyak penelitian, tetapi semuanya adalah artikel ilmiah. Di bawah ini adalah yang paling menarik. Artikel yang ditandai dengan
(pdf)
ditata, seperti yang Anda duga, dalam PDF.
Masalah
Oh, jadi
semua sumber ini ada dalam PDF.
Butuh beberapa jam untuk menemukan semua artikel ini. Dan masalah ini terkait dengan hambatan terbesar untuk pengembangan MT: semua tautan di atas adalah
pracetak atau draf pertama artikel ilmiah masa depan. Ketika saya mulai memahami teknik yang tidak banyak diketahui, saya pertama-tama bertanya pada diri sendiri pertanyaan: "mengapa mereka tidak banyak diketahui?" Kadang-kadang alasannya jelas, kadang-kadang itu adalah serangkaian alasan kecil yang kompleks, kadang-kadang masalahnya hanya karena metodologinya “kurang beruntung”.
Dalam kasus MT, masalahnya jelas.
Hampir semua informasi tersembunyi di balik paywall ilmiah. Jika Anda ingin belajar MT, Anda memerlukan akses ke jurnal, atau Anda perlu menghabiskan beberapa jam mencari cetakan
3 .
Studi lebih lanjut
Penemu MT adalah
Ty Chen . Dia menjadi kekuatan pendorong banyak penelitian. Peneliti lain di bidang ini adalah
Zhi Quan Zhou dan
Sergio Segura ; keduanya memposting semua pracetak mereka di Internet. Sebagian besar pekerjaan penelitian dilakukan oleh salah satu dari orang-orang ini.
Mungkin tempat terbaik untuk memulai adalah dengan
Pengujian Metamorf: Tinjauan Tantangan dan Peluang dan
Survei tentang Pengujian Metamorf . Meskipun artikel ini ditulis tentang
pengujian metamorf, peneliti juga menerapkan hubungan metamorf secara umum untuk berbagai disiplin ilmu lain, misalnya, verifikasi kode formal dan debugging. Saya belum mempelajari area penerapan teknik ini secara rinci, tetapi mungkin perlu untuk melihatnya juga.
Dari sudut pandang penerapan, secara teoritis dimungkinkan untuk mengadaptasi sebagian besar perpustakaan PBT untuk memverifikasi properti metamorf. Bahkan, contoh pertama di
Quickcheck adalah pengujian MS, dan dalam esai
ini tentang PBT, MS diterapkan secara tidak langsung.
Secara umum, menurut saya sebagian besar penelitian PBT berfokus pada menghasilkan dan memotong data yang masuk secara efisien, dan penelitian MT terutama berfokus pada menentukan apa yang benar-benar perlu kita uji. Akibatnya, teknik-teknik ini cenderung saling melengkapi.
Terima kasih kepada Brian Ng untuk bantuan penelitian.Catatan tambahan: permintaan
Sebenarnya, tidak mengherankan bahwa saya belum pernah mendengar teknik ini sebelumnya. Ada banyak teknik yang sangat menarik dan berguna yang tidak bisa meninggalkan gelembung kecil mereka. Saya mengetahui tentang MTs melalui keberuntungan daripada pencarian aktif.
Jika Anda tahu sesuatu yang layak digunakan secara luas,
silakan menulis kepada saya .
- Yah, mungkin ada masalah yang jelas: mungkin ada musik di podcast, fragmen pidato dalam bahasa lain, dll. Tapi teorinya bisa diandalkan: jika kita bisa mendapatkan sampel pidato, kita bisa menggunakannya sebagai bagian dari tes tanpa transkripsi / markup manual awal.
- Dalam spesifikasi, ide yang sesuai adalah hyperproperties - properti set perilaku, bukan perilaku individu. Sebagian besar studi spesifik berhubungan dengan keamanan HS. Seperti yang saya pahami, HS-nya adalah superset dari MS.
- Saya memiliki hipotesis kedua, yang sekarang tidak terbukti, karena sebagian besar peneliti utama dari Cina dan Hong Kong, mungkin teknik ini lebih dikenal di komunitas pemrogram yang berkomunikasi dalam bahasa Mandarin, daripada bahasa Inggris. Brian Eun menguji hipotesis ini untuk saya, tetapi tidak menemukan tanda-tanda signifikan penggunaan teknik oleh orang Cina.