Satuan 6 / 12

Uji Otomatisasi dan Jaminan Kualitas

Keuntungan:

  • Kemampuan untuk menghasilkan pengujian unit, integrasi, dan kasus edge dengan pernyataan bermakna dengan AI
  • Kemampuan untuk mengekstrak cakupan pengujian, nilai batas, dan skenario negatif secara sistematis dengan dukungan AI
  • Kemampuan untuk memverifikasi bahwa pengujian yang dihasilkan oleh AI benar-benar memverifikasi perilaku dan tidak hanya mengulangi kode yang sudah ada

Pengujian adalah mekanisme yang membuktikan bahwa perangkat lunak benar-benar berperilaku seperti yang dijanjikan. Rangkaian pengujian yang baik memberi tahu Anda dalam hitungan detik apakah suatu perubahan merusak sesuatu dan memberikan kebebasan kepada teknisi untuk bertindak dengan percaya diri. AI mempercepat bagian penulisan tes yang paling membosankan dan paling banyak dilewati: menghasilkan banyak skenario, titik henti sementara, dan kasus negatif. Namun ada jebakan licik di sini: AI mungkin menulis tes yang memverifikasi perilaku kode saat ini (yang mungkin salah), bukan perilaku yang seharusnya; atau dapat menghasilkan tes kosong yang selalu lolos, tidak benar-benar memeriksa apa pun. Nilai sebuah ujian bukan terletak pada lulusnya ujian tersebut, namun pada apakah ujian tersebut benar dan berubah menjadi merah jika salah.

Dalam unit ini, Anda akan mempelajari cara menghasilkan pengujian unit, integrasi, dan kasus edge dengan pernyataan yang bermakna; cara mengekstraksi cakupan pengujian, titik henti sementara, dan skenario penurunan secara sistematis; dan kita akan melihat bagaimana Anda dapat memeriksa apakah pengujian yang dihasilkan AI benar-benar memvalidasi perilaku.

Konsep: Pengujian unit: Menguji satu fungsi/kelas secara terpisah. Pengujian integrasi: Menguji beberapa bagian yang bekerja sama dengan benar. Assert: Pernyataan yang memeriksa apakah suatu hasil sama dengan apa yang diharapkan; Inilah inti ujiannya. Cakupan: Berapa banyak kode yang dijalankan oleh pengujian; Cakupan yang tinggi tidak menjamin kualitas.

Menghasilkan Tes yang Bermakna

Sebuah tes yang baik melakukan tiga hal dengan jelas: ia menetapkan keadaan, ia melakukan suatu tindakan, dan menegaskan hasilnya. Saat mencetak pengujian ke AI, tentukan perilaku apa yang ingin Anda verifikasi dan skenario apa yang harus dicakup; Jika tidak, hal ini akan menghasilkan ujian dangkal yang selalu lulus.

  1. Tentukan perilaku yang akan diuji. “Apa yang dianggap benar?” Jawab pertanyaannya dengan jelas.
  2. Tanyakan jenis skenario. Kondisi normal, limit, negatif, error.
  3. Impor pernyataan yang bermakna. Itu tidak hanya "membuat kesalahan", tetapi "mengembalikan nilai yang benar".
  4. Periksa keakuratan tes. Apakah tes berubah menjadi merah ketika Anda memecahkan kode secara sadar?

Perintah pembuatan pengujian yang komprehensif: "Tulis pengujian unit untuk fungsi 'applydiscount(jumlah, kupon)' berikut. Miliki SETIDAKNYA satu skenario dalam kategori berikut: (1) kupon normal yang valid, (2) breakpoint (jumlah 0, diskon 100%), (3) negatif (kupon tidak valid, jumlah negatif), (4) kasus kesalahan (kupon nol). Tegaskan nilai BETON yang diharapkan dalam setiap pengujian (bukan hanya 'berhasil'). Beri nama pengujian yang dapat dibaca. Kode: [kode]"

Perintah ekstraksi nilai batas: "Lakukan analisis nilai batas untuk input fungsi ini. Untuk setiap parameter, ekstrak nilai 'tepat di batas', 'tepat di bawah batas', 'tepat di atas batas' sebagai tabel. Lalu buat daftar skenario pengujian yang mencakup batas-batas ini. Jangan menulis kode dulu, cukup analisis dan daftar skenario. Fungsi: [tanda tangan]"

Perhatian: Cakupan pengujian yang tinggi (misalnya 90%) tidak membuktikan bahwa kode tersebut benar. Cakupan mengukur berapa banyak baris yang dieksekusi; bukan berarti garis-garis itu memberikan hasil yang benar. Tes tanpa pernyataan yang berarti akan meningkatkan cakupan tetapi tidak menjamin apa pun. Isi pernyataan menentukan kualitas, bukan jumlah pernyataan.

Menguji Tes Itu Sendiri: Logika Mutasi

Cara paling praktis untuk memahami apakah pengujian yang dihasilkan AI benar-benar berfungsi adalah dengan sengaja memecahkan kodenya (logika pengujian mutasi). Balikkan suatu kondisi, buatlah tanda + -; Jika tidak ada tes yang berubah menjadi merah, tes Anda tidak benar-benar mempertahankan perilaku tersebut.

Perintah pencarian kerentanan pengujian: "Beri tahu saya potensi bug apa saja dalam kode ini yang MUNGKIN TIDAK dapat ditangkap oleh pengujian berikut. Sarankan 5 mutasi kecil yang dapat dilakukan pada kode (misalnya >= alih-alih >, - alih-alih +) dan tunjukkan untuk setiap mutasi apakah pengujian yang ada dapat menangkapnya. Bagi yang tidak tertangkap, sarankan pengujian yang harus ditambahkan. Kode: [kode] Pengujian: [pengujian]"

Prompt Lemah / Prompt Kuat

LEMAH: "Tulis tes untuk fungsi ini." (Hasil: biasanya satu skenario yang menyenangkan, pernyataan lemah; kesalahan meleset.) KUAT: "Tulis pengujian untuk fungsi 'passwordStrong' ini. Aturan: minimal 8 karakter, 1 huruf besar, 1 digit wajib diisi. Tutupi skenario berikut sebagai pengujian TERPISAH: tepat 8 karakter (batas), 7 karakter (di bawah batas), tanpa huruf besar, tanpa digit, string kosong, hanya spasi, terlalu panjang (1000 karakter) Secara eksplisit menyatakan nilai benar/salah yang diharapkan dalam setiap tes dan beri nama tes tersebut sesuai dengan apa yang diperiksanya."

Prompt yang kuat memberikan aturan dan skenario batas penuh. Pasangan batas seperti "tepatnya 8/7 karakter" adalah tempat paling umum untuk membuat kesalahan (membingungkan > dengan >=). Prompt yang lemah melewati batas-batas ini dan membawa kesalahan ke produksi.

Jenis Tes dan Tempat Penggunaannya

Jenis tes

Apa yang dikonfirmasinya?

Kontribusi AI

Perhatian

satuan

Fungsi/kelas tunggal

Menghasilkan multi-skenario dengan cepat

Penegasan yang bermakna diperlukan

integrasi

Bagian bekerja sama

Skenario dan draf data tiruan

Perilaku adiktif yang sebenarnya

akhir/terima

Seluruh aliran pengguna

Daftar langkah dan harapan

rentan terhadap kerapuhan

regresi

Kesalahan lama tidak kembali

Pengujian khusus kesalahan

Harus ditambahkan ke setiap perbaikan

Kasus Mini

Kasus 1 — Ujian yang selalu lulus. AI menulis 12 tes ke suatu fungsi dan semuanya lulus. Insinyur menjadi curiga dan dengan sengaja mendistorsi nilai kembalian fungsi tersebut; Hanya 3 tes yang berubah menjadi merah. Sembilan tes lainnya tidak mengandung pernyataan yang berarti. Pengujian diperkuat dengan perburuan mutasi; perlindungan nyata diperoleh dalam 9 skenario.

Kasus 2 — Kesalahan batas. Fungsi verifikasi usia seharusnya menyatakan "18 tahun ke atas valid" tetapi ditulis >18 tahun, artinya usia 18 tahun ditolak. Kesalahan segera muncul dalam pengujian karena AI menghasilkan skenario “tepat 18” melalui analisis breakpoint. Tes batas tunggal mencegah keluhan pengguna yang sebenarnya.

Kasus 3 — Memperbaiki perilaku saat ini. Ketika AI diberitahu untuk "menulis tes berdasarkan kode ini", AI menghasilkan tes yang menerima kesalahan pembulatan yang sudah ada dalam kode sebagai "benar". Ketika insinyur mencetak pengujian sesuai dengan persyaratan (nilai benar yang diharapkan) dan bukan kode, pengujian berubah menjadi merah dan kesalahan sebenarnya terjadi. Pengujian harus berasal dari ekspektasi, bukan dari kode.

Kesalahan umum

  • Penegasan yang tidak ada gunanya. "Tidak melakukan kesalahan" tidaklah cukup; Nilai yang benar harus diverifikasi.
  • Membingungkan ruang lingkup dengan kualitas. Cakupan yang tinggi tidak menjamin hasil yang akurat.
  • Mencetak tes dengan kode. Memperbaiki kesalahan saat ini menjadi "benar"; Tes harus berasal dari harapan.
  • Melewati nilai batas. Membingungkan > dengan >= adalah kesalahan paling umum; pasangan batas harus diuji.
  • Tidak mengaudit tes itu sendiri. Tes yang tidak berubah menjadi merah saat Anda memecahkan kode tidak memberikan perlindungan.

Singkatnya

Rangkaian pengujian yang baik adalah kunci untuk membuat perubahan dengan percaya diri. AI dengan cepat menghasilkan banyak skenario, batasan, dan situasi negatif; Namun jika tes tersebut berasal dari kode dan bukan dari persyaratan, maka tes tersebut dapat memperbaiki bug yang ada atau menulis tes yang tidak berarti dan selalu lolos. Tegaskan nilai konkrit yang diharapkan dalam setiap pengujian, sertakan pasangan terikat, dan verifikasi bahwa pengujian Anda benar-benar melindungi dengan sengaja memecahkan kode. Isi pernyataan, bukan jumlah cakupan, yang menentukan kualitas.

Tugas aplikasi

Pilih fungsi dan minta fungsi tersebut menghasilkan pengujian dalam empat kategori (normal, batas, negatif, kesalahan) dengan perintah pembuatan pengujian yang komprehensif; Tegaskan nilai konkrit yang diharapkan dalam setiap pengujian. Kemudian jalankan tes perburuan kerentanan, sarankan 5 mutasi kecil pada kode, dan jalankan tes untuk memeriksa mana yang mereka tangkap. Tambahkan tes baru untuk setidaknya satu mutasi yang tidak tertangkap dan tunjukkan bahwa mutasi tersebut sekarang berada di zona merah.

daftar periksa

  • [ ] Saya mencetak tes berdasarkan perilaku yang diharapkan/benar, bukan kodenya.
  • [ ] Saya membahas skenario normal, batas, negatif, dan kesalahan.
  • [ ] Saya menegaskan nilai konkrit yang diharapkan dalam setiap tes.
  • [ ] Saya menguji pasangan perbatasan (tepat di atas-bawah / tepat di atas-bawah).
  • [ ] Dengan sengaja memecahkan kode, saya mengonfirmasi bahwa tes tersebut berubah menjadi merah.
  • [] Saya menambahkan tes baru untuk mutasi yang tidak terdeteksi.