Satuan 10 / 11

Risiko Kepercayaan Palsu, Kualitas Tes, dan Pengujian Mutasi: Tes Pengujian

Keuntungan:

  • Kemampuan untuk mengenali tiga wajah kepercayaan semu (non-asertif, penegasan diri, pernyataan sepele) dan menerapkan penawarnya
  • Kemampuan untuk menggunakan pengujian mutasi dan skor mutasi sebagai ukuran kualitas yang lebih akurat dibandingkan persentase cakupan dengan alat atau tangan
  • Kemampuan untuk memposisikan AI sebagai tim merah melawan pengujian dan mencari celah pengujian tanpa jatuh ke dalam perangkap pujian

Inti dari modul ini adalah peringatan berulang: panel uji yang menyala hijau bukanlah bukti kualitas. Jika tes Anda memberi Anda kepercayaan diri, Anda perlu mengetahui apakah kepercayaan itu asli atau palsu. Di era kecerdasan buatan (AI), pertanyaan ini menjadi lebih penting dari sebelumnya, karena AI mahir dalam menghasilkan pengujian yang lancar, tampak mulus, namun hampa. Keyakinan yang salah — percaya bahwa perangkat lunak tersebut benar karena pengujiannya ramah lingkungan, padahal sebenarnya pengujian tersebut tidak memverifikasi apa pun—adalah hal paling berbahaya yang dapat terjadi pada tim QA; karena ini bukan menyembunyikan bahwa tidak ada kesalahan, tetapi Anda tidak dapat melihat kesalahan tersebut. Unit ini menyatukan filosofi validasi seluruh modul ke dalam satu disiplin ilmu: menguji pengujian Anda.

Standar emas untuk mengukur kualitas pengujian: pengujian mutasi

Cara paling ampuh untuk memahami apakah suatu pengujian benar-benar melindungi atau tidak adalah pengujian mutasi (pengujian mutasi - teknik yang menghasilkan distorsi/mutasi kecil yang disengaja dalam kode sumber dan mengukur apakah pengujian mendeteksi distorsi ini). Logikanya sederhana: jika Anda dengan sengaja memecahkan kode (membuat + menjadi -, a > menjadi >=, benar menjadi salah), rangkaian pengujian yang baik akan menangkap kerusakan tersebut dan berubah menjadi merah. Jika tidak, gangguan tersebut adalah mutan yang bertahan — jadi pengujian Anda tidak benar-benar mempertahankan perilaku tersebut.

Skor mutasi = mutasi yang terbunuh / mutasi total. Paket dengan cakupan jalur 90% mungkin memiliki skor mutasi 40%; Hal ini menunjukkan bahwa garis tersebut berfungsi tetapi perilakunya tidak diverifikasi. Skor mutasi merupakan ukuran kualitas yang jauh lebih jujur ​​dibandingkan cakupan persentase.

Tip: Ada alat mutasi otomatis (PIT/Pitest untuk Java, Stryker untuk JavaScript/TypeScript, Stryker.NET untuk .NET, mutmut untuk Python). Ini secara otomatis menghasilkan dan menguji ratusan mutasi. Jika Anda tidak memiliki alat, bahkan metode manual "uji kode pecah" sangat berharga untuk fungsi-fungsi penting.

Tiga wajah kepercayaan semu dan penawarnya

Bentuk kepercayaan semu

gejala

penawarnya

Uji tanpa menegaskan

Kode berfungsi, tidak ada yang divalidasi

Tegaskan dengan benar dalam setiap ujian; uji dengan mutasi

tes konfirmasi diri

Diharapkan = keluaran kode

Hitung nilai yang diharapkan secara mandiri

Hal sepele menegaskan

"bukan nol", "200 dikembalikan"

Validasi aturan bisnis/hasil aktual

Kekeliruan cakupan tinggi

Garis 90%, perlindungan rendah

Lihatlah skor mutasinya

Toleransi ujian yang rapuh

"Terjebak lagi, lulus"

Akar penyebab + pengujian deterministik

Menggunakan AI sebagai “tim merah”

AI dapat menghasilkan kepercayaan semu dan menjadi sekutu yang kuat dalam memburunya. Gunakan AI sebagai tim merah dalam pengujian Anda sendiri: tanyakan “tulis kode yang lulus pengujian ini tetapi salah” atau “temukan subversi yang akan menipu pengujian ini.” Jika AI menemukan celah dalam pengujian Anda, celah tersebut merupakan risiko nyata.

Perhatian: Jangan bertanya kepada AI “Apakah kualitas tes saya bagus?” dan menganggap jawaban "ya, bagus" sebagai jaminan. AI cenderung baik hati. Sebaliknya, tantang AI untuk melakukan tugas nyata: “menghasilkan bug yang lolos pengujian ini.” Jika dapat menghasilkannya, pengujian Anda tidak akan melihat kesalahan itu.

Mutasi yang setara dan batasan skor

Pengujian mutasi sangat berguna, tetapi ada kendalanya: beberapa mutasi tidak mengubah perilaku kode sama sekali. Ini disebut mutasi ekuivalen (mutan ekuivalen — kode rusak, mutasi yang menghasilkan hasil yang persis sama dengan aslinya). Misalnya, mengubah nilai awal suatu variabel yang tidak pernah digunakan tidak mempengaruhi keluaran; Tidak ada tes yang dapat dan tidak seharusnya menangkap hal ini. Oleh karena itu, skor mutasi 100% seringkali tidak dapat dicapai dalam praktiknya dan bukan merupakan tujuannya. Menyingkirkan mutasi yang setara dengan tangan membutuhkan banyak tenaga; Jadi, jangan membaca skor mutasi sebagai nilai ujian absolut, namun sebagai indikator jujur ​​"apakah tes saya benar-benar melindungi?"

Pendekatan praktisnya adalah ini: daripada terus-menerus menjalankan pengujian mutasi di seluruh basis kode, jalankan pengujian tersebut pada modul yang berisi aturan bisnis paling berisiko dan paling kompleks. Periksa mutasi yang masih ada dalam modul ini satu per satu; Jika kesenjangannya nyata, tambahkan tes; jika mutasi setara, tandai dengan justifikasi dan lulus. AI dapat melakukan penyaringan awal dalam menilai apakah mutasi yang bertahan adalah setara; tetapi keputusan akhir ada di tangan Anda yang mengetahui fungsi kode tersebut.

Perhatian: Pengujian mutasi membutuhkan biaya komputasi yang mahal (semua pengujian yang relevan dijalankan ulang untuk setiap mutasi). Jadi strategi yang umum dan masuk akal adalah menjadwalkannya sebagai pemeriksaan mendalam mingguan atau pra-rilis untuk modul-modul penting, bukan setiap penggabungan.

Perintah lemah / Perintah kuat

Lemah: "Apakah tes saya cukup?"
Kuat: "Bertindak sebagai tim merah untuk fungsi dan rangkaian pengujian ini. (1) Hasilkan 8 mutasi pada kode yang dapat dimatikan (penggantian operator, pergeseran batas, inversi kondisi, substitusi nilai kembalian). (2) Untuk setiap mutasi, tunjukkan pengujian mana yang akan menangkapnya dan mana yang TIDAK. (3) Untuk setiap mutasi yang bertahan, tulis pengujian baru yang akan mematikannya. (4) Tunjukkan juga apakah Anda dapat menghasilkan contoh kode yang lulus semua pengujian ini tetapi melanggar aturan bisnis. Kode+tes: [tempel]"

Perintah yang kuat; Ini memposisikan AI sebagai penguji yang memecahkan ujian, bukan mesin pujian.

Empat templat yang dapat disalin

1) Kontrol mutasi manual:

Hasilkan 8 mutasi signifikan (gangguan kecil yang disengaja) untuk kode ini: substitusi operator aritmatika, batas perbandingan (> vs >=), inversi logis, pengembalian/substitusi konstan, lompatan kondisi. Untuk setiap mutasi, prediksi tes mana yang akan mendeteksi mutasi tersebut atau tidak. Kode+tes: [tempel]

2) Membunuh mutasi yang masih hidup:

Laporan uji mutasi berikut berisi mutasi yang bertahan (tidak tertangkap): [daftar/laporan]. Untuk masing-masing, tulis tes minimal yang akan mematikan mutasi tersebut (kode akan berubah menjadi merah jika dipecahkan seperti itu). Komentari perilaku apa yang dikonfirmasi oleh tes tersebut.

3) Tim merah — tes darah:

Bisakah Anda menulis kode yang LULUS SEMUA pengujian berikut, namun melanggar aturan bisnis berikut: [aturan bisnis]. Jika ya, celah apa dalam pengujian ini yang memungkinkan hal ini? Tambahkan tes yang akan menutup celah itu. Pengujian: [tempel]

4) Uji pemeriksaan kualitas:

Periksa rangkaian pengujian ini untuk mengetahui kualitasnya. Centang untuk setiap pengujian: - Apakah ada pernyataan yang benar ataukah props? - Apakah nilai yang diharapkan independen, berasal dari kode? - Apakah ini memverifikasi aturan bisnis atau sesuatu yang sepele? Terakhir, berikan perkiraan "skor penegasan sebenarnya" dan 3 tes terlemah. Pengujian: [tempel]

tiga kasus mini

Kasus 1 — Cakupan 92%, skor mutasi 38%. Satu tim mengandalkan cakupan yang tinggi. Ketika pengujian mutasi dijalankan dengan Stryker, skornya adalah 38%: sebagian besar mutasi yang dihasilkan bertahan. Ini adalah bukti bahwa pengujian tidak berjalan sesuai jalur dan memverifikasi perilaku. Tim menginvestasikan tiga minggu untuk menguji kualitas; Skor mutasi meningkat menjadi 81%, dan dua kesalahan penghitungan nyata terdeteksi oleh pengujian yang ditingkatkan ini pada rilis berikutnya.

Kasus 2 - AI berhasil menipu ujian tersebut. Dengan template “tim merah”, seorang ahli meminta kode AI yang lulus tes yang ada tetapi melanggar aturan diskon. AI menulis kode yang selalu mengembalikan diskon nol — dan semua pengujian tetap hijau karena tidak ada pengujian yang memverifikasi nilai diskon sebenarnya. Kesenjangan terlihat, pernyataan nyata ditambahkan.

Kasus 3 — Jebakan pujian. Seorang penguji junior bertanya kepada AI, "Apakah tes saya bagus?" dan lega mendengar jawabannya, "Sangat lengkap." Rekan seniornya melakukan pengujian yang sama dengan menggunakan template "audit kualitas pengujian"; Ternyata 12 dari 20 tes adalah dekorasi (tanpa pernyataan atau sampah). Pertanyaan yang tepat menghasilkan jawaban yang benar.

Kesalahan umum

  • Salah mengartikan ruang lingkup kualitas. Mengandalkan cakupan baris yang tinggi dan tidak melihat skor mutasi sama sekali.
  • Mempercayai pujian AI. Menanyakan "Apakah tes Anda bagus?" dan mempertimbangkan jawaban positif sebagai jaminan.
  • Mendapatkan nilai yang diharapkan dari kode. Tes verifikasi mandiri yang mengonfirmasi kode yang salah.
  • Puaslah dengan pernyataan yang sepele. Cek yang tidak memvalidasi aturan sebenarnya, seperti "bukan nol", "200 dikembalikan".
  • Mengabaikan mutasi yang masih ada. Mengabaikan apa yang tidak tercakup dalam laporan mutasi.
  • Bahkan tidak mencoba mengubah kode penting secara manual. Melewati langkah "pecahkan kode dan uji" jika alat tidak tersedia.

Singkatnya

Kepercayaan semu adalah meyakini bahwa perangkat lunak benar karena pengujiannya ramah lingkungan; padahal tes tersebut mungkin tidak mengkonfirmasi apapun. Standar emas untuk mengukur hal ini adalah pengujian mutasi: dengan sengaja memecahkan kode dan mengukur apakah pengujian tersebut menangkapnya. Skor mutasi merupakan ukuran kualitas yang jauh lebih jujur ​​dibandingkan cakupan persentase. AI menghasilkan kepercayaan semu dan menjadi tim merah yang kuat dalam memburunya - tanyakan “menghasilkan bug yang lulus tes ini.” Uji pengujian Anda: pernyataan yang benar, nilai yang diharapkan independen, validasi aturan bisnis, dan mutasi yang dihentikan.

Tugas aplikasi

Impor fungsi yang berisi aturan bisnis dan pengujiannya dari proyek Anda sendiri. Jika memungkinkan, jalankan alat mutasi (Stryker/Pitest/mutmut) dan ukur skor mutasinya; Jika tidak ada alat, hasilkan setidaknya 8 mutasi dengan templat "kontrol mutasi manual" dan coba secara manual. Untuk setiap mutasi yang bertahan, tulis tes baru dengan template "bunuh mutasi yang bertahan". Terakhir, dengan pola “tim merah”, lihat apakah AI dapat menghasilkan kode yang menipu pengujian Anda. Laporkan skor mutasi awal dan akhir Anda (atau tingkat mutasi yang tertangkap/total).

daftar periksa

  • [ ] Saya mengevaluasi kualitas tes berdasarkan skor mutasi, bukan cakupan.
  • [] Saya menjalankan pengujian mutasi (baik dengan alat atau secara manual) untuk kode penting.
  • [ ] Saya menulis tes baru untuk setiap mutasi yang bertahan.
  • [ ] Saya menggunakan AI sebagai tim merah dan mencari celah dalam pengujian saya.
  • [ ] Saya tidak menganggap pujian "tes Anda bagus" dari AI sebagai jaminan.
  • [] Saya memeriksa bahwa setiap pengujian memverifikasi pernyataan aktual, nilai yang diharapkan independen, dan aturan bisnis.