Unit 6 / 11

Penjanaan Ujian Unit dan Kebolehujian: Pengujian Teguh dengan AI

Keuntungan:

  • Keupayaan untuk menghalang kecerdasan buatan daripada menerima tingkah laku yang salah sebagai 'betul' dengan mengira nilai yang dijangkakan dalam ujian unit secara bebas daripada peraturan penerimaan
  • Keupayaan untuk mencetak ujian yang pantas, bebas dan boleh berulang dengan menggunakan prinsip AAA dan PERTAMA serta mengejek kebergantungan luaran
  • Keupayaan untuk menguji ujian dengan mutasi (pemecahan kod) dan mengenali kod yang sukar untuk diuji sebagai bau reka bentuk

Lapisan piramid ujian terbesar dan terpantas ialah ujian unit — ujian yang mengesahkan fungsi atau sekeping kod kecil secara berasingan daripada semua yang lain. Beribu-ribu ujian unit dijalankan dalam beberapa saat dan menangkap pepijat semasa kod itu masih pada skrin pembangun. Kecerdasan buatan (AI) mungkin paling mahir dalam menghasilkan ujian unit: anda memberikannya fungsi, AI menghasilkan berpuluh-puluh ujian. Tetapi kemudahan ini menimbulkan perangkap terbesar: AI dengan mudah menghasilkan ujian yang "bercahaya hijau tetapi tidak mengesahkan apa-apa" atau menerima tingkah laku semasa (mungkin rosak) kod sebagai "betul". Dalam unit ini anda akan belajar cara menulis ujian unit yang benar-benar pelindung dengan AI dan hubungan antara kod yang boleh diuji dan AI.

Kualiti ujian unit yang baik: PERTAMA

Ujian unit yang baik mengikut prinsip PERTAMA: Cepat, Bebas (ujian tidak seharusnya bergantung antara satu sama lain), Boleh diulang (boleh diulang — keputusan yang sama dalam mana-mana persekitaran), Mengesahkan sendiri (lulus jelas/gagal), Menepati masa (tepat masa). Ingatkan diri anda tentang prinsip ini apabila AI menghasilkan ujian; secara khusus meminta ujian itu tidak bergantung pada dunia luar (pangkalan data sebenar, rangkaian, jam) untuk menjadi "bebas" dan "boleh diulang".

Corak AAA dan tegasan ekspresif

Ujian unit pepejal mengikut struktur AAA: Susun (sediakan — sediakan input dan kebergantungan), Bertindak (laksana — panggil fungsi yang sedang diuji), Tegaskan (sahkan — bandingkan keputusan dengan nilai yang dijangkakan). Yang kritikal ialah tegas. Kesilapan yang paling biasa yang dibuat oleh AI ialah memperoleh penegasan daripada output kod yang sedang diuji - logik "apa sahaja kod yang dikembalikan adalah benar". Ini menjadikan ujian itu tidak bermakna. Cara yang betul ialah menentukan nilai yang dijangkakan secara bebas (daripada kriteria penerimaan, hitung secara manual).

Perhatian: Jika anda memberitahu AI "tulis ujian untuk fungsi ini", AI mungkin menjalankan fungsi dan menulis outputnya sebagai "dijangka". Ujian ini lulus walaupun fungsi itu palsu. Sebaliknya, katakan "anda mengira hasil yang dijangkakan mengikut peraturan ini, jangan rujuk output semasa fungsi."

Olok-olok, rintisan dan kebergantungan

Ujian unit memerlukan pengasingan. Jika fungsi anda bergantung pada pangkalan data atau API, ia digantikan dengan objek olok-olok (olok-olok/stub — pengganti terkawal, tiruan untuk pergantungan sebenar) dalam ujian. Ini menjadikan ujian itu pantas, bebas dan boleh dihasilkan semula. AI boleh menghasilkan pemasangan olok-olok; Tetapi berhati-hati dengan ejekan yang berlebihan: jika anda mengejek segala-galanya, ujian hanya akan mengesahkan "apa yang diejek itu kembali", bukan logik sebenar. Keseimbangan: mencontohi dunia luar, melaksanakan logik sebenar di bawah ujian.

Kebolehujian dan AI

Terdapat maklum balas yang menarik: kod yang sukar diuji selalunya adalah kod yang direka dengan buruk. Jika AI mengalami masalah menulis ujian pada fungsi (terlalu banyak kebergantungan, keadaan global yang tersembunyi, kesan sampingan), itu adalah bau reka bentuk. Meminta AI "bagaimana anda memfaktorkan semula kod ini untuk menjadikannya boleh diuji" membawa kepada ujian yang lebih baik dan kod yang lebih baik.

Ujian berparameter dan kepelbagaian data

Menulis ujian berasingan setiap kali untuk mengesahkan peraturan yang sama dengan input yang berbeza adalah membosankan dan sukar untuk dikekalkan. Ujian berparameter — struktur yang berulang kali menjalankan logik ujian yang sama pada senarai input dan hasil yang dijangkakan — menghapuskan pengulangan ini: satu badan ujian diberi makan dengan berdozen pasangan input. AI sangat cekap dalam menghasilkan jadual hasil jangkaan input ini apabila anda memberikan peraturan penerimaan anda; Khususnya, ia secara sistematik menjadualkan nilai had dan kelas kesetaraan.

Tetapi terdapat perangkap di sini juga: AI cenderung untuk memperoleh hasil yang diharapkan dalam jadual yang dijana daripada kod yang sedang diuji. Ralat ini lebih berbahaya dalam ujian berparameter, kerana satu logik yang salah membatalkan berpuluh-puluh baris. Oleh itu, sentiasa pastikan lajur hasil jangkaan dikira secara bebas mengikut peraturan penerimaan dan sahkan secara manual sekurang-kurangnya beberapa baris. Minta juga lajur penerangan "apa yang diwakili oleh setiap baris"; jadi apabila satu baris terputus anda serta-merta melihat keadaan mana yang rosak.

Petua: Menambahkan "baris perangkap" dengan sengaja pada jadual ujian berparameter — iaitu, dengan sengaja tersalah taip keputusan. Jika garis itu tidak bertukar merah semasa anda menjalankan ujian, ujian anda sebenarnya tidak mengesahkan keadaan itu. Ini adalah semakan mock-pass yang pantas.

Gesaan lemah / Gesaan kuat

Lemah: "Tulis ujian unit untuk fungsi ini."
Kuat: Tulis ujian unit [bahasa/rangka kerja] untuk fungsi "TaxCalculate(amaun, kadar). Peraturan penerimaan: hasil = jumlah * kadar, dibundarkan kepada 2 perpuluhan; jumlah negatif atau kadar melontarkan ralat; mengembalikan 0 jika kadar ialah 0. Gunakan struktur AAA. Kira nilai jangkaan secara manual mengikut peraturan INI, jangan rujuk keluaran semasa, kes negatif bulatan dan negatif sangat besar. Biarkan nama setiap ujian menerangkan peraturan yang disahkan oleh Kebergantungan luar "Tidak."

Gesaan yang kuat; Ia memberikan peraturan penerimaan, jangkaan nilai jangkaan bebas, struktur dan kes kelebihan. Oleh itu, ujian menjadi penjaga peraturan, bukan cermin kod.

Jadual kualiti ujian unit

gejala

Ujian buruk (kepercayaan palsu)

ujian yang baik

tegaskan

Tiada atau "tidak batal"

Nilai konkrit yang dijangkakan

Sumber nilai yang dijangkakan

Output fungsi

Peraturan penerimaan / pengiraan manual

ketagihan

DB/rangkaian/jam sebenar

Ditebat dengan mock/stub

kes tepi

Jalan raya sahaja

had, negatif, kesilapan

Apabila anda memecahkan kod

kekal hijau

bertukar merah

Nama

ujian1, kaedah ujian

menerangkan peraturan yang disahkannya

Empat templat yang boleh disalin

1) Ujian unit dipacu peraturan:

Peranan anda: jurutera ujian perisian kanan.Tulis ujian unit pada fungsi berikut dengan [bahasa/rangka kerja]: [tandatangan].Peraturan penerimaan: [peraturan].- Gunakan struktur AAA.- Kira nilai yang dijangkakan secara manual mengikut peraturan INI; JANGAN rujuk output semasa fungsi. - Tutup had, negatif, ralat dan laluan gembira dengan ujian berasingan. - Biarkan setiap nama ujian menerangkan peraturan yang disahkan. - Olok-olok kebergantungan luar; Jadikan logik sebenar berfungsi.

2) Kawalan rintangan mutasi:

Semak ujian unit ini. Senaraikan 5 tweak kecil yang boleh saya buat pada kod yang sedang diuji (a - bukannya +, a >= bukannya a >, anjakan sempadan) dan beritahu saya untuk setiap satu, YANG manakah ujian ini akan bertukar merah? Jika tiada yang dikembalikan, ujian tidak mencukupi. Kod + ujian: [tampal]

3) Semakan kebolehujian:

Mengapa sukar untuk menulis ujian unit untuk fungsi ini? Ketagihan tersembunyi, status global, kesan sampingan, adakah terdapat banyak tanggungjawab? Cadangkan pemfaktoran semula minimum untuk menjadikannya boleh diuji; jangan ubah perangai. Kod: [tampal]

4) Penyelesaian senario yang tidak lengkap:

Fungsi berikut dan ujian yang tersedia diberikan. Senaraikan tingkah laku/huruf tepi yang TIDAK PERNAH diuji (jurang skop) dan tambahkan ujian untuk setiap satu. Fungsi+ujian: [tampal]

tiga kes mini

Kes 1 — Ujian mencerminkan kod. Seorang pembangun mempunyai AI menulis ujian untuk fungsi pembundaran; 10 ujian adalah hijau. Sebenarnya, fungsi itu membulatkan ke arah yang salah, tetapi AI telah mengambil nilai yang diharapkan daripada output fungsi, jadi ujian menganggap ralat itu "benar". Apabila nilai yang dijangkakan dikira secara manual dengan templat "didorong peraturan", 4 ujian menjadi merah dan ralat sebenar telah didedahkan.

Kes 2 — Nilai kawalan mutasi. Satu pasukan bergantung pada 45 ujian unit. Mencuba 20 tweak kecil pada kod dengan "semakan kekukuhan mutasi"; ujian menangkap hanya 11 daripadanya. Baki 9 gangguan berlalu dengan senyap. Pasukan menguatkan ujian lemah; Ralat pengiraan sebenar telah ditangkap oleh ujian dipertingkat ini dalam keluaran seterusnya.

Kes 3 — Tidak dapat diuji ialah bau reka bentuk. AI tidak dapat menulis ujian untuk fungsi pesanan, ia sentiasa memerlukan pangkalan data sebenar. Templat "semakan kebolehujian" menunjukkan bahawa fungsi tersebut membenamkan akses pangkalan data. Apabila suntikan kebergantungan dialih keluar, ujian boleh ditulis dan kod menjadi lebih bersih.

Kesilapan biasa

  • Menghasilkan nilai yang diharapkan daripada kod. AI menerima output fungsi sebagai "betul"; ujian yang mengesahkan kod yang rosak.
  • Uji tanpa tegas atau dengan penegasan remeh. "Dia tidak membuang kesilapan, dia lulus" logik; Ia tidak mengesahkan apa-apa.
  • Olok-olok melampau. Mengejek segala-galanya dan menguji hanya apa yang diejek itu kembali; logik sebenar tidak diuji.
  • Hanya jalan yang bahagia. Melangkau keadaan had, negatif dan ralat.
  • Tidak menguji dengan memecahkan kod. Mempercayai hijau tanpa memeriksa mutasi.
  • Mengabaikan ketidakpastian. Tidak mengiktiraf dan membetulkan reka bentuk yang buruk dan bukannya menolak ujian keras.

Secara ringkasnya

Ujian unit ialah lapisan terpantas dan terbesar bagi piramid ujian; Ia menangkap kesilapan pada saat yang paling murah. AI sangat mampu menghasilkan ujian unit, tetapi perangkap terbesarnya ialah menulis ujian yang menganggap tingkah laku yang salah sebagai "betul" dengan memperoleh nilai yang diharapkan daripada kod itu sendiri. Penyelesaian: berikan peraturan penerimaan, minta nilai yang dijangkakan dikira secara manual, menguatkuasakan prinsip AAA dan PERTAMA, mengejek dunia luar dan menjalankan logik sebenar, dan menguji setiap ujian dengan mutasi (memecahkan kod). Kod yang sukar untuk diuji ialah tanda reka bentuk yang perlu diperbaiki.

Tugasan permohonan

Pilih fungsi yang mengandungi peraturan perniagaan daripada projek anda sendiri. Tulis peraturan penerimaan dan dapatkan ujian tulis AI dengan templat "ujian unit dipacu peraturan"; Minta nilai yang dijangkakan dikira secara manual. Kemudian gunakan "semakan kekukuhan mutasi": buat sekurang-kurangnya 5 pecahan kecil dalam kod dan ukur bilangan ujian yang bertukar merah. Tambah ujian baru untuk rasuah yang tidak ditangkap. Laporkan bilangan gangguan yang telah ditangkap (seperti skor mutasi).

senarai semak

  • [ ] Saya memberikan peraturan penerimaan dan mempunyai nilai yang dijangkakan dikira secara manual.
  • [ ] Saya memastikan bahawa ujian tidak memperoleh nilai yang diharapkan daripada kod.
  • [ ] Saya telah menubuhkan ujian bebas mengikut garis panduan AAA dan PERTAMA.
  • [ ] Saya mengejek kebergantungan luaran dan menjalankan logik sebenar.
  • [ ] Saya meliputi kes had, negatif dan ralat.
  • [ ] Dengan memecahkan kod (mutasi) saya membuktikan bahawa ujian itu sememangnya melindungi.