Jedinica 6 / 12

Automatizacija testiranja i osiguranje kvalitete

Dobici:

  • Sposobnost izrade jediničnih, integracijskih i rubnih testova sa smislenom tvrdnjom pomoću umjetne inteligencije
  • Sposobnost sustavnog izdvajanja pokrivenosti testa, graničnih vrijednosti i negativnih scenarija uz podršku umjetne inteligencije
  • Sposobnost provjere da testovi koje je izradio AI stvarno provjeravaju ponašanje, a ne samo ponavljanje postojećeg koda

Testiranje je mehanizam koji dokazuje da se softver stvarno ponaša kako je obećano. Dobar testni paket vam u sekundi govori hoće li promjena nešto pokvariti i daje inženjeru slobodu da djeluje s povjerenjem. AI ubrzava najzamorniji dio pisanja testa koji se najviše preskače: generiranje mnoštva scenarija, prijelomnih točaka i negativnih slučajeva. Ali ovdje postoji lukava zamka: umjetna inteligencija može pisati testove koji provjeravaju trenutno (možda neispravno) ponašanje koda, a ne njegovo navodno ponašanje; ili može proizvesti prazne testove koji uvijek prolaze, a zapravo ništa ne provjeravaju. Vrijednost testa nije u tome je li prošao, već u tome provjerava li pravu stvar i postaje li crvena kada je pogrešna.

U ovoj ćete jedinici naučiti kako proizvesti jedinične, integracijske i rubne testove sa smislenim tvrdnjama; kako sustavno izdvojiti pokrivenost testa, prijelomne točke i negativne scenarije; i vidjet ćemo kako možete provjeriti da testovi koje AI proizvodi zapravo potvrđuju ponašanje.

Koncepti: Jedinično testiranje: Testira jednu funkciju/klasu u izolaciji. Testiranje integracije: Testira da više dijelova ispravno radi zajedno. Assert: izjava koja provjerava je li rezultat jednak očekivanom; Ovo je srce testa. Pokrivenost: Koliko se koda pokreće testovima; Visoka pokrivnost ne jamči kvalitetu.

Izrada smislenih testova

Dobar test jasno čini tri stvari: uspostavlja stanje, izvodi radnju, potvrđuje rezultat. Kada ispisujete testove u AI, odredite koje ponašanje želite provjeriti i koje bi scenarije trebalo pokriti; Inače proizvodi površne testove koji uvijek prolaze.

  1. Definirajte ponašanje koje će se testirati. "Što se računa kao pravo?" Jasno odgovorite na pitanje.
  2. Pitajte za vrste scenarija. Normalno, granično, negativno, stanje pogreške.
  3. Uvezite smislenu tvrdnju. Nije samo "izbacio pogrešku", nego je "vratio ispravnu vrijednost".
  4. Provjerite točnost testa. Da li test postaje crven kada svjesno razbijete šifru?

Uputa za generiranje sveobuhvatnog testa: "Napišite jedinične testove za sljedeću funkciju 'primijenipopust(iznos, kupon)'. Imajte BAREM jedan scenarij u sljedećim kategorijama: (1) normalno važeći kupon, (2) prijelomne točke (0 iznos, 100% popust), (3) negativan (nevažeći kupon, negativan iznos), (4) slučaj pogreške (nulti kupon). Potvrdite KONKRETNU očekivanu vrijednost u svaki test (ne samo 'radio').

Prompt za izdvajanje granične vrijednosti: "Izvršite analizu granične vrijednosti za ulaze ove funkcije. Za svaki parametar izdvojite vrijednosti 'odmah na granici', 'odmah ispod granice', 'odmah iznad granice' kao tablicu. Zatim navedite testne scenarije koji pokrivaju te granice. Nemojte još pisati kod, samo analizu i popis scenarija. Funkcija: [potpis]"

Oprez: Visoka pokrivenost testom (npr. 90%) ne dokazuje da je kod točan. Pokrivenost mjeri koliko je redaka izvršeno; nije da te linije daju točan rezultat. Test bez smislene tvrdnje povećava pokrivenost, ali ne jamči ništa. Sadržaj tvrdnje određuje kvalitetu, a ne broj tvrdnji.

Testiranje samog testa: logika mutacije

Najpraktičniji način da shvatite radi li test koji je generirao umjetna inteligencija doista radi je namjerno razbijanje koda (logika testiranja mutacije). Obrnuti uvjet, staviti znak + -; Ako nijedan test ne postane crven, vaši testovi zapravo ne održavaju to ponašanje.

Uputa za traženje ranjivosti testiranja: "Recite mi koje potencijalne pogreške u ovom kodu sljedeći testovi NE MOŽDA otkriti. Predložite 5 malih mutacija koje bi se mogle napraviti u kodu (npr. >= umjesto >, - umjesto +) i za svaku naznačite hoće li je postojeći testovi uhvatiti. Za one koji nisu uhvaćeni, predložite testiranje koje bi trebalo dodati. Kod: [kod] Testovi: [test]"

Slab upit / Jak upit

SLABO: "Napišite test za ovu funkciju." (Rezultat: obično jedan sretan scenarij, slaba tvrdnja; propušta pogreške.) SNAŽNO: "Napišite test za ovu funkciju 'passwordStrong'. Pravilo: potrebno je najmanje 8 znakova, 1 veliko slovo, 1 znamenka. Pokrijte sljedeće scenarije kao ODVOJENE testove: točno 8 znakova (ograničenje), 7 znakova (ispod ograničenja), bez velikih slova, bez znamenki, prazan niz, samo razmaci, također dugo (1000 znakova) Eksplicitno navedite očekivanu istinitu/netočnu vrijednost u svakom testu i imenujte test prema onome što provjerava."

Snažni prompt daje pravila i potpune granične scenarije. Parovi granica kao što je "točno 8 / 7 znakova" najčešća su mjesta za pravljenje pogrešaka (brkanje > s >=). Slab brzi zaobilazi te granice i prenosi pogrešku u proizvodnju.

Vrste testova i gdje se koriste

Vrsta testa

Što potvrđuje?

AI doprinos

Pažnja

jedinica

Pojedinačna funkcija/klasa

Brzo generira više scenarija

Potrebna je smislena tvrdnja

integracija

Dijelovi rade zajedno

Scenarij i lažni nacrt podataka

Istinsko ovisničko ponašanje

završiti/prihvatiti

Cjelokupni protok korisnika

Popis koraka i očekivanja

sklon lomljivosti

regresija

Stara pogreška se ne vraća

Ispitivanje specifičnih grešaka

Treba dodati svakom popravku

Mini kućišta

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

Slučaj 2 — Pogreška granice. Funkcija provjere dobi trebala bi reći "18 i više vrijedi", ali je napisano >18, što znači da se dob od 18 odbija. Pogreška se odmah pojavljuje u testiranju jer AI generira scenarij "točno 18" kroz analizu prijelomne točke. Jedan test ograničenja sprječava bilo kakve pritužbe stvarnog korisnika.

Slučaj 3 — Popravljanje trenutnog ponašanja. Kada se AI-u kaže da "napiše test temeljen na ovom kodu", on proizvodi test koji prihvaća kao "točnu" pogrešku zaokruživanja koja već postoji u kodu. Kada inženjer ispiše test prema zahtjevu (očekivana točna vrijednost), a ne kod, test postaje crven i javlja se stvarna pogreška. Testovi bi trebali biti izvedeni iz očekivanja, a ne iz koda.

Uobičajene greške

  • Besmislena tvrdnja. "Nije poslana pogreška" nije dovoljno; Mora se provjeriti točna vrijednost.
  • Brkanje opsega s kvalitetom. Visoka pokrivenost nije jamstvo točnih rezultata.
  • Ispis testa po šifri. Popravlja trenutnu pogrešku na "true"; Testovi bi trebali proizaći iz očekivanja.
  • Preskakanje graničnih vrijednosti. Brkanje > s >= je najčešća pogreška; granični parovi moraju biti ispitani.
  • Bez revizije samog testa. Test koji ne pocrveni kada probijete šifru ne pruža zaštitu.

Ukratko

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

Zadatak aplikacije

Odaberite funkciju i neka ona generira testove u četiri kategorije (normalno, ograničenje, negativno, pogreška) s opsežnim odzivom za generiranje testa; Navedite konkretnu očekivanu vrijednost u svakom testu. Zatim pokrenite prompt za traženje ranjivosti, 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.

popis za provjeru

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