Pelnas:
- Gebėjimas atpažinti tris pseudo-pasitikėjimo veidus (nepasireiškiantis, save tvirtinantis, trivialus tvirtinimas) ir pritaikyti priešnuodžius
- Galimybė naudoti mutacijų testavimą ir mutacijų balą kaip tikslesnį kokybės matą nei procentinė aprėptis įrankiu ar ranka
- Galimybė priskirti dirbtinį intelektą kaip raudonąją komandą prieš bandymus ir ieškoti spragų bandymams nepakliūti į pagyrimų spąstus
Šio modulio esmė yra pasikartojantis įspėjimas: žaliai švytinti bandymo skydelis nėra kokybės įrodymas. Jei jūsų testai suteikia jums pasitikėjimo, turite žinoti, ar tas pasitikėjimas yra tikras, ar netikras. Dirbtinio intelekto (DI) amžiuje šis klausimas yra svarbesnis nei bet kada anksčiau, nes DI puikiai atlieka sklandžius, sklandžiai atrodančius, bet tuščiavidurius testus. Klaidingas pasitikėjimas – manyti, kad programinė įranga yra teisinga, nes testai yra žali, nors iš tikrųjų testai nieko nepatvirtina – yra pavojingiausias dalykas, kuris gali nutikti kokybės užtikrinimo komandai; nes tai slepia ne tai, kad klaidų nėra, o tai, kad tu nematai klaidų. Šis skyrius sujungia viso modulio patvirtinimo filosofiją į vieną discipliną: testų testavimą.
Auksinis bandymų kokybės matavimo standartas: mutacijų tyrimas
Galingiausias būdas suprasti, ar testas iš tikrųjų apsaugo, ar ne, yra mutacijų testavimas (mutacijų testavimas – metodas, kuris sukuria tyčinius nedidelius šaltinio kodo iškraipymus/mutacijas ir matuoja, ar testai aptinka šiuos iškraipymus). Logika paprasta: jei tyčia sulaužysite kodą (paversdami + į -, a > į >=, iš true į false), geras bandymų rinkinys turėtų užfiksuoti tą sugadinimą ir pasidaryti raudonas. Jei ne, tas sutrikimas yra išlikęs mutantas, todėl jūsų testai iš tikrųjų neišsaugo tokio elgesio.
Mutacijos balas = nužudyta mutacija / visa mutacija. 90 % linijos aprėpties paketo mutacijos balas gali būti 40 %; Tai rodo, kad linijos veikia, bet elgsena nepatvirtinta. Mutacijos balas yra daug sąžiningesnis kokybės matas nei procentinė aprėptis.
Patarimas: yra automatinių mutacijų įrankių (PIT/Pitest – Java, Stryker – JavaScript/TypeScript, Stryker.NET – .NET, mutmut – Python). Jie automatiškai generuoja ir išbando šimtus mutacijų. Jei neturite įrankio, net rankinis „nulaužti kodą“ metodas yra neįkainojamas atliekant svarbias funkcijas.
Trys pseudo-pasitikėjimo veidai ir jo priešnuodis
Pseudo-pasitikėjimo forma
simptomas
priešnuodis
Testas be tvirtinimo
Kodas veikia, niekas nepatvirtinta
Tikras tvirtinimas kiekviename teste; testas su mutacija
save patvirtinantis testas
Tikėtina = kodo išvestis
Apskaičiuokite numatomą vertę savarankiškai
Trivialus tvirtinimas
"ne null", "200 grąžinta"
Patvirtinkite verslo taisyklę / faktinį rezultatą
Didelės apimties klaidingumas
90% linijų, maža apsauga
Pažiūrėkite į mutacijos balą
Trapi bandymo tolerancija
"Vėl įstrigo, praeikite"
Pagrindinė priežastis + deterministinis bandymas
AI naudojimas kaip „raudonoji komanda“
AI gali sukurti pseudopasitikėjimą ir būti galingu sąjungininku jį medžiojant. Naudokite dirbtinį intelektą kaip raudonąją komandą prieš savo pačių testus: paprašykite „parašyti kodą, kuris išlaiko šiuos testus, bet yra neteisingas“ arba „raskite pakeitimą, kuris suklaidins šiuos testus“. Jei AI randa spragų jūsų testuose, tos spragos yra tikra rizika.
Atsargiai: neklauskite AI „Ar mano testo kokybė gera? ir priimkite atsakymą „taip, puiku“ kaip užtikrinimą. AI linkęs būti malonus. Vietoj to, meskite iššūkį AI atlikti konkrečią užduotį: „sukurkite klaidą, kuri išlaikytų šiuos testus“. Jei jis gali tai padaryti, jūsų testai yra akli šiai klaidai.
Lygiavertės mutacijos ir balo ribos
Mutacijų testavimas yra galingas, tačiau jis turi spąstą: kai kurios mutacijos visiškai nekeičia kodo elgesio. Tai vadinama ekvivalentinėmis mutacijomis (ekvivalentinis mutantas – sugadintas kodas, mutacija, kuri duoda lygiai tokį patį rezultatą kaip ir originalas). Pavyzdžiui, pradinės kintamojo, kuris niekada nenaudojamas, reikšmės pakeitimas neturi įtakos išėjimui; Joks testas negali ir neturėtų to užfiksuoti. Todėl 100% mutacijos balas dažnai nepasiekiamas praktiškai ir nėra tikslas. Lygiaverčių mutacijų pašalinimas rankomis reikalauja daug darbo; Taigi mutacijų balą skaitykite ne kaip absoliutų egzamino balą, o kaip sąžiningą „ar mano testai tikrai apsaugo“ rodiklį?
Praktinis požiūris yra toks: užuot nuolat vykdydami mutacijų testavimą visoje kodų bazėje, paleiskite jį moduliuose, kuriuose yra didžiausia rizika ir sudėtingiausios verslo taisyklės. Ištirkite šiuose moduliuose išlikusias mutacijas po vieną; Jei tai tikra spraga, pridėkite testą; jei tai yra lygiavertė mutacija, pažymėkite ją pagrindimu ir patvirtinkite. AI gali atlikti pirminį patikrinimą, kad nustatytų, ar išlikusi mutacija yra lygiavertė; bet galutinį sprendimą priimate jūs, kurie žinote, ką daro kodas.
Atsargiai: mutacijų tyrimas yra brangus skaičiuojant (visi atitinkami testai atliekami iš naujo kiekvienai mutacijai). Taigi įprasta ir pagrįsta strategija yra planuoti ją kaip kas savaitę arba prieš išleidžiant gilų kritinių modulių patikrinimą, o ne kiekvieną sujungimą.
Silpnas raginimas / Stiprus raginimas
Silpnas: "Ar mano testų pakanka?"
Stiprus: "Veikite kaip raudona komanda šiai funkcijai ir bandymų rinkiniui. (1) Sukurkite 8 kodo mutacijas, kurias galima nužudyti (operatoriaus pakeitimas, ribos poslinkis, sąlygų inversija, grąžinamos vertės pakeitimas). (2) Kiekvienai mutacijai taip pat nurodykite, kuris iš esamų testų ją sugaus, o kuris NE. (3) Kiekvienai išlikusiai mutacijai, kuri bus sėkminga, parašykite pavyzdį, jei galite jį nužudyti. visus šiuos testus, bet pažeidžia verslo taisyklę Code+tests: [įklijuoti].
Galingas raginimas; Tai AI pozicionuoja kaip testą palaužiantį egzaminuotoją, o ne kaip giriamą mašiną.
Keturi kopijuojami šablonai
1) Rankinis mutacijų valdymas:
Sugeneruokite 8 reikšmingas šio kodo mutacijas (nežymius tyčinius sutrikimus): aritmetinio operatoriaus pakeitimas, palyginimo riba (> vs >=), loginė inversija, grįžimas / pastovus pakeitimas, sąlygų praleidimas. Kiekvienai mutacijai numatykite, kuris iš turimų testų ją sugaus ar ne. Kodas + testai: [įklijuoti]
2) Išgyvenusios mutacijos sunaikinimas:
Šioje mutacijų tyrimo ataskaitoje yra išlikusių (nepagautų) mutacijų: [sąrašas/ataskaita]. Kiekvienam parašykite minimalų testą, kuris sunaikins tą mutaciją (kodas taps raudonas, jei taip sulaužytas). Pakomentuokite, kokį elgesį patvirtina testas.
3) Raudonoji komanda – kraujo tyrimas:
Ar galite parašyti kodą, kuris ATLIEKA VISUS toliau nurodytus testus, bet pažeidžia šią verslo taisyklę: [verslo taisyklė]. Jei taip, kokia šių testų spraga tai leidžia? Pridėkite testą, kuris pašalins tą spragą. Testai: [įklijuoti]
4) Bandymo kokybės patikrinimas:
Patikrinkite šio testavimo rinkinio kokybę. Pažymėkite kiekvieną testą:- Ar yra tikras teiginys, ar tai yra rekvizitai?- Ar laukiama vertė nepriklauso, gaunama iš kodo?- Ar ji patvirtina verslo taisyklę ar ką nors nereikšmingo? Galiausiai pateikite apskaičiuotą „tikrąjį teiginio balą“ ir 3 silpniausius testus. Testai: [įklijuoti]
trys mini dėklai
1 atvejis – aprėptis 92%, mutacijos balas 38%. Viena komanda pasikliovė didele aprėptimi. Kai mutacijų tyrimas buvo atliktas naudojant Stryker, rezultatas buvo 38%: dauguma sukurtų mutacijų išgyveno. Tai buvo įrodymas, kad bandymai nevykdė linijų ir netikrino elgesio. Komanda investavo tris savaites į kokybės tikrinimą; Mutacijų balas padidėjo iki 81%, o kitame leidime atliekant šiuos sustiprintus testus buvo užfiksuotos dvi tikros skaičiavimo klaidos.
2 atvejis – AI apgavo testą. Naudodamas „raudonosios komandos“ šabloną, ekspertas paprašė AI kodo, kuris išlaikė esamus testus, bet pažeidė nuolaidų taisyklę. AI parašė kodą, kuris visada grąžino nulinę nuolaidą – ir visi testai liko žali, nes jokie testai nepatvirtino tikrosios nuolaidos vertės. Matoma spraga, pridėta tikrų tvirtinimų.
3 atvejis – pagyrimų spąstai. Jaunesnysis testuotojas paklausė AI: „Ar mano testai geri? ir palengvėjo išgirdęs atsakymą: „Labai išsamus“. Jo vyresnysis kolega tuos pačius testus atliko naudojant „testo kokybės audito“ šabloną; Paaiškėjo, kad 12 iš 20 testų buvo dekoro (be tvirtinimo ar šiukšlių). Teisingas klausimas atnešė teisingą atsakymą.
Dažnos klaidos
- Suklysta dėl kokybės. Pasikliauti dideliu eilučių aprėptimi ir visiškai nežiūrėti į mutacijos balą.
- Pasitikėjimas AI pagyrimu. Klausimas "Ar jūsų testai geri?" o teigiamą atsakymą laikydama užtikrinimu.
- Tikėtinos vertės išvedimas iš kodo. Savaiminio patikrinimo testai, patvirtinantys klaidingą kodą.
- Pasitenkinkite nereikšmingais teiginiais. Patikrinimai, kurie nepatvirtina tikrosios taisyklės, pvz., „not null“, „200 return“.
- Išlikusių mutacijų ignoravimas. Nepaisoma to, kas nebuvo užfiksuota mutacijų ataskaitoje.
- Net nebando rankiniu būdu pakeisti kritinio kodo. Jei įrankis nepasiekiamas, praleidžiamas veiksmas „Sulaužyti kodą ir išbandyti“.
Apibendrinant
Pseudo-pasitikėjimas yra įsitikinimas, kad programinė įranga yra teisinga, nes testai yra žali; tuo tarpu testai gali nieko nepatvirtinti. Auksinis standartas tai matuojant yra mutacijų testavimas: sąmoningas kodo sulaužymas ir išmatavimas, ar testai jį pagauna. Mutacijos balas yra daug sąžiningesnis kokybės matas nei procentinė aprėptis. Dirbtinis intelektas sukuria pseudo pasitikėjimą ir tampa galinga raudonąja komanda jį medžiojant – paprašykite „sukurti klaidą, kuri išlaikytų šiuos testus“. Išbandykite savo testus: tikras tvirtinimas, nepriklausoma laukiama vertė, verslo taisyklių patvirtinimas ir nužudytos mutacijos.
Taikymo užduotis
Importuokite funkciją su verslo taisykle ir jos testais iš savo projekto. Jei įmanoma, paleiskite mutacijos įrankį (Stryker/Pitest/mutmut) ir išmatuokite mutacijos balą; Jei įrankio nėra, sugeneruokite bent 8 mutacijas naudodami šabloną „rankinis mutacijų valdymas“ ir išbandykite jas rankiniu būdu. Kiekvienai išlikusiai mutacijai parašykite naują testą naudodami šabloną „nužudyti išlikusią mutaciją“. Galiausiai, naudodami „raudonosios komandos“ modelį, pažiūrėkite, ar AI gali sukurti kodą, kuris suklaidina jūsų testus. Praneškite apie savo pradžios ir pabaigos mutacijų balą (arba sugautų/visų mutacijų dažnį).
kontrolinis sąrašas
- [ ] Testo kokybę įvertinau pagal mutacijos balą, o ne aprėptį.
- [ ] Atlikau kritinio kodo mutacijų testavimą (įrankiu arba rankiniu būdu).
- [ ] Kiekvienai išlikusiai mutacijai parašiau naujus testus.
- [ ] DI naudojau kaip raudonąją komandą ir ieškojau spragų savo bandymuose.
- [ ] Dirbtinio intelekto pagyrimų „jūsų testai geri“ nepriėmiau kaip užtikrinimo.
- [ ] Patikrinau, kad kiekvienas testas patvirtina tikrąjį tvirtinimą, nepriklausomą numatomą vertę ir verslo taisyklę.