Dobički:
- Razumeti namen regresijskega testiranja in znati izbrati teste ter izdelati regresijske primere glede na spremembe z umetno inteligenco
- Sposobnost diagnosticiranja temeljnih vzrokov za krhke teste (časovni razpored, odvisnost od naročila, skupno stanje, zunanja odvisnost) in uporaba trajnih rešitev brez zatiranja simptoma
- Sposobnost ohranjanja discipline izvajanja predizdaje celotnega paketa, hkrati pa ohraniti regresijsko zbirko hitro, neodvisno in zanesljivo z odpravo podvojenega testiranja
Programska oprema se nenehno spreminja; Vsaka nova funkcija, vsak popravek lahko pokvari nekaj, kar je prej delovalo. Naknadna motnja prej delujoče funkcije se imenuje regresija. Regresijsko testiranje je ponovno testiranje obstoječe funkcionalnosti z vsako spremembo, da se ujamejo te poslabšanja. Sčasoma se ti testni paketi povečajo – na tisoče testov – in pojavita se dve veliki težavi: paket se upočasni in nezanesljivi testi – nezanesljivi testi, ki so včasih uspešni in včasih neuspešni v isti kodi – uničijo zaupanje ekipe v rezultate testov. Umetna inteligenca (AI) je močna pomoč pri vzdrževanju regresijske zbirke, hitri in zanesljivi. Toda osrednje opozorilo ostaja: čeprav lahko umetna inteligenca ponudi, da "prestane" občutljiv test, lahko pogosto ustvari popravek, ki prikrije resnično napako. Vaša naloga je najti temeljni vzrok nestabilnosti, ne pa potlačiti simptomov.
Glavni vzroki za krhke teste
Krhko testiranje je najbolj zahrbtna težava pri testiranju: nezanesljivo je ne glede na to, ali je uspešno ali neuspešno, zaradi česar se ekipa navadi, da se je "morda se je spet zataknilo, zaženite znova" — in ta navada bo nekega dne prezrla pravo napako kot "kosmičasto". Glavni vzroki:
- Pogoj za merjenje časa/dirke: Test preveri rezultat brez čakanja na zaključek operacije. Najpogostejši razlog.
- Odvisnost od naročila: Testi so odvisni od podatkov, ki jih pustijo drug drugemu; Pokvari se, ko se vrstni red spremeni.
- Skupni primer: Več testov uporablja iste testne podatke/uporabnika, kar je v nasprotju.
- Zunanja odvisnost: pravo omrežje, storitev tretje osebe, sistemski čas, naključna vrednost.
- Environment difference: Switches to local, stays in CI (continuous integration environment).
Pozor: če opravite občutljiv test z "nekajkratnim ponovnim poskusom", bo pogosto prikrita prava napaka sočasnosti. Ponovni poskus je diagnostično orodje, ne zdravljenje. Najprej poiščite glavni vzrok; Ponovni poskus uporabite samo kot zadnjo možnost za dokumentirano, resnično zunanjo nestabilnost.
Testno vzdrževanje: ohranjanje zdravega paketa
Regresijska soba je kot vrt; Če zanj ne poskrbimo, ga bo prevzel plevel. AI pomaga pri treh nalogah vzdrževanja:
1. Podvojeno/nepotrebno testno čiščenje. Over time a large number of cases accumulate testing the same thing. AI predlaga združevanje in združevanje podobnih testov.
2. Krhka testna diagnoza. You give the AI the test code and the instability pattern; suggests possible root causes and permanent solution.
3. Izbira testa/določanje prednosti. Zagon celotnega paketa z vsako spremembo je drag. Z analizo učinka testa (izbira samo ustreznih testov na podlagi spremenjene kode) AI priporoča, katere teste je treba najprej izvesti. Vendar pa je celoten paket pred izdajo obvezen.
Karantena: pravilno upravljanje občutljivega testiranja
Ugotovili ste, da je test krhek, vendar nimate časa, da bi takoj odpravili glavni vzrok. Kaj narediti? Obstajata dva napačna načina: popolnoma izbrisati test (to vedenje sploh ni več ohranjeno) ali ga utišati s ponovnim poskusom (prikriti pravo napako). Pravilen način je karantena (začasno ločevanje lomljivega testa od glavnega paketa in sledenje na ločenem seznamu). Preskušanje v karanteni ne preprečuje združevanja različic, vendar ostaja viden dolg in se redno obravnava. Kritična točka je naslednja: karantena je čakalnica, ne koš za smeti. Če se karantenski seznam povečuje, je to alarm, da se zdravstveno stanje ekipe slabša. Umetna inteligenca lahko občasno pregleda vaš karantenski seznam in ga združi po vzorcih vzrokov; Omogoča skupne rešitve z razkrivanjem skupnih vzrokov, kot je "vseh 6 testov je povezanih z istim uporabnikom skupnega testa".
Namig: vsakemu zapisu karantene dodajte »lastnik« in »datum zadnjega pregleda«. Zapuščena karantena postane trajno smetišče; Krhki testi tam živijo večno, ker nikogar ne zanima.
Tabela strategij regresije
Stanje
Strategija
Vloga AI
manjši popravek
Prizadeto območje + test dima
Izberite ustrezne teste
nova funkcija
Sorodni modul + integracija
Predlagajte nov primer regresije
velik refaktor
Celoten regresijski paket
Analiza vrzeli v kritju
pred izdajo
Celoten paket + raziskovanje
Ocena prioritete in trajanja
Nujni popravek v živo
Osredotočena + kritična pot
Minimalni varni testni niz
Šibek poziv/močan poziv
Slabo: "Ta test včasih ne uspe, popravite ga."
Močno: "Ta test ne uspe pri 3 od 10 zagonov, koda nespremenjena. Diagnosticirajte glavni vzrok nestabilnosti: lahko je čas/tekma, odvisnost od naročila, skupno stanje, zunanja odvisnost ali razlika v okolju. Pokažite, katera vrstica v testu kaže na vsak možen vzrok. Predlagajte trajno rešitev; NE predlagajte rešitve za zatiranje simptomov, kot je 'dodaj ponovni poskus' — če je to neizogibno, jasno napišite razlog. Test: [koda]. Sled napake: [dnevnik]."
Močan poziv; usmerja diagnozo k temeljnemu vzroku in izrecno prepoveduje zatiranje simptomov.
Štiri predloge za kopiranje
1) Krhka testna diagnoza:
Ta preskusna koda je včasih uspešna in včasih neuspešna brez sprememb. Navedite glavne vzroke kandidatov (rasa, odvisnost od vrstnega reda, skupno stanje, zunanja odvisnost, ura/naključno, razlika v okolju) in prikažite vrsto dokazov v testu za vsakega. Suggest permanent solution; zatirno rešitev, kot je ponovni poskus, označite kot zadnjo možnost in z utemeljitvijo. Preizkus: [koda] / Vzorec nestabilnosti: [kolikokrat v koliko izvedbah]
2) Proposing a regression case:
Izvedena je bila naslednja sprememba: [povzetek spremembe/PR]. Navedite TRENUTNA vedenja, ki bi jih ta sprememba prekinila, in za vsako predlagajte regresijski testni primer. Posebej poudarite področja stranskih učinkov in skupnih odvisnosti.
3) Duplicate test cleanup:
Check out the test suite below. Združevanje podvojenih ali prekrivajočih se primerov, ki testirajo isto vedenje; Predlagajte, katere naj obdržim in katere naj združim za vsako skupino. Warn if there is a risk of loss of coverage. Testi: [seznam/koda]
4) Test effect selection:
Naslednje datoteke/funkcije so bile spremenjene: [seznam]. Iz obstoječe zbirke testov izberite in utemeljite teste, ki jih moram najprej izvesti (tiste, ki so neposredno/posredno povezani s spremenjeno kodo). Opomba: opomni me, da bom še vedno izvajal celotno zbirko pred izdajo.
trije mini kovčki
Case 1 — Real mistake covered up by Retry. Ena ekipa je občasnemu preostalemu preizkusu izplačil dodala 3 ponovne poskuse; The test was always "passing" now. Z uporabo "diagnostike krhkega testa" je bilo ugotovljeno, da nestabilnost izvira iz resničnega dirkalnega stanja: pri visoki obremenitvi je bila potrditev plačila včasih dvojno obdelana. Več mesecev je Retry prikrival napako, ki bi lahko povzročila dejansko izgubo denarja v živo. Root cause fixed, retry removed.
Case 2 — Package shrank, speed increased. Regresijska zbirka 1400 testov je trajala 55 minut. S "čiščenjem podvojenih testov" se je 380 testov izkazalo za podvojene ali pokrite; združeno. Paket se je zmanjšal na 900 testov, čas se je zmanjšal na 34 minut, pokritost ni bila merljivo zmanjšana. Hitrejše povratne informacije so ekipo spodbudile k pogostejšemu testiranju.
Case 3 — Order dependency. Test bi bil lokalno vedno uspešen, v CI pa bi bil naključno neuspešen. Diagnostika umetne inteligence je pokazala, da je test odvisen od uporabnika, ki ga je ustvaril drug test, pri CI pa se je pokvaril, ker so testi potekali vzporedno/različno. Vsak test je bil narejen za določitev lastnih podatkov; Neodločnosti je konec.
Pogoste napake
- Silencing the fragile test with retry. Ponovni poskus brez iskanja vzroka; prikrivanje prave napake.
- Kultura »spet obtičala«. Rutinsko ignoriranje rdečih rezultatov; One day, skipping the real mistake.
- Paketa sploh ne obrezujem. Dovolite kopičenje podvojenih testov in upočasnitev paketa.
- Odvisnost med testi. Testi temeljijo na običajnem stanju/zaporedju; vir negotovosti.
- Testiranje samo spremenjenega dela in preskok celotnega paketa. Bližnjica pred izdajo; Skriti stranski učinki pobegniti.
- Zanašanje na zunanjo odvisnost. Testi, ki temeljijo na dejanskem omrežju/uri/naključni vrednosti; naravno nestabilna.
Če povzamem
Regresijsko testiranje ujame spremembe, ki motijo prej delujoče funkcije; Toda ko paketi rastejo, počasnost in krhko testiranje zmanjšujeta zaupanje. Glavni vzroki občutljivega testiranja so običajno časovna razporeditev, odvisnost od naročila, skupno stanje in zunanje odvisnosti. AI je močan pripomoček pri diagnosticiranju, čiščenju in izbiri testov; Toda zatiranje neodločnosti s ponovnim poskusom prikrije resnične napake. Poiščite glavni vzrok, naredite teste neodvisne in deterministične, redno obrezujte paket, zaženite celoten paket pred izdajo.
Aplikacijska naloga
Izberite test iz svojega projekta, za katerega veste, da je krhek (ali se zdi nestabilen). Izluščite glavne vzroke kandidatov in preverite dokaze v testu s predlogo »diagnoza občutljivega testa«. Ugotovite glavni vzrok in implementirajte trajno rešitev brez ponovnega poskusa. Nato izberite 10 testov iz svojega paketa in poiščite tiste, ki jih je mogoče kombinirati s »čiščenjem podvojenih testov«. Poročajte, koliko testnih nestabilnosti ste odpravili zaradi njihovega temeljnega vzroka in koliko nepotrebnih primerov ste odstranili iz zbirke.
kontrolni seznam
- [ ] Diagnosticiral sem glavni vzrok krhkega testa; I did not suppress the symptom.
- [ ] Poskusite znova kot upravičeno zadnjo možnost, ne kot zdravilo.
- [ ] Teste sem naredil neodvisne in deterministične (izolirane od zunanjih odvisnosti).
- [ ] Odstranil sem podvojene/nepotrebne teste iz regresijske zbirke.
- [ ] Odločil sem se za testiranje na podlagi spremembe, vendar sem izvedel predizdajo celotnega paketa.
- [ ] Vsako rdečo sem jemal resno, v nasprotju s kulturo "spet obstal, opravil".