Jedinica 6 / 12

Automatizacija testiranja i osiguranje kvaliteta

Dobici:

  • Sposobnost izrade testova jedinica, integracije i rubnih slučajeva sa smislenom tvrdnjom sa AI
  • Sposobnost sistematskog izdvajanja pokrivenosti testom, graničnim vrijednostima i negativnim scenarijima uz podršku AI
  • Sposobnost da se potvrdi da testovi proizvedeni od strane AI zapravo potvrđuju ponašanje, a ne samo da ponavljaju postojeći kod

Testiranje je mehanizam koji dokazuje da se softver zaista ponaša kako je obećano. Dobar paket za testiranje vam u nekoliko sekundi govori da li promjena nešto kvari i daje inženjeru slobodu da djeluje s povjerenjem. AI ubrzava najzamorniji i najpreskakaniji dio pisanja testova: generiranje mnoštva scenarija, tačaka prekida i negativnih slučajeva. Ali ovdje postoji podmukla zamka: AI može pisati testove koji potvrđuju trenutno (možda pogrešno) ponašanje koda, a ne njegovo navodno ponašanje; ili može proizvesti prazne testove koji uvijek prođu, a ne provjeravaju ništa. Vrijednost testa nije u tome da li je prošao, već u tome da li provjerava pravu stvar i postaje li crven kada je pogrešan.

U ovoj jedinici ćete naučiti kako napraviti testove jedinica, integracije i rubnih slučajeva sa smislenim tvrdnjama; kako sistematski izdvojiti pokrivenost testom, tačke prekida i scenarije negativnih strana; i vidjet ćemo kako možete provjeriti da li testovi koje AI proizvodi zapravo potvrđuju ponašanje.

Koncepti: Jedinično testiranje: Testira jednu funkciju/klasu u izolaciji. Integracijsko testiranje: Testira da više dijelova ispravno radi zajedno. Tvrditi: Izjava koja provjerava da li je rezultat jednak onome što se očekivalo; Ovo je srce testa. Pokrivenost: koliki dio koda pokreće testovi; Visoka pokrivenost ne garantuje kvalitet.

Izrada smislenih testova

Dobar test čini tri stvari jasno: uspostavlja stanje, izvodi akciju, potvrđuje rezultat. Kada štampate testove na AI, navedite kakvo ponašanje želite da proverite i koje scenarije ono treba da pokriva; Inače, proizvodi površne testove koji uvijek prolaze.

  1. Definirajte ponašanje koje se testira. “Šta se smatra ispravnom?” Odgovorite jasno na pitanje.
  2. Pitajte za tipove scenarija. Normalno, granično, negativno, stanje greške.
  3. Uvezite smisleno tvrdnje. Nije samo "izbacio grešku", već je "vratio tačnu vrijednost".
  4. Provjerite tačnost testa. Da li test postaje crven kada svjesno razbijete kod?

Sveobuhvatni upit za generiranje testa: "Napišite jedinične testove za sljedeću funkciju 'primijeni popust(iznos, kupon)'. Imajte NAJMANJE jedan scenarij u sljedećim kategorijama: (1) normalan važeći kupon, (2) tačke prekida (0 iznos, 100% popusta), (3) negativan (nevažeći kupon, negativan iznos), (4) slučaj greške testa očekivane vrijednosti COU (4) u slučaju greške testa nuert null. (ne samo 'radio').

Prompt za ekstrakciju granične vrijednosti: "Izvršite analizu graničnih vrijednosti za ulaze ove funkcije. Za svaki parametar izdvojite vrijednosti 'baš na granici', 'odmah ispod granice', 'odmah iznad granice' kao tabelu. Zatim navedite testne scenarije koji pokrivaju ove granice. Nemojte još pisati popis scenarija, samo analiza: [zabavna analiza i analiza]

Oprez: Visoka pokrivenost testom (npr. 90%) ne dokazuje da je kod ispravan. Pokrivenost mjeri koliko je redova izvršeno; ne da te linije daju ispravan rezultat. Test bez smislene tvrdnje povećava pokrivenost, ali ne garantuje ništa. Sadržaj tvrdnje određuje kvalitet, a ne broj tvrdnji.

Testiranje samog testa: logika mutacije

Najpraktičniji način da se shvati da li AI generisani test zaista radi je da se namjerno razbije kod (logika testiranja mutacije). Obrnite uslov, napravite znak + -; Ako nijedan test ne postane crveni, vaši testovi zapravo ne održavaju to ponašanje.

Prompt za traženje ranjivosti za testiranje: "Recite mi koje potencijalne greške u ovom kodu sljedeći testovi MOŽDA NEĆE uhvatiti. Predložite 5 malih mutacija koje bi se mogle napraviti u kodu (npr. >= umjesto >, - umjesto +) i naznačite za svaku da li će postojeći testovi to uhvatiti. Za one koji nisu uhvaćeni, predložite testiranje: [testiranje] koda: [test] koda.

Slaba prompt / jaka prompt

SLABO: "Napišite test za ovu funkciju." (Rezultat: obično jedan sretan scenario, slaba tvrdnja; propuštaju greške.) SNAŽNO: "Napišite test za ovu funkciju 'passwordStrong'. Pravilo: najmanje 8 znakova, 1 veliko slovo, 1 cifra je potrebna. Pokrijte sljedeće scenarije kao ODVOJENI testovi: tačno 8 znakova (ograničenje), 7 znakova u znak za razmak (ispod ograničenja), bez razmaka (ispod ograničenja), predugačak (1000 znakova) Eksplicitno potvrdite očekivanu vrijednost true/false u svakom testu i imenujte test prema onome što provjerava."

Snažan prompt daje pravila i scenarije s punim granicama. Granični parovi poput "tačno 8/7 znakova" su najčešća mjesta na kojima se prave greške (brkanje > sa >=). Slab prompt zaobilazi ove granice i prenosi grešku u proizvodnju.

Vrste testova i gdje se koristiti

Vrsta testa

Šta potvrđuje?

AI doprinos

Pažnja

jedinica

Jedna funkcija/klasa

Brzo generiše više scenarija

Potrebna je smislena tvrdnja

integracija

Delovi rade zajedno

Nacrt scenarija i lažnih podataka

Istinsko ponašanje ovisnosti

završiti/prihvatiti

Cijeli tok korisnika

Lista koraka i očekivanja

sklona lomljivosti

regresija

Stara greška se ne vraća

Ispitivanje specifičnih grešaka

Treba dodati svakom popravku

Mini Cases

Slučaj 1 — Test koji uvijek prolazi. AI upisuje 12 testova u funkciju i svi prolaze. Inženjer postaje sumnjičav i namjerno iskrivljuje povratnu vrijednost funkcije; Samo 3 testa postaju crvene. Ostalih 9 testova ne sadrže smislene tvrdnje. Testiranje je pojačano lovom na mutacije; prava zaštita se postiže u 9 scenarija.

Slučaj 2 — Granična greška. Funkcija provjere starosti bi trebala reći "18 i više godina je važeća", ali je napisano >18, što znači da je dob od 18 godina odbijena. Greška se odmah pojavljuje u testiranju jer AI generiše scenario „tačno 18“ kroz analizu tačke prekida. Test sa jednim ograničenjem sprječava bilo kakve stvarne pritužbe korisnika.

Slučaj 3 — Popravljanje trenutnog ponašanja. Kada se AI kaže da "napiše test na osnovu ovog koda", on proizvodi test koji prihvata kao "tačnu" grešku zaokruživanja koja već postoji u kodu. Kada inženjer odštampa test u skladu sa zahtjevom (očekivana ispravna vrijednost), a ne kodom, test postaje crven i dolazi do prave greške. Testovi bi trebali biti izvedeni iz očekivanja, a ne iz koda.

Uobičajene greške

  • Besmisleno tvrditi. "Nije izbacio grešku" nije dovoljno; Ispravna vrijednost mora biti potvrđena.
  • Brkanje opsega sa kvalitetom. Visoka pokrivenost nije garancija tačnih rezultata.
  • Štampanje testa po kodu. Popravlja trenutnu grešku na "tačno"; Testovi bi trebali proizaći iz očekivanja.
  • Preskakanje graničnih vrijednosti. Zbrkati > sa >= je najčešća greška; granični parovi moraju biti testirani.
  • Bez revizije samog testa. Test koji ne postaje crven kada razbijete kod ne pruža zaštitu.

Ukratko

Dobar paket za testiranje je ključ za unošenje promjena s povjerenjem. AI brzo generiše mnoštvo scenarija, granica i negativnih situacija; Ali ako izvodi testove iz koda, a ne iz zahtjeva, može popraviti postojeće greške ili napisati besmislene testove koji uvijek prođu. Utvrdite konkretnu očekivanu vrijednost u svakom testu, uključite vezane parove i provjerite da li vaši testovi zapravo štite namjernim razbijanjem koda. Sadržaj tvrdnje, a ne broj opsega, određuje kvalitet.

Zadatak aplikacije

Odaberite funkciju i neka generiše testove u četiri kategorije (normalno, ograničenje, negativno, greška) sa sveobuhvatnim upitom za generisanje testa; Neka konkretna očekivana vrijednost bude potvrđena u svakom testu. Zatim pokrenite prompt za traženje ranjivosti za testiranje, predložite 5 malih mutacija u kodu i pokrenite testove da provjerite koje su uhvaćene. Dodajte novi test za barem jednu mutaciju koja nije uhvaćena i pokažite da je sada u minusu.

kontrolna lista

  • [ ] Ispisao sam testove na osnovu očekivanog/ispravnog ponašanja, a ne koda.
  • [ ] Pokrio sam normalne, granične, negativne i scenarije greške.
  • [ ] Potvrdio sam konkretnu očekivanu vrijednost u svakom testu.
  • [ ] Testirao sam granične parove (odmah iznad-ispod / malo iznad-ispod).
  • [ ] Namjernim razbijanjem koda, potvrdio sam da su testovi postali crveni.
  • [ ] Dodao sam novi test za neotkrivene mutacije.