Jedinica 5 / 12

Probna proizvodnja i osiguranje kvalitete

Dobici:

  • Sposobnost izrade jediničnog testiranja, rubnih slučajeva i analize nedostataka pokrivenosti s AI
  • Mogućnost ispisa testnih očekivanja na temelju specifikacije, a ne trenutnog ponašanja koda
  • Mogućnost testiranja štiti li test stvarno unošenjem pogrešaka

Pisanje testova jedan je od zadataka koji donose najveću vrijednost i koji većina programera odgađa. Dobar paket testova dokaz je da kôd radi prema očekivanjima i spas za buduće promjene. Problem je u tome što se pisanje testova ponavlja i oduzima puno vremena - upravo onakav posao u kojem AI blista. Ali postoji caka: umjetna inteligencija često testira postojeće ponašanje koda, a ne ponašanje kakvo bi trebalo biti. Upravljanje tom razlikom bit je ove jedinice.

U ovoj ćete jedinici naučiti jedinično testiranje (testiranje koje testira samu funkciju, u izolaciji), testove rubnih slučajeva i generiranje testnih podataka pomoću umjetne inteligencije; uklanjanje praznina u pokrivenosti testom; i zašto je slijepo vjerovati AI testovima opasno.

Dvije strane testiranja: Popravljanje ponašanja naspram provjere

Test može poslužiti u dvije različite svrhe. Prvi je provjera: provjerava je li kod ispravan, je li u skladu sa specifikacijom. Druga je zaštita od regresije: zamrzava ponašanje koda danas, pa ako ga netko slučajno promijeni sutra, test će se slomiti i obavijestiti.

AI je vrlo dobar u potonjem; Gleda kod i generira slučajeve koji testiraju "što trenutno radi". Ali ako je kod od početka pogrešan, umjetna inteligencija može to pogrešno ponašanje označiti kao "ispravno". Stoga morate pregledati tvrdnju svakog testa koji AI proizvodi: "Kôd vraća 42, a test očekuje 42" ne znači da je 42 točan odgovor.

Oprez: Ako AI ​​prođe test, to ne znači da kod "radi"; to samo znači "ponaša se onako kako AI očekuje". Vi odlučujete je li očekivanje točno ili ne gledajući specifikaciju.

Korak po korak: Pisanje robusnih testova s umjetnom inteligencijom

  1. Navedite specifikaciju, a ne samo šifru. Ako dodate informaciju "Ova bi funkcija trebala to učiniti", AI može napisati točna očekivanja; Testirat će trenutno ponašanje ako samo unesete kôd.
  2. Zatražite rubne slučajeve. Prazan, nula, nula, negativan, prevelik, loš format, konkurentnost — izričito tvrdite da ste skrenuli sa sretnog puta.
  3. Navedite okvir i stil testiranja. "koristi pytest", "uzorak Arrange-Act-Assert", "neka svaki test testira jednu stvar" itd.
  4. Provjerite očekivanja (tvrdnja). Usporedite sa specifikacijom da svaka tvrdnja provjerava točnu vrijednost.
  5. Zatvoriti nedostatke u opsegu. Navedite postojeće testove i pitajte "koje grane i slučajevi nisu testirani?" natjerati vas da pitate; zatim provjerite dodatne provedene testove.

Tri mini kućišta

Slučaj 1 — Pokrivenost od 52% do 85%. Pokrivenost testiranja jednog servisnog modula bila je 52%. Tim je ubacio postojeće testove u AI, dao mu je popis netestiranih grana i generiranje testova za njih. Uz ljudski pregled, pokrivenost se povećala na 85%; Tijekom procesa, AI je otkrio stvarnu grešku (put koji je vratio pogrešan kod greške) u grani greške koja nikada prije nije bila testirana.

Slučaj 2 — Zamka fiksacije lažnog očekivanja. Funkcija zaokruživanja novca zapravo je bila pogrešna; Umjesto zaokruživanja 2,675 na 2,67, zaokruživalo se 2,67 umjesto 2,68. AI je pogledao kod i napisao assert round_money(2.675) == 2.67 — zamrzavajući pogrešku kao "true". Kada je programer pročitao specifikaciju, ispravio je očekivanje i uhvatio pravi bug. Testiranje pravila, a ne koda, učinilo je razliku.

Slučaj 3 — Eksplozija rubnog stanja. Kada od umjetne inteligencije tražite samo "rubne slučajeve" za funkciju datumskog raspona; Proizveo je 8 slučajeva kao što su početak=kraj, obrnuti interval, prijestupna godina 29. veljače, različite vremenske zone i nulti interval. Dvije od njih (obrnuti razmak i prijestupna godina) zapravo su uzrokovale pogrešku. Ručno razmatranje ovih slučajeva često se preskače; AI je ovdje postao partner za "edge-case brainstorming".

Četiri predloška za kopiranje

Generiranje testa na temelju specifikacija:

Uloga: Programer koji piše testove. Okvir: {{pytest/JUnit/Jest...}}.Što bi funkcija TREBALA RADITI (specifikacija): {{rule}}Napišite testove za sljedeću funkciju. Napišite očekivanja prema specifikaciji, NE prema trenutnom izlazu koda. Sretan put + dodajte najmanje 4 rubna kućišta. Neka svaki test testira jednu stvar, koristite opisni naziv. {{funkcija}}

Razmišljanje o rubnim slučajevima:

Navedite rubne slučajeve/slučajeve neuspjeha koje bi trebalo isprobati u testiranju za ovu funkciju (nula, null, prijelomne točke, loš format, konkurentnost, vanjska pogreška). Za svaki slučaj: unos, očekivano ponašanje. NEMOJTE još pisati kod, samo popis.{{function}}

Analiza jaza u pokrivenosti:

Ispod su funkcije i dostupni testovi. Koje grane, uvjeti 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/generacija lažnog objekta:

Generirajte realne testne podatke za {{function/service}} testove: važeće uzorke, granične uzorke i nevažeće uzorke zasebno. Predložite jednostavno lažno ponašanje za vanjsku ovisnost {{X}}. Korištenje istinski povjerljivih podataka/PII; Generirajte lažne podatke.

Slab upit / Jak upit

Slab: "Napišite test za ovu funkciju."
Snažno: "s pytestom. Funkcija apply_discount(ukupno, postotak) — pravilo: popust mora biti 0%–30%, izvan granica treba izbaciti ValueError, rezultat treba zaokružiti na 2 decimale. Napišite očekivanja prema ovom PRAVILU (ne prema kodu). Sretan put + ovi rubni slučajevi: 0%, 30%, 31% (pogreška), negativno, ukupno=0. [kod]"

On daje pravilo o snažnom oslobađanju 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 jedinice na cesti

brzi kostur

Je li očekivanje točno?

Rubni slučajevi

Opsežno mozganje

Eliminirajte nebitno

Popunjavanje praznine u opsegu

Pronalazi preskočene grane

Potvrdite značaj

Testni podaci/mock

Proizvodi realističan uzorak

Nema PII, kontrola realizma

Testovi upravljaju kvalitetom, a ne jamče je

Visoka pokrivenost testom daje povjerenje, ali može i zavarati: 100-postotna pokrivenost znači "svaki je redak pokrenut", a ne "svaki je redak točan". Lako je povećati pokrivenost AI-jem; Prava vrijednost je u pisanju smislenih očekivanja. Vrijednost testa je njegova sposobnost da razbije i upozori vas kada je kod razbijen. Zato se testovi generirani umjetnom inteligencijom temelje na pitanju "lomi li kod doista kad se promijeni?" Testirajte to pitanjem; Namjerno prekidanje linije i gledanje prekida testa (ideja mutacije) dokaz je da je test uspio.

Savjet: Da biste vidjeli funkcionira li test koji piše AI, napravite malu pogrešku u kodu (npr. promijenite + u -) i provjerite hoće li se test pokvariti. Ako se ne pokvari, taj vas test ne štiti.

Uobičajene greške

  • Traženje testa bez davanja pravila. Model zamrzava trenutno ponašanje; popravlja grešku kao "true".
  • Prihvaćanje očekivanja bez njihovog čitanja. Testiranje je pogrešno ako ne provjerite provjeravaju li tvrdnje točnu vrijednost.
  • Samo ispitujem sretan put. Prave pogreške žive na marginama; Izričito zatražite rubne slučajeve.
  • Miješajući opseg sa svrhom. Visoki postotak nije jamstvo ispravnog ponašanja.
  • Izrada stvarnih/skrivenih podataka kao testnih podataka. Podaci o kupcima ili tajne ne smiju ulaziti u testiranje i pohranu; Generirajte sintetičke podatke.

Ukratko

AI uklanja veliki dio ponavljajućeg tereta pisanja testova: proizvodi brze kosture, velike popise rubnih slučajeva i analize nedostataka pokrivenosti. Ali najkritičnija točka su očekivanja: AI ima tendenciju testirati trenutno ponašanje koda, dok testiranje treba biti napisano prema specifikaciji. Dajte pravilo, provjerite očekivanja, nametnite rubne slučajeve i testirajte štite li testovi stvarno unošenjem greške. Pokrivenost testom je alat, a ne cilj.

Zadatak aplikacije

Odaberite funkciju i prvo ispišite test AI-u jednostavnim davanjem njegovog koda; Zabilježite očekivanja. Zatim ponovno ispišite test dajući specifikaciju (potrebno ponašanje) za istu funkciju. Usporedite očekivanja od dva skupa testova: postoje li razlike, koji od njih otkriva stvarnu pogrešku? Konačno, provjerite je li jedan od generiranih testova radio dodavanjem namjerne pogreške u kod i gledanjem prekida testa.

popis za provjeru

  • [ ] Razlikujem hoće li test popraviti ili potvrditi ponašanje.
  • [ ] Kada zatražim test, dajem pravilo (specifikaciju) koje bi trebalo postojati, a ne kod.
  • [ ] Svaku generiranu tvrdnju uspoređujem sa specifikacijom.
  • [ ] Izričito zahtijevam rubne slučajeve i slučajeve kvara.
  • [ ] Postotak pokrivenosti gledam kao alat, a ne kao cilj.
  • [ ] Testiram štiti li test stvarno ubacivanjem pogrešaka.