Dobici:
- Sposobnost izrade testiranja jedinica, rubnih slučajeva i analize jaza u pokrivenosti pomoću AI
- Sposobnost ispisivanja testnih očekivanja na osnovu specifikacije, a ne trenutnog ponašanja koda
- Sposobnost testiranja da li test zaista štiti ubacivanjem grešaka
Pisanje testova je jedan od zadataka koji najviše proizvode vrijednost koji većina programera odlaže. Dobar test paket je dokaz da kod radi kako se očekuje i spas za buduće promjene. Problem je u tome što je pisanje testova ponavljajuće i dugotrajno – upravo ona vrsta posla u kojoj AI sjaji. Ali postoji kvaka: AI često testira postojeće ponašanje koda, a ne ponašanje kakvo bi trebalo da bude. Upravljanje ovom razlikom je suština ove jedinice.
U ovoj jedinici naučit ćete testiranje jedinica (testiranje koje testira funkciju samostalno, u izolaciji), testove rubnih slučajeva i generiranje testnih podataka pomoću AI; zatvaranje praznina u pokrivenosti testom; i zašto je slijepo vjerovati AI testovima opasno.
Dvije strane testiranja: popravljanje ponašanja u odnosu na provjeru
Test može služiti u dvije različite svrhe. Prvi je verifikacija: testira se da li je kod ispravan, da li je u skladu sa specifikacijom. Druga je zaštita od regresije: zamrzava ponašanje koda danas, pa ako ga neko slučajno promijeni sutra, test će pokvariti i obavijestiti.
AI je veoma dobar u ovom poslednjem; Gleda kod i generiše slučajeve koji testiraju "šta trenutno radi". Ali ako je kod pogrešan od samog početka, AI može to pogrešno ponašanje označiti kao „ispravno“. Dakle, morate pregledati tvrdnju svakog testa koji AI proizvede: "Kôd vraća 42, a test očekuje 42" ne znači da je 42 tačan odgovor.
Oprez: Ako AI prođe test, to ne znači da kod "radi"; to samo znači "ponaša se kako AI očekuje". Vi odlučujete da li su očekivanja tačna ili ne gledajući specifikacije.
Korak po korak: Pisanje robusnih testova sa AI
- Navedite specifikaciju, a ne samo šifru. Ako dodate informaciju "Ova funkcija bi to trebala učiniti", AI može napisati ispravno očekivanje; Testiraće trenutno ponašanje ako samo unesete kod.
- Pitajte za rubne slučajeve. Prazan, null, nula, negativan, prevelik, loš format, istovremenost — eksplicitno tvrdite da ste van sretnog puta.
- Odredite okvir i stil testiranja. "koristite pytest", "Uporedi-Deluj-Assert obrazac", "neka svaki test testira jednu stvar" itd.
- Provjerite očekivanja (tvrdnja). Uporedite sa specifikacijom koju svaki assert provjerava za ispravnu vrijednost.
- Zatvorite praznine u obimu. Dajte postojeće testove i pitajte "koje grane i slučajevi nisu testirani?" natjerati vas da pitate; zatim provjeriti izvedene dodatne testove.
Tri mini futrole
Slučaj 1 — Pokrivenost od 52% do 85%. Pokrivenost testom jednog servisnog modula bila je 52%. Tim je dao postojeće testove AI-u, dao mu listu netestiranih grana i generisao testove za njih. Sa ljudskim pregledom, pokrivenost se povećala na 85%; U tom procesu, AI je otkrio stvarnu grešku (put koji je vratio pogrešan kod greške) u grani greške koja nikada ranije nije bila testirana.
Slučaj 2 — Zamka fiksiranja lažnih očekivanja. Funkcija zaokruživanja novca je zapravo bila pogrešna; Umjesto zaokruživanja 2,675 na 2,67, zaokružilo se 2,67 umjesto 2,68. AI je pogledao kod i napisao assert round_money(2.675) == 2.67 — zamrzavajući grešku kao „tačno“. Kada je programer pročitao specifikaciju, ispravio je očekivanje i uhvatio pravu grešku. Testiranje pravila, a ne koda, napravilo je razliku.
Slučaj 3 — Eksplozija rubnog stanja. Kada se od AI-ja traži samo „ivične slučajeve“ za funkciju raspona datuma; Proizveo je 8 slučajeva kao što su početak=kraj, obrnuti interval, prijestupna godina 29. februar, različite vremenske zone i nulti interval. Dvije od njih (obrnuti razmak i prijestupna godina) su zapravo uzrokovale grešku. Ručno razmatranje ovih slučajeva često se preskače; AI je ovdje postao partner za "ivničko razmišljanje".
Četiri predloška koji se mogu kopirati
Generisanje testova na osnovu specifikacija:
Uloga: Programer koji piše testove. Okvir: {{pytest/JUnit/Jest...}}. Šta funkcija TREBA RADITI (specifikacija): {{rule}}Napišite testove za sljedeću funkciju. Napišite očekivanja prema specifikaciji, NE trenutni izlaz koda. Sretan put + dodajte najmanje 4 rubna slučaja. Neka svaki test testira jednu stvar, koristite opisni naziv. {{funkcija}}
Razmišljanje o rubnim slučajevima:
Navedite slučajeve ruba/neuspjeha koje treba isprobati u testiranju za ovu funkciju (null, null, prekidne tačke, loš format, konkurentnost, vanjska greška). Za svaki slučaj: unos, očekivano ponašanje. NEMOJTE još pisati kod, samo navedite.{{function}}
Analiza jaza u pokrivenosti:
Ispod su funkcije i dostupni testovi. Koje grane, uslovi i slučajevi nisu testirani? Navedite nedostatke i napišite nove testove samo za nedostatke. Nemojte ponavljati postojeće. Funkcija:{{function}}Testovi:{{existing_tests}}
Testni podaci / generiranje lažnog objekta:
Generirajte realistične testne podatke za {{function/service}} testove: važeće uzorke, uzorke granica i nevažeće uzorke odvojeno. Predložite jednostavno lažno ponašanje za vanjsku ovisnost {{X}}. Korištenje istinskih povjerljivih podataka/PII; Generirajte lažne podatke.
Slaba prompt / Jaka prompt
Slabo: "Napišite test za ovu funkciju."
Snažno: "sa pytestom. Funkcija apply_discount(ukupno, posto) — pravilo: popust mora biti 0%–30%, van granica treba izbaciti ValueError, rezultat treba zaokružiti na 2 decimale. Očekivanja napišite prema ovom PRAVILU (ne po kodu). Sretan put + ovi rubni slučajevi: 0%, 30%, ili 31% negativan" (ukupni broj).
On daje pravilo snažnog oslobađanja i kaže "napišite očekivanje prema pravilu, a ne kodu"; Ova jedina rečenica zatvara zamku AI popravljanja lošeg ponašanja.
Vrsta testa
AI doprinos
ljudska kontrola
Sretno testiranje jedinica na cesti
brzi skelet
Da li je očekivanje tačno?
Edge case
Opsežno razmišljanje
Eliminišite nebitno
Popunjavanje praznina u opsegu
Pronalazi preskočene grane
Potvrdite značaj
Test podataka/mock
Stvara realan uzorak
Nema PII, kontrola realizma
Testovi upravljaju kvalitetom, a ne garantuju
Visoka pokrivenost testom daje samopouzdanje, ali takođe može dovesti u zabludu: 100 posto pokrivenosti znači "svaka linija je pokrenuta", a ne "svaka linija je tačna". Lako je povećati pokrivenost pomoću AI; Prava vrijednost je u pisanju smislenih očekivanja. Vrijednost testa je njegova sposobnost da razbije i upozori vas kada je kod pokvaren. Zato se testovi generisani od veštačke inteligencije zasnivaju na pitanju "da li se kod zaista pokvari kada se promeni?" Testirajte ga pitanjem; Namjerno prekidanje linije i viđenje prekida testa (ideja o mutaciji) dokaz je da je test uspio.
Savjet: Da biste vidjeli da li test koji AI piše radi, napravite malu grešku u kodu (npr. promijenite + u -) i pogledajte da li se test pokvari. Ako se ne pokvari, taj test vas ne štiti.
Uobičajene greške
- Tražiti test bez davanja pravila. Model zamrzava trenutno ponašanje; popravlja grešku kao "tačno".
- Prihvatanje očekivanja bez čitanja. Testiranje je pogrešno ako ne provjerite da li tvrdnje provjeravaju ispravnu vrijednost.
- Samo testiram sretan put. Prave greške žive na marginama; Eksplicitno zatražite rubne slučajeve.
- Pogrešio opseg sa svrhom. Visok procenat nije garancija ispravnog ponašanja.
- Pravljenje stvarnih/skrivenih podataka kao testnih podataka. Podaci o klijentima ili tajne ne bi trebalo da ulaze u testiranje i skladištenje; Generirajte sintetičke podatke.
Ukratko
AI preuzima veliki dio tereta koji se ponavlja prilikom pisanja testova: proizvodi brze kosture, velike liste rubnih slučajeva i analize jaza u pokrivenosti. Ali najkritičnija tačka su očekivanja: AI teži da testira trenutno ponašanje koda, dok testiranje treba da bude napisano u skladu sa specifikacijom. Dajte pravilo, provjerite očekivanja, nametnite rubne slučajeve i testirajte da li testovi zaista štite ubacivanjem greške. Pokrivenost testom je alat, a ne cilj.
Zadatak aplikacije
Odaberite funkciju i prvo ispišite test na AI jednostavnim davanjem koda; Obratite pažnju na očekivanja. Zatim ponovo odštampajte test, dajući specifikaciju (potrebno ponašanje) za istu funkciju. Uporedite očekivanja dvaju testova: postoje li različiti, koji otkriva pravi bug? Konačno, provjerite da li je jedan od generiranih testova funkcionirao dodavanjem namjerne greške u kod i uvidom u prekid testa.
kontrolna lista
- [ ] Ja razlikujem da li test treba popraviti ili potvrditi ponašanje.
- [ ] Kada tražim test, dajem pravilo (specifikaciju) koje treba da bude na mestu, a ne kod.
- [ ] Upoređujem svaku generiranu tvrdnju sa specifikacijom.
- [ ] Eksplicitno tražim ivice i slučajeve kvara.
- [ ] Procentualno pokrivanje gledam kao alat, a ne kao cilj.
- [ ] Testiram da li test zaista štiti ubacivanjem grešaka.