Pelnas:
- Gebėjimas atlikti vienetų, integravimo ir kraštinių atvejų testus su prasmingu teiginiu su AI
- Galimybė sistemingai išgauti bandymų aprėptį, ribines vertes ir neigiamus scenarijus su AI palaikymu
- Galimybė patikrinti, ar AI sukurti testai iš tikrųjų patikrina elgesį, o ne tik pakartoja esamą kodą
Testavimas yra mechanizmas, įrodantis, kad programinė įranga iš tikrųjų veikia taip, kaip žadėta. Geras bandymų rinkinys per kelias sekundes praneš, ar pakeitimas ką nors sulaužo, ir suteikia inžinieriui laisvę veikti užtikrintai. Dirbtinis intelektas pagreitina nuobodžiausią ir dažniausiai praleidžiamą testo rašymo dalį: sukuria daugybę scenarijų, lūžio taškų ir neigiamų atvejų. Tačiau čia yra slapti spąstai: AI gali parašyti testus, kurie patikrina esamą (galbūt klaidingą) kodo elgesį, o ne jo tariamą elgesį; arba jis gali sukurti tuščius testus, kurie visada praeina, iš tikrųjų nieko netikrina. Testo vertė yra ne tame, ar jis išlaikomas, o tai, ar jis patikrina, ar yra teisingas dalykas, ir nusidažo raudonai, kai jis neteisingas.
Šiame skyriuje sužinosite, kaip parengti vienetų, integravimo ir kraštinių atvejų testus su prasmingais teiginiais; kaip sistemingai išgauti bandymo aprėptį, lūžio taškus ir neigiamus scenarijus; ir pamatysime, kaip galite patikrinti, ar AI atlikti testai iš tikrųjų patvirtina elgesį.
Sąvokos: Vieneto testavimas: Tikrina vieną funkciją/klasę atskirai. Integravimo testavimas: patikrinama, ar kelios dalys tinkamai veikia kartu. Assert: teiginys, kuris patikrina, ar rezultatas yra lygus tam, kurio tikėtasi; Tai yra testo esmė. Aprėptis: kiek kodo paleidžiama testais; Didelė aprėptis negarantuoja kokybės.
Prasmingų testų rengimas
Geras testas aiškiai daro tris dalykus: nustato būseną, atlieka veiksmą, patvirtina rezultatą. Kai spausdinate AI testus, nurodykite, kokį elgesį norite patikrinti ir kokius scenarijus jis turėtų apimti; Priešingu atveju jis atlieka paviršutiniškus testus, kurie visada praeina.
- Apibrėžkite elgesį, kurį reikia išbandyti. "Kas laikoma teisinga?" Aiškiai atsakykite į klausimą.
- Klauskite scenarijų tipų. Normali, ribinė, neigiama, klaidos būsena.
- Importuoti prasmingą tvirtinimą. Tai ne tik „išmetė klaidą“, bet ir „grąžino teisingą vertę“.
- Patikrinkite testo tikslumą. Ar testas pasidaro raudonas, kai sąmoningai sulaužote kodą?
Išsamus testo generavimo raginimas: "Parašykite vieneto testus, skirtus šiai funkcijai "taikyti nuolaidą(suma, kuponas)". Turėkite BENT vieną scenarijų šiose kategorijose: (1) įprastas galiojantis kuponas, (2) lūžio taškai (0 suma, 100 % nuolaida), (3) neigiamas (netinkamas kuponas, neigiama suma), (4) kiekvieno laukiamo klaidos atvejo NC (nuliliuojama) vertė. tik „veikė“).
Ribinės vertės ištraukimo raginimas: "Atlikite šios funkcijos įvesties ribinių verčių analizę. Išskirkite kiekvieno parametro reikšmes "tiesiog prie ribos", "tuoj žemiau ribos", "tiesiai virš ribos" kaip lentelę. Tada nurodykite bandymo scenarijus, apimančius šias ribas. Dar nerašykite kodo, tik analizė ir [scenarijų sąrašas]".
Atsargiai: didelė bandymo aprėptis (pvz., 90 %) neįrodo, kad kodas yra teisingas. Aprėptis matuoja, kiek eilučių buvo įvykdyta; ne todėl, kad tos linijos duoda teisingą rezultatą. Testas be prasmingo tvirtinimo padidina aprėptį, bet nieko negarantuoja. Teigimo turinys lemia kokybę, o ne tvirtinimų skaičių.
Paties testo išbandymas: mutacijos logika
Praktiškiausias būdas suprasti, ar AI sukurtas testas iš tikrųjų veikia, yra sąmoningai sulaužyti kodą (mutacijų testavimo logika). Apverskite sąlygą, padarykite + ženklą -; Jei nė vienas testas nepasidaro raudonas, jūsų testai iš tikrųjų nepalaiko tokio elgesio.
Išbandykite pažeidžiamumo paieškos raginimą: "Pasakykite man, kokių galimų šio kodo klaidų šie testai GALI NEGALIMA sugauti. Pasiūlykite 5 mažas kodo mutacijas (pvz., >= vietoj >, - vietoj +) ir nurodykite kiekvienam, ar esami testai jį sugautų. Tiems, kurie nepagavo, siūlykite atlikti testavimą, kurį reikėtų pridėti. Kodas: [kodas] Testai: [testas]"
Silpnas raginimas / stiprus raginimas
WEAK: "Parašykite šios funkcijos testą." (Rezultatas: paprastai vienas laimingas scenarijus, silpnas tvirtinimas; praleidžiamos klaidos.) STIPRUS: "Parašykite testą šiai funkcijai "passwordStrong". Taisyklė: mažiausiai 8 simboliai, 1 didžioji raidė, 1 skaitmuo. Apimkite šiuos scenarijus kaip ATSKIRUS testus: tiksliai 8 simboliai (riba), 7 simboliai (be skaitmenų, be skaitmenų, tik žemiau ribų tarpai, per ilgi (1000 simbolių) Kiekviename teste aiškiai nurodykite tikėtiną teisingą / klaidingą reikšmę ir pavadinkite testą pagal tai, ką jis tikrina.
Galingas raginimas pateikia taisykles ir visus ribų scenarijus. Ribinės poros, pvz., „tiksliai 8/7 simboliai“, yra dažniausiai pasitaikančios klaidų vietos (painiojama su >=). Silpna raginimas apeina šias ribas ir perkelia klaidą į gamybą.
Bandymų tipai ir kur naudoti
Bandymo tipas
Ką tai patvirtina?
AI indėlis
Dėmesio
vienetas
Viena funkcija / klasė
Greitai generuoja kelis scenarijus
Būtinas prasmingas tvirtinimas
integracija
Dalys veikia kartu
Scenarijus ir imitacinių duomenų juodraštis
Tikras priklausomybę sukeliantis elgesys
pabaiga/priimti
Visas vartotojų srautas
Žingsnių sąrašas ir lūkesčiai
linkę į trapumą
regresija
Sena klaida negrįžta
Specifinis gedimo bandymas
Reikėtų pridėti prie kiekvieno pataisymo
Mini dėklai
1 atvejis – testas, kuris visada išlaikomas. AI įrašo 12 funkcijos testų ir jie visi praeina. Inžinierius tampa įtarus ir sąmoningai iškreipia funkcijos grąžinamąją reikšmę; Tik 3 bandymai pasidaro raudoni. Kituose 9 testuose nėra prasmingų tvirtinimų. Testavimą sustiprina mutacijų medžioklė; tikroji apsauga įgyjama 9 scenarijais.
2 atvejis – ribos klaida. Amžiaus patvirtinimo funkcija turėtų pasakyti „18 ir vyresni galioja“, bet rašoma >18, o tai reiškia, kad 18 metų amžius atmetamas. Klaida iš karto pasirodo atliekant bandymus, nes AI generuoja „būtent 18“ scenarijų, atlikdama lūžio taško analizę. Vienos ribos testas apsaugo nuo realių vartotojų skundų.
3 atvejis – esamos elgsenos taisymas. Kai AI liepiama „parašyti testą pagal šį kodą“, jis sukuria testą, kuris priima kaip „teisingą“ apvalinimo klaidą, kuri jau yra kode. Kai inžinierius išspausdina testą pagal reikalavimą (tikėtiną teisingą reikšmę), o ne kodą, testas nusidažo raudonai ir įvyksta tikroji klaida. Testai turėtų būti išvesti iš lūkesčių, o ne iš kodo.
Dažnos klaidos
- Beprasmis tvirtinimas. „Neišmetė klaidos“ neužtenka; Reikia patikrinti teisingą vertę.
- Paini apimtis su kokybe. Didelė aprėptis negarantuoja tikslių rezultatų.
- Testo spausdinimas pagal kodą. Ištaiso esamą klaidą į "true"; Testai turėtų būti pagrįsti lūkesčiais.
- Ribinių verčių praleidimas. Supainioti > su >= yra dažniausia klaida; ribinės poros turi būti išbandytos.
- Netikrinti paties testo. Testas, kuris neparaudo, kai pažeidžiate kodą, nesuteikia apsaugos.
Apibendrinant
Geras testavimo rinkinys yra raktas į užtikrintus pakeitimus. AI greitai sukuria daugybę scenarijų, ribų ir neigiamų situacijų; Bet jei jis atlieka testus iš kodo, o ne iš reikalavimų, jis gali ištaisyti esamas klaidas arba parašyti beprasmius testus, kurie visada praeina. Kiekviename bandyme nurodykite konkrečią numatomą vertę, įtraukite susietas poras ir patikrinkite, ar jūsų testai iš tikrųjų apsaugo, sąmoningai sulaužydami kodą. Teigimo turinys, o ne apimčių skaičius lemia kokybę.
Taikymo užduotis
Pasirinkite funkciją ir sugeneruokite keturių kategorijų testus (normalus, ribinis, neigiamas, klaida) naudodami išsamią testų generavimo užklausą; Kiekviename bandyme nurodykite konkrečią numatomą vertę. Tada paleiskite pažeidžiamumo paieškos užklausą, pasiūlykite 5 mažas kode mutacijas ir atlikite testus, kad patikrintumėte, kurias jos pagauna. Pridėkite naują testą bent vienai mutacijai, kuri nebuvo užfiksuota, ir parodykite, kad ji dabar yra neigiama.
kontrolinis sąrašas
- [ ] Atspausdinau testus pagal tikėtiną/teisingą elgesį, o ne kodą.
- [ ] Apžvelgiau įprastus, ribinius, neigiamus ir klaidų scenarijus.
- [ ] Kiekviename bandyme pateikiau konkrečią numatomą vertę.
- [ ] Išbandžiau kraštinių poras (šiek tiek aukščiau-apačioje / šiek tiek aukščiau-apačioje).
- [ ] Sąmoningai sulaužydamas kodą patvirtinau, kad testai tapo raudoni.
- [ ] Pridėjau naują neaptiktų mutacijų testą.