Siirry pääsisältöön

Miten delta vianetsintä muuttaa rikkinäisen tallennuksen minimaaliseksi regressiotapaukseksi

Alkuperäinen Persistium counterexample reduction diagrammi, jossa näkyy suuri rikkoutunut tila, joka on kavennettu pieneksi toistettavissa olevaksi regressiolaitteistoksi.

Käytännön menetelmä, jolla voidaan kutistaa toistettavissa oleva rikkinäinen save- tai toimintajakso pieneksi, uudelleen arvioitavaksi regressiolaitteistoksi menettämättä rikkinäistä invarianttia.

Suuri rikkinäinen pelastus on todiste, ei selitys

Kun pelastaminen ei lataudu, etsintä katoaa tai migraatio rikkoo pelin sääntöä, ensimmäinen esine voi olla valtava: satoja kenttiä, pesiytyneet kokoelmia, pitkä toimintahistoria, sisältökuva ja ympäristö, joka ei enää ole olemassa. Tämä esine on arvokas, koska se toistaa ongelman. Se on vaikeaa, koska se antaa kehittäjälle paljon enemmän tietoa kuin he voivat selittää kerralla. Lukeminen rivi riviltä tuottaa usein arvauksia eikä selitys.

Delta debugging muuttaa tavoitetta. Sen sijaan, että pyydetään henkilöä havaitsemaan yksi relevantti arvo, kysy deterministinen predicate onko ehdokas vielä osoittaa epäonnistumisen. Sitten poistaa tai yksinkertaistaa osia valtion kun predicate pysyy totta. Lopullinen tulos on minimaalinen regressio tapaus: tarpeeksi pieni tarkistaa, vakaa tarpeeksi uudelleen pelata, ja selkeä invariantti, joka jää rikki.

Minimaalinen ei tarkoita visuaalisesti pieni tai universaalisti pienin. Hyödyllinen tavoite on aineellisesti pienempi counterexample alle rajoitettu kustannus. Vähentäjä voi pysähtyä, kun ei koko ryhmää voidaan poistaa, kun toteutusbudjetti on käytetty, tai kun laite on ymmärrettävä tarpeeksi tulla regressiotesti. Säilynyt omaisuus on enemmän kuin abstrakti optimaalinen.

Varmista uusittavuus ennen vähentämistä

Vähentäminen toimii vain, kun vika on toistettavissa. Ensin kaapata tarkka predikaatti: ei nykyinen kuormaaja heittää luokiteltu virhe, ei invariant palata väärä, ei tuloksena valtion eroaa semanttisesti odotetun tuloksen, tai ei toiminta sekvenssi tuottaa virheellinen apuraha? Vältä käyttämällä epämääräinen predikaatin kuten ...peli näyttää väärältä... predikaatin on palautettava sama vastaus samoihin syötteisiin, tai vähentäjä jahtaa melua.

Tallenna ympäristö rinnalle ehdokas: sovelluksen rakentaa tai tehdä, migraatioversio, adapterin versio, sisältö ja konfiguraatio kuvakaappaus, deterministinen siemen, alusta oletukset, ja aloitusteline hash. Jos elävä kello, satunnaislähde, etäkokoonpano noutaa, tai taustatyöntekijä voi muuttaa tuloksen, korvata sen deterministinen testiraja tai kirjaa se nimenomaisena rajoituksena. Vähentäjä ei saa salaa testata uutta ympäristöä joka yritys.

Jos toiminta-sekvenssi epäonnistuu, säilyttää alkuperäisen tilan ja tilatut toimet erikseen. Lopullinen tila voi piilottaa operaation, joka tuotti sen. Sekvenssi laite voi ilmaista tästä profiilista, suorittaa nämä seitsemän pyyntöä, sitten invariant epäonnistuu... Että erottaminen mahdollistaa vähennyslaitteen kutistaa kenttiä, kokoelmia ja toimia sekoittamatta yhdenlaisia todisteita toiselle.

Vähentää kenttiä ja kokoelmia osioissa

Aloita karkea osioita. Jaa ylätason tallenna kenttäryhmiin, poista yksi ryhmä työkopiosta ja suorita predikaatti. Jos vika jatkuu, pidä poisto; jos se katoaa, palauttaa ryhmän ja jakaa se. Tämä on tehokkaampaa kuin poistaa yksi kenttä kerrallaan suuresta objektista. Jatka pesittyihin tietueisiin ja kokoelmiin, kun asianomainen alue on tunnistettu.

Kokoelmat tarvitsevat erityistä huolellisuutta. Inventaarion kohteet, etsinnät, laskurit ja tapahtumahistoria voivat viitata toisiinsa. Yhden merkinnän poistaminen voi muuttaa luetteloindeksiä, kapasiteettisääntöjä tai kokonaissaldoja. Normalisoi tilaus, jossa järjestys ei ole mielekäs, säilyttää vakaat tunnisteet, joissa viittaukset niitä edellyttävät, ja ilmoittaa, pitäisikö puuttuvan kohteen olla poissa, nolla tai edustaa nimenomaisen perinnön varaosia. Vähentäjän ei pitäisi muuttaa todellista siirtymävirhettä virheeksi, joka johtuu epämuodostuneesta testisyötteestä.

Käytä arvoa kutistuminen jälkeen rakenteellinen vähennys. Siirrä kokonaislukuja kohti nollaa tai tärkeä raja, lyhentää jouset, korvata pitkä tunniste turvallisella testitunniste, ja vähentää aikaleimat vakaa aika vain, kun niiden tarkka arvo ei ole edellytys testattu. Jokainen yksinkertaistaminen on pidettävä predikaatti totta. Tämä usein paljastaa, että näennäinen monimutkainen profiili vika on todella

Alkuperäinen kutistumistilan visuaalinen näyttö rikkinäisestä tallennetusta osiosta, yksinkertaistetusta, toistosta ja säilytyksestä pienimpänä regressiolaitteena.
Vähennetään valvottua poistoa ja determinististä uusintaa, kunnes merkittävä epäonnistuminen jää pienemmäksi.

Vähennä toimintajaksoja muuttamatta niiden merkitystä

Jotkut viat ilmaantuvat vasta ajan jälkeen: osto yrittää uudelleen jälkeen reconnect, tallenna jälkeen asetuspäivityksen, tai siirtyminen jälkeen keskeytynyt opetusohjelma. Käytä samaa osioiminen idea toimiin. Poista vierekkäinen puolet sekvenssi, toisto, ja pitää poiston jos invariant vielä epäonnistuu. Sitten jakaa. Säilytä vaaditut asetukset toimia, mutta haasta satunnaisia navigointi, toistuvat lukemat, ja etuyhteydettömiä mutaatioita.

Toimilla pitäisi olla vakaat parametrit ja tulos-odotukset. Vähentäjä, joka korvaa jokaisen pyynnön tuoreella satunnaisella tapahtumatunnisteella, ei enää testaa alkuperäistä semantiikkaa. Alkuperäisen ominaisuus-lippukuorman poistava reduktori voi muuttaa kontekstia. Tallenna toimintotunniste, asiaankuuluvat syötteet, luotettu ja luotettava lähde. Tämä tekee lopullisen sekvenssin hyödylliseksi sekä kehittäjille että QA:lle.

Kun sekvenssi riippuu concurrency, valitse deterministinen aikataulu. Tallenna järjestys, jossa työntekijät tai simuloidut asiakkaat saavuttavat kriittiset rajat. Jos vika tapahtuu vain rodun, testi voi tarvita hallittu este sijaan ajoituksesta riippuvainen unipuhelut. Tavoitteena ei ole teeskennellä concurrency on yksinkertainen; se on tehdä havaittu interleaving toistettavissa tarpeeksi järkeä.

Säilytä loukkaava invariantti lopullisessa esineessä

Pieni laite ilman väitettä tulee toinen salaperäinen tiedosto. Tallenna rikottu invariant vieressä laitteen selkeällä tavalla: kaksinkertainen oikeus yhden tapahtuman identiteetti, tuntematon luetteloviittaus siirtymisen jälkeen, negatiivinen valuutta, saavuttamaton loppuun etsintä, tai semanttinen yhteensopimattomuus jälkeen pyöreän matkan. Sisällytä odotettu luokitus ja havaittu. Laite pitäisi epäonnistua syystä, ei vain siksi, että funktio palaa väärä.

Vertaa ennen ja jälkeen tilan semanttisesti. Raaka diff voi sisältää uudelleenkirjoitettuja aikaleimat, uudelleenjärjestetyt järjestelmät, luodut ID:t tai sarjan muotoilu. Semanttinen diff korostaa arvoja, jotka vaikuttavat invariant. Se voi ilmoittaa, että kohde on muuttunut voimassa olevasta perintövarauksesta tuntemattomaksi ID:ksi tai että saldoa korotettiin kahdesti samalle tilikirjaavaimelle. Pidä normalisoija kapea ja dokumentoitu; laaja normalisoija voi poistaa hyvin vian, jonka vähennyslaitteen on tarkoitus säilyttää.

Kirjoita replay manifesti kanssa kiinnityspolku, lähde hash, alennettu hash, ympäristö sormenjälki, deterministinen siemen, toimintajärjestys jos jokin, predicate nimi, ja odotettavissa tulos. Tämä manifesti antaa toisen henkilön suorittaa tapauksen uudelleen ilman pääsyä alkuperäisen ylimitoitettu tila. Se myös tekee laitteen sopiva CI, jossa minimoitu tapaus olisi nopea ja selkeä eikä riippuvainen yksityisen paikallisen koneen.

Tiedä, milloin laskun pitäisi loppua.

Jokainen predikaatti ajaa kustannukset aika. Jotkut siirtymät ovat hitaita; jotkut skenaariot tarvitsevat palveluadapterit; jotkut vikaolosuhteet ovat löysiä, kunnes ympäristö on vahvistettu. Aseta budjetit yrityksille, seinän aika, ja artefaktien määrä. Pysäytä, kun laite on tarpeeksi pieni selittää ongelma, kun mitään osiota ei voida poistaa menettämättä vikaa, tai kun jäljellä työ vaatii domain harkintaa eikä mekaanista kutistumista.

Pienennyksellä on rajansa. Se ei voi päättää, pitäisikö perintökohteen kartoittaa korvaajalle, tarvitseeko eläkkeellä oleva etsintä korvausta vai onko säästetty arvo laillinen uudelleen suunnitellussa taloudessa. Nämä ovat tuotepäätöksiä. Se ei myöskään voi turvallisesti vähentää salattua tai arkaluonteista tietoa kopioimalla sitä laajaksi työkaluksi. Tällaisissa tapauksissa luoda synteettinen vastine, joka säilyttää rakenteellisen tilan, tai pitää rajoitettua tutkimusta asianmukaisen käyttörajan sisällä.

Älä julkaise raakasoittimen tilaa regressiolaitteena. Riisu nimiä, yhteystietoja, vastaanottotietoja, laitetunnisteita, käyttötunnuksia ja mitään kenttää, jota predikaattiin ei tarvita. Minimaalinen laite on mahdollisuus parantaa yksityisyyttä sekä diagnosoitavuutta. Lopullisen esineen pitäisi olla turvallinen sisällyttää projektiin.

Käytännön tarkistuslista

  • Määrittele deterministinen vika predikoidaan ennen minkään tilan poistamista.
  • Tallenna sovellus-, adapteri-, sisältö-, konfiguraatio-, siemen- ja kiinnitysympäristö.
  • Pidä alkutila ja toimintajakso erillään, kun käyttäytyminen kehittyy ajan myötä.
  • Vähentää ylätason ryhmiä ensin, sitten pesi kentät, kokoelmat, ja arvot.
  • Säilytetään viittaukset ja rakenteellinen pätevyys samalla kun kyseenalaistetaan semanttinen merkitys.
  • Käytä ohjattua concurrency aikataulua eikä ajoituksesta riippuvia retries.
  • Tallenna rikki invariant, odotettu luokittelu, semanttinen diff, ja replay ilmentyy tuloksen.
  • Pysähdy hyödyllisessä rajoitetussa vastaesimerkissä; älä optimoi loputtomiin teoreettisen minimaalisuuden vuoksi.
  • Punainen tai syntetisoi herkät tiedot ennen kuin laite menee rutiinitesteihin.

Usein kysytyt kysymykset

Onko delta vianetsintä vain kaatumisia varten?

Ei. Predikaatti voi olla kaatua, mutta se voi olla myös rikkonut peli invariant, väärä oikeus laskea, epäonnistunut save-load kierros, hylätty migraatio luokittelu, tai yhteensopimattomuus odotetun ja havaittu tila. Se on hyödyllisin aina monimutkainen panos luotettavasti tuottaa tuloksen, joka ei pitäisi tapahtua.

Entä jos vika on ajoittainen?

Ensin vähentää nondeterminism. Korjaa siemeniä, kaapata kokoonpano, eristää aikaa ja verkon rajat, ja ohjaus concurrency. Jos tulos on edelleen probabilistinen, käytä kynnys-pohjainen predicate vain huolellisesti ja kirjaa, että rajoitus. Vakaa pienempi skenaario on yleensä arvokkaampi kuin suuri flaky asetelma.

Voiko vähennyslaite olla ristiriidassa tuotantotietojen kanssa?

Rutiinia ei pidä vähentää. Käytä synteettisiä tai regeneroituja kalusteita ja hallittua ympäristöä. Rajoitettu tapaustutkimus voi tarvita suojattua näyttöä, mutta se on erillinen operatiivinen prosessi, jossa on kulunvalvonta, säilytyssäännöt ja tarkistus. Älä tee regressio sviitistä kopiota pelaajan tiedoista.

Mitä Persistium väittää tässä?

Persistium on kehitteillä paikallis-ensimmäisenä luotettavuustuoteperheenä. Tämä huomautus esittää yleisesti ottaen hyödyllisen työnkulun vähentämisen eikä väitä, että julkinen tuote diagnosoi automaattisesti mielivaltaiset säästöt, on havainnut asiakkaiden toimintahäiriöitä tai käyttää isännöityä analyysipalvelua.

Aiheeseen liittyvä järjestelmäTutki Persistium:ää