Üksus 6 / 12

Testimise automatiseerimine ja kvaliteedi tagamine

Kasu:

  • Võimalus luua tehisintellektiga sisuka kinnitusega ühiku-, integratsiooni- ja servajuhtumiteste
  • Võimalus AI toega süstemaatiliselt välja võtta testide katvus, piirväärtused ja negatiivsed stsenaariumid
  • Võimalus kontrollida, kas tehisintellekti loodud testid tõepoolest kontrollivad käitumist ega korda ainult olemasolevat koodi

Testimine on mehhanism, mis tõestab, et tarkvara käitub tegelikult nii, nagu lubatud. Hea testikomplekt annab sekunditega teada, kas muudatus rikub midagi ja annab insenerile vabaduse enesekindlalt tegutseda. AI kiirendab testi kirjutamise kõige tüütumat ja enim vahele jäetud osa: luuakse palju stsenaariume, katkestuspunkte ja negatiivseid juhtumeid. Kuid siin on salakaval lõks: AI võib kirjutada teste, mis kontrollivad koodi praegust (võib-olla vigast) käitumist, mitte selle oletatavat käitumist; või see võib toota tühje teste, mis alati läbivad, tegelikult ei kontrolli midagi. Testi väärtus ei seisne selles, kas see läbib, vaid selles, kas see kontrollib õiget asja ja muutub punaseks, kui see on vale.

Selles üksuses saate teada, kuidas koostada tähenduslike väidetega ühiku-, integratsiooni- ja servajuhtumiteste; kuidas süstemaatiliselt välja võtta testide katvus, murdepunktid ja negatiivsed stsenaariumid; ja vaatame, kuidas saate kontrollida, kas AI tehtud testid tegelikult käitumist kinnitavad.

Mõisted: Ühiku testimine: testib ühte funktsiooni/klassi eraldi. Integratsiooni testimine: testib mitu osa õigesti koos töötamist. Assert: väide, mis kontrollib, kas tulemus on võrdne oodatuga; See on testi tuum. Katvus: kui suurt osa koodist testid käivitavad; Kõrge katvus ei taga kvaliteeti.

Tähenduslike testide koostamine

Hea test teeb selgelt kolm asja: see loob oleku, sooritab toimingu, kinnitab tulemuse. AI-le testide printimisel määrake, millist käitumist soovite kontrollida ja milliseid stsenaariume see peaks hõlmama; Vastasel juhul annab see pinnapealseid teste, mis alati läbivad.

  1. Määratlege testitav käitumine. "Mis loetakse õigeks?" Vastake küsimusele selgelt.
  2. Küsige stsenaariumitüüpe. Tavaline, piir, negatiivne, veatingimus.
  3. Importige sisukas väide. See ei teinud lihtsalt "viga", vaid "tagas õige väärtuse".
  4. Kontrollige testi täpsust. Kas test muutub punaseks, kui rikute koodi teadlikult?

Põhjalik testi genereerimise viip: "Kirjutage ühikutestid järgmise funktsiooni "rakenda allahindlus(summa, kupong)" jaoks. Kasutage VÄHEMALT ühte stsenaariumi järgmistes kategooriates: (1) tavaline kehtiv kupong, (2) katkestuspunktid (0 summa, 100% allahindlus), (3) negatiivne (kehtetu kupong, negatiivne summa), (4) iga oodatava vea testi puhul CONCTE väärtus (ei nulli). lihtsalt "töötas").

Piirväärtuse ekstraheerimise viip: "Tehke selle funktsiooni sisendite jaoks piiriväärtuse analüüs. Eraldage iga parameetri jaoks väärtused "just piiril", "vahetult allpool piiri", "vahetult üle piiri". Seejärel loetlege neid piire katvad testistsenaariumid. Ärge kirjutage veel koodi, vaid lihtsalt analüüs ja stsenaariumiloend]."

Ettevaatust! Testi kõrge katvus (nt 90%) ei tõenda, et kood on õige. Katvus mõõdab, mitu rida täideti; mitte, et need jooned annaksid õige tulemuse. Test ilma sisulise väiteta suurendab katvust, kuid ei garanteeri midagi. Väite sisu määrab kvaliteedi, mitte väidete arv.

Testi enda testimine: mutatsiooniloogika

Kõige praktilisem viis mõista, kas tehisintellekti loodud test ka tegelikult töötab, on koodi tahtlik murdmine (mutatsioonitestimise loogika). Pöörake tingimus, tehke + märk -; Kui ükski test ei muutu punaseks, ei säilita teie testid seda käitumist.

Testige haavatavuse otsimise viip: "Öelge mulle, milliseid võimalikke vigu selles koodis järgmised testid EI TOHI tabada. Soovitage 5 väikest mutatsiooni, mida saaks koodis teha (nt >= asemel >, - + asemel) ja märkige igaühe puhul, kas olemasolevad testid suudaksid selle kinni püüda. Kellele, keda ei tabata, soovitage testida, mis tuleks lisada. Kood: [kood]" Testid: [test]"

Nõrk viip / Tugev viip

NÕRK: "Kirjutage sellele funktsioonile test." (Tulemus: tavaliselt üks õnnelik stsenaarium, nõrk kinnitus; vead puuduvad.) STRONG: "Kirjutage sellele funktsioonile "passwordStrong" test. Reegel: vähemalt 8 tähemärki, 1 suurtäht, 1 number nõutav. Katke järgmised stsenaariumid ERALDI testidena: täpselt 8 tähemärki (limiit), 7 tähemärki pole tühi (ainult tähed alla, tähed ei ole tühi, tühikud, liiga pikk (1000 tähemärki) Kinnitage igas testis selgesõnaliselt eeldatav tõene/väär väärtus ja nimetage test vastavalt sellele, mida see kontrollib."

Võimas viip annab reeglid ja täielikud piiristsenaariumid. Piiripaarid nagu "täpselt 8/7 tähemärki" on kõige levinumad kohad, kus vigu tehakse (segi ajades > ja >=). Nõrk viip ületab need piirid ja kannab vea tootmisse.

Testitüübid ja kus kasutada

Testi tüüp

Mida see kinnitab?

AI panus

Tähelepanu

üksus

Üks funktsioon/klass

Loob kiiresti mitut stsenaariumi

Nõutav on sisukas väide

integratsiooni

Osad töötavad koos

Stsenaarium ja näidisandmete mustand

Tõeline sõltuvust tekitav käitumine

lõpeta/võta vastu

Kogu kasutajavoog

Sammude nimekiri ja ootus

kalduvus rabedusele

regressioon

Vana viga ei naase

Vea spetsiifiline testimine

Tuleks lisada igale parandusele

Mini korpused

Juhtum 1 – test, mis alati läbib. AI kirjutab funktsioonile 12 testi ja need kõik läbivad. Insener muutub kahtlustavaks ja moonutab tahtlikult funktsiooni tagastusväärtust; Ainult 3 testist lähevad punaseks. Ülejäänud 9 testi ei sisalda sisukaid väiteid. Testimist tugevdab mutatsioonijaht; tõeline kaitse saavutatakse 9 stsenaariumi korral.

Juhtum 2 – piirviga. Vanuse kinnitamise funktsioon peaks ütlema "18 ja vanemad on kehtiv", kuid kirjas on >18, mis tähendab, et vanus 18 lükatakse tagasi. Viga ilmneb testimisel kohe, kuna AI genereerib murdepunkti analüüsi kaudu "täpselt 18" stsenaariumi. Ühe limiidi test hoiab ära kõik tegelikud kasutajakaebused.

Juhtum 3 – voolukäitumise parandamine. Kui AI-l kästakse "selle koodi põhjal test kirjutada", loob see testi, mis aktsepteerib "õigena" koodis juba olemasolevat ümardamisvea. Kui insener prindib testi vastavalt nõudele (eeldatav õige väärtus), mitte koodi, muutub test punaseks ja ilmneb tõeline viga. Testid tuleks tuletada ootustest, mitte koodist.

Levinud vead

  • Mõttetu väide. "Ei visanud viga" ei piisa; Õiget väärtust tuleb kontrollida.
  • Segamine ulatus kvaliteediga. Kõrge katvus ei taga täpseid tulemusi.
  • Testi printimine koodi järgi. Parandab praeguse vea väärtuseks "tõene"; Testid peaksid lähtuma ootusest.
  • Piirväärtuste vahelejätmine. > segamini ajamine >=-ga on kõige levinum viga; tuleb katsetada piiripaare.
  • Ei kontrolli testi ennast. Test, mis koodi murdmisel punaseks ei lähe, ei paku kaitset.

Kokkuvõttes

Hea testimiskomplekt on võti muudatuste enesekindlaks tegemiseks. AI loob kiiresti palju stsenaariume, piire ja negatiivseid olukordi; Kuid kui see tuletab testid koodist, mitte nõuetest, saab see olemasolevaid vigu parandada või kirjutada mõttetuid teste, mis alati läbivad. Kinnitage igas testis konkreetne eeldatav väärtus, lisage seotud paarid ja kontrollige, kas teie testid tegelikult kaitsevad koodi tahtliku murdmisega. Väite sisu, mitte ulatuste arv, määrab kvaliteedi.

Rakenduse ülesanne

Valige funktsioon ja laske sellel luua nelja kategooriasse (tavaline, piirväärtus, negatiivne, viga) teste koos põhjaliku testi genereerimise viipaga; Laske igas katses kinnitada konkreetne eeldatav väärtus. Seejärel käivitage haavatavuse otsimise viip, soovitage koodis 5 väikest mutatsiooni ja käivitage testid, et kontrollida, millised need kinni püüavad. Lisage uus test vähemalt ühe mutatsiooni jaoks, mida ei leitud, ja näidake, et see on nüüd miinuses.

kontrollnimekiri

  • [ ] Printisin testid eeldatava/õige käitumise, mitte koodi järgi.
  • [ ] Käsitlesin tava-, piir-, negatiivse- ja veastsenaariume.
  • [ ] Kinnitasin igas katses konkreetse eeldatava väärtuse.
  • [ ] Testisin piiripaare (veidi üleval-all / veidi üleval-all).
  • [ ] Tahtlikult koodi murdes kinnitasin, et testid läksid punaseks.
  • [ ] Lisasin uue testi avastamata mutatsioonide jaoks.