Vienetas 5 / 12

Bandomoji gamyba ir kokybės užtikrinimas

Pelnas:

  • Galimybė atlikti vienetų testavimą, briaunų atvejus ir aprėpties spragų analizę naudojant AI
  • Galimybė spausdinti bandymo lūkesčius pagal specifikaciją, o ne dabartinę kodo elgseną
  • Galimybė patikrinti, ar testas iš tikrųjų apsaugo įvedant klaidas

Testų rašymas yra viena iš labiausiai vertę kuriančių užduočių, kurias dauguma kūrėjų atideda. Geras bandymų rinkinys yra įrodymas, kad kodas veikia taip, kaip tikėtasi, ir gelbėjimo linija būsimiems pakeitimams. Problema ta, kad testų rašymas yra pasikartojantis ir atimantis daug laiko – būtent toks darbas, kuriame AI šviečia. Tačiau yra klaida: AI dažnai tikrina esamą kodo elgseną, o ne elgseną, kuri turėtų būti. Šio skirtumo valdymas yra šio įrenginio esmė.

Šiame skyriuje išmoksite atlikti vienetų testavimą (testavimą, kuriuo tikrinama funkcija atskirai, atskirai), kraštinių atvejų testų ir bandymų duomenų generavimo naudojant AI; bandymo aprėpties spragų uždarymas; ir kodėl aklai pasitikėti AI testais yra pavojinga.

Dvi testavimo pusės: elgesio taisymas ir patikrinimas

Testas gali būti naudojamas dviem skirtingais tikslais. Pirmasis – patikrinimas: patikrinama, ar kodas teisingas, ar jis atitinka specifikaciją. Antroji – regresinė apsauga: sustabdo kodo veikimą šiandien, todėl rytoj kas nors netyčia jį pakeis, testas suges ir praneš.

AI yra labai geras pastarajame; Jis žiūri į kodą ir generuoja atvejus, kurie patikrina, „ką jis daro šiuo metu“. Bet jei kodas neteisingas nuo pat pradžių, AI gali priskirti tą neteisingą elgesį kaip „teisingą“. Taigi jūs turite peržiūrėti kiekvieno AI testo teiginį: „Kodas grąžina 42, o testas tikisi 42“ nereiškia, kad 42 yra teisingas atsakymas.

Atsargiai: jei AI išlaiko testą, tai nereiškia, kad kodas „veikia“; tai tiesiog reiškia "jis elgiasi taip, kaip tikisi AI". Jūs nuspręsite, ar lūkesčiai teisingi, ar ne, žiūrėdami į specifikaciją.

Žingsnis po žingsnio: patikimų testų rašymas naudojant AI

  1. Pateikite specifikaciją, o ne tik kodą. Jei pridėsite informaciją „Ši funkcija turėtų tai padaryti“, AI gali parašyti teisingą lūkestį; Jis patikrins dabartinį elgesį, jei tik pateiksite kodą.
  2. Paklauskite kraštinių dėklų. Tuščia, nulinė, nulis, neigiama, per didelė, blogas formatas, sutapimas – aiškiai nurodykite, kad nėra laimingo kelio.
  3. Nurodykite testavimo sistemą ir stilių. "naudokite pytest", "Arrange-Act-Assert šabloną", "leiskite kiekvienam testui išbandyti vieną dalyką" ir kt.
  4. Patikrinkite lūkesčius (teigimą). Palyginkite su specifikacija, kurią kiekvienas teiginys patikrina, ar teisinga vertė.
  5. Uždarykite taikymo srities spragas. Pateikite esamus testus ir paklauskite "kurios šakos ir atvejai nebuvo išbandyti?" priversti jus paklausti; tada patikrinkite papildomus atliktus bandymus.

Trys mini dėklai

1 atvejis – aprėptis nuo 52 % iki 85 %. Vieno paslaugų modulio testavimo aprėptis siekė 52%. Komanda pateikė AI esamus testus, pareikalavo, kad šis išvardintų neišbandytas šakas ir sugeneruotų joms testus. Atlikus žmogaus peržiūrą, aprėptis padidėjo iki 85 %; Proceso metu AI atskleidė tikrąją klaidą (kelią, kuris grąžino neteisingą klaidos kodą) klaidos šakoje, kuri niekada nebuvo išbandyta anksčiau.

2 atvejis – klaidingų lūkesčių fiksavimo spąstai. Pinigų apvalinimo funkcija iš tikrųjų buvo neteisinga; Užuot suapvalinus nuo 2,675 iki 2,67, jis buvo apvalinamas 2,67, o ne 2,68. AI pažvelgė į kodą ir parašė assert round_money(2.675) == 2.67 – klaidą užfiksavo kaip „true“. Kai kūrėjas perskaitė specifikaciją, jis pataisė lūkesčius ir pastebėjo tikrąją klaidą. Išbandžius taisyklę, o ne kodą, pasikeitė.

3 atvejis – krašto būsenos sprogimas. Kai AI prašoma tik „kraštinių atvejų“ datos sekos funkcijai; Jis sukūrė 8 atvejus, tokius kaip pradžia = pabaiga, atvirkštinis intervalas, keliamieji metai vasario 29 d., skirtingos laiko juostos ir nulinis intervalas. Du iš jų (atvirkštinis tarpas ir keliamieji metai) iš tikrųjų sukėlė klaidą. Šių atvejų svarstymas rankiniu būdu dažnai praleidžiamas; Čia dirbtinis intelektas tapo „krašto atvejo minčių šturmo“ partneriu.

Keturi kopijuojami šablonai

Specifikacijomis pagrįstas bandymų generavimas:

Vaidmuo: kūrėjas, rašantis testus. Struktūra: {{pytest/JUnit/Jest...}}. Ką funkcija TURI DARYTI (specifikacija): {{taisyklė}}Parašykite šios funkcijos testus. Parašykite lūkesčius pagal specifikaciją, NE dabartinę kodo išvestį. Laimingas kelias + pridėkite bent 4 kraštutinius atvejus. Leiskite kiekvienam bandymui išbandyti vieną dalyką, naudokite aprašomąjį pavadinimą. {{funkcija}}

„Edge case“ smegenų šturmas:

Išvardykite kraštų / gedimų atvejus, kuriuos reikėtų išbandyti atliekant šios funkcijos testavimą (nulis, nulis, lūžio taškai, netinkamas formatas, lygiagretumas, išorinė klaida). Kiekvienu atveju: įvestis, laukiama elgsena. Dar NERAŠYKITE kodo, tiesiog surašykite.{{funkcija}}

Aprėpties spragų analizė:

Žemiau pateikiamos funkcijos ir galimi testai. Kurios šakos, sąlygos ir atvejai nebuvo išbandyti? Išvardykite trūkumus ir naujus testus rašykite tik dėl trūkumų. Nekartokite esamų. Funkcija:{{function}}Testai:{{existing_tests}}

Bandymo duomenų / netikrų objektų generavimas:

Generuokite tikroviškus {{function/service}} testų duomenis: galiojantys pavyzdžiai, kraštinių pavyzdžiai ir netinkami pavyzdžiai atskirai. Pasiūlykite paprastą išorinės priklausomybės {{X}} netikrą elgesį. Naudojant tikrus konfidencialius duomenis / AII; Generuokite netikrus duomenis.

Silpnas raginimas / Stiprus raginimas

Silpnas: „Parašykite šios funkcijos testą“.
Stiprus: "su pytest. Funkcija apply_discount(visa, procentai) — taisyklė: nuolaida turi būti 0%–30%, už ribų turėtų išmesti ValueError, rezultatas turi būti suapvalintas iki 2 po kablelio. Parašykite lūkesčius pagal šią TAISYKLĘ (ne pagal kodą). Laimingas kelias + šie kraštiniai atvejai: 0%, 30%, 31% (klaida.), neigiamas,]"=0.

Jis pateikia stiprią išleidimo taisyklę ir sako „rašyk lūkestį pagal taisyklę, o ne kodą“; Šis vienas sakinys uždaro AI ištaisymo netinkamo elgesio spąstus.

Bandymo tipas

AI indėlis

žmogaus valdymas

Laimingas kelio vieneto bandymas

greitas skeletas

Ar lūkesčiai teisingi?

Kraštiniai dėklai

Platus smegenų šturmas

Pašalinkite nereikšmingus dalykus

Apimties spragų užpildymas

Suranda praleistas šakas

Patvirtinkite reikšmingumą

Bandymo duomenys / pasimetimas

Gamina tikrovišką pavyzdį

Nėra AII, realizmo kontrolė

Testai valdo kokybę, o ne ją garantuoja

Didelė bandymo aprėptis suteikia pasitikėjimo, bet gali ir klaidinti: 100 procentų aprėptis reiškia, kad „kiekviena eilutė buvo paleista“, o ne „kiekviena eilutė teisinga“. Lengva padidinti aprėptį naudojant AI; Tikroji vertė yra prasmingų lūkesčių rašymas. Testo vertė yra jo gebėjimas sulaužyti ir įspėti jus, kai sugenda kodas. Štai kodėl dirbtinio intelekto sukurti testai yra pagrįsti klausimu „ar tikrai kodas sugenda pasikeitus? Išbandykite tai su klausimu; Sąmoningas linijos pertraukimas ir bandymo lūžio matymas (mutacijos idėja) yra įrodymas, kad testas pavyko.

Patarimas: norėdami sužinoti, ar AI parašytas testas veikia, sukurkite nedidelę kodo klaidą (pvz., pakeiskite + į -) ir pažiūrėkite, ar testas nutrūksta. Jei jis nesugenda, tas testas jūsų neapsaugo.

Dažnos klaidos

  • Prašymas atlikti testą nepateikus taisyklės. Modelis sustabdo esamą elgesį; ištaiso klaidą kaip „tiesa“.
  • Priimti lūkesčius jų neskaitant. Testavimas yra klaidinantis, jei netikrinate, ar tvirtinimai tikrina teisingą vertę.
  • Tik išbandžiau laimingą kelią. Tikros klaidos gyvena paraštėse; Aiškiai paprašykite kraštutinių atvejų.
  • Supainiojimas su tikslu. Didelis procentas negarantuoja teisingo elgesio.
  • Tikrų / paslėptų duomenų pavertimas bandymo duomenimis. Kliento duomenys ar paslaptys neturėtų patekti į testavimą ir saugojimą; Generuokite sintetinius duomenis.

Apibendrinant

Dirbtinis intelektas pašalina daug pasikartojančios naštos rašant testus: sukuria greitus skeletus, didelius kraštutinių atvejų sąrašus ir aprėpties spragų analizę. Tačiau svarbiausias dalykas yra lūkesčiai: dirbtinis intelektas yra linkęs išbandyti esamą kodo elgseną, o testavimas turėtų būti parašytas pagal specifikaciją. Pateikite taisyklę, patikrinkite lūkesčius, vykdykite kraštutinius atvejus ir patikrinkite, ar testai iš tikrųjų apsaugo, įvesdami klaidą. Bandymo aprėptis yra priemonė, o ne tikslas.

Taikymo užduotis

Pasirinkite funkciją ir pirmiausia išspausdinkite AI testą, tiesiog nurodydami jo kodą; Atkreipkite dėmesį į lūkesčius. Tada dar kartą išspausdinkite testą, nurodydami tos pačios funkcijos specifikaciją (būtiną elgesį). Palyginkite dviejų bandymų rinkinių lūkesčius: ar yra kokių nors skirtumų, kuris iš jų atskleidžia tikrą klaidą? Galiausiai patikrinkite, ar vienas iš sugeneruotų testų veikė, į kodą įtraukdami tyčinę klaidą ir pamatę bandymo pertrauką.

kontrolinis sąrašas

  • [ ] Atskiriu, ar bandymas skirtas elgsenai pataisyti, ar patikrinti.
  • [ ] Kai prašau atlikti testą, pateikiu taisyklę (specifikaciją), kuri turėtų būti, o ne kodą.
  • [ ] Kiekvieną sugeneruotą teiginį lyginu su specifikacija.
  • [ ] Aš aiškiai prašau krašto ir gedimų atvejų.
  • [ ] Procentinę aprėptį vertinu kaip įrankį, o ne į tikslą.
  • [ ] Bandau, ar testas iš tikrųjų apsaugo įterpdamas klaidas.