Šis straipsnis yra veidrodinis mašininio vertimo straipsnis, spauskite čia norėdami pereiti prie originalaus straipsnio.

Rodinys: 13725|Atsakyti: 1

[C++] Sparnai - Leiskite išmaniai ir automatiškai generuoti vienetų testus

[Kopijuoti nuorodą]
Paskelbta 2018-08-06 14:30:37 | | | |
Sparnai-Padarykite vienetų testus išmanius ir visiškai automatizuotusĮvadas
Vienetų testavimas yra labai veiksminga priemonė programinės įrangos kokybei užtikrinti, nesvarbu, ar tai būtų ankstyvosios intervencijos į testavimą koncepcijos požiūriu, ar vienetų testų, kuriuos galima patikrinti dideliu greičiu, nedarant įtakos vartotojo sąsajai, charakteristikų, todėl pramonės propaguojama bandymais pagrįsta plėtra, čia paminėtas bandytojas labiau susijęs su vieneto testuotoju. Tačiau bendroji kūrėjų komanda vis dar retai sistemingai atlieka vienetų testus, o taikomosios programinės įrangos testavimą labiau atlieka profesionalios testavimo komandos, kad atliktų juodosios dėžės testus. Didžiausias vieneto testavimo sunkumas yra ne tai, kad įvesties ir išvesties negalima nustatyti, juk tai jau nustatoma modulio kūrimo etape, o tai, kad vienetų testavimo atvejų rašymas sunaudos daug kūrėjo darbo valandų, o pagal atitinkamą statistiką vienetų testavimo atvejų laikas netgi gerokai viršys pačios funkcijos kūrimo laiką. Štai keletas dažniausiai pasitaikančių priežasčių, kodėl plėtra nerašo vienetų testų:
● Reikalavimai visada yra begaliniai, o kitame etape vis dar yra funkcinių reikalavimų, kuriuos reikia įgyvendinti, ir nėra laiko užpildyti įrenginio
● Yra per daug vienetų testų, kuriuos reikia papildyti, ir nėra galimybės pradėti, todėl aš subjektyviai priešinuosi.
● Vienetų testus sunku parašyti. Viena vertus, priežastis gali būti ta, kad funkcinės funkcijos įgyvendinimas nėra pakankamai pagrįstas, kita vertus, nėra (arba nežinomų) naudingų vienetų testavimo sistemų ir imitacinių sistemų.
● Vieneto bandymai neįskaičiuojami į darbo krūvį.
Antra, funkciniai reikalavimai vis dar nestabilūs, o vieneto testų rašymo sąnaudos nėra didelės. Kitaip tariant, jei rytoj pasikeis reikalavimai, bus panaikintas ne tik funkcinis kodas, bet ir vienetų testai. Jei nerašysite vieneto testų, ši pastangų dalis nebus veltui.
Tiesą sakant, pagrindinė aukščiau išvardytų punktų priežastis yra ta, kad vieneto testo rašymas užima per daug laiko, o tai ilgainiui praranda bandomojo variklio galią, todėl graži bandomojo vystymosi vizija sustoja realiame scenarijuje, nes sukurti variklį šiai pavarai yra per sunku ir brangu. Įvairūs rinkoje esantys "x" įrenginiai ir vienetų testavimo sistemos išsprendžia tik testais pagrįstų išorinių rėmų generavimo problemą, be jokios naudojimo atvejų logikos ir duomenų generavimo galimybių, pagrįstų giliu programos supratimu. Todėl kūrėjai tampa atsparūs įvairiems su plėtra susijusiems scenarijams. "Wings" išleidimas (šiuo metu skirtas C) išsprendžia vieną didžiausių programuotojų problemų ir gali iš esmės pakeisti vienetų testavimo status quo, o tai veiksmingai sumažins sistemos lygio juodosios dėžės testavimo ir automatizuoto testavimo, pagrįsto didžiuliais žmogiškaisiais ištekliais, spaudimą.
Apribojimų testavimo atvejus automatiškai generuoja programos, o svarbiausia pagrindinė technologija yra sudėtinga parametrų analizės technologija. Tai yra, jis gali savavališkai apibrėžti įdėto lygio rekursinį analizavimą kompiliatoriaus lygiu savavališkai sudėtingiems tipams. Be šio šios kritinės technologijos proveržio automatinė testavimo atvejų generavimo sistema būtų komerciškai nepajėgi arba tobulėtų, kad gautų reikalavimus atitinkančius bandymų duomenis su labai mažu efektyvumu. Pavyzdžiui, garsusis fuzzing įrankis American Fuzzy Lop negali nustatyti vartotojo programai reikalingos struktūros tipo ir turi tobulinti paieškos algoritmą pagal išorinį sluoksnį. Programos ypatybės yra tokios, kad įvestis sąsajos lygiu ir vidinio modulio duomenų reikalavimai yra toli, o išoriniai duomenys paprastai transformuojami sluoksnis po sudėtingos transformacijos sluoksnio, kad taptų vidiniam moduliui reikalingu duomenų struktūros tipu, todėl skaičiavimo ir laiko, reikalingo tyrinėti iš išorinio sluoksnio, kiekis ir laikas bus neįsivaizduojami. Remiantis amerikietišku "Fuzzy Lop", norint sugeneruoti teisėtą SQL pareiškimą, vidinį programos modulį reikia ištirti per dienas, toli gražu ne minutes ar valandas. Kitas apribojimas yra tas, kad įvestis, kurią gali perimti kiekviena programa, yra kruopščiai susisteminta ir sukompiliuota su daugybe taisyklių, o generuoti šiuos duomenis atsitiktiniais + žvalgomaisiais metodais yra labai nerealu ir užima daug laiko. Todėl neįmanoma generuoti automatiškai sugeneruotų naudojimo atvejų iš juodosios dėžės ir tolimiausios įvesties.
Jei naudojimo atvejis pagrįstas programinės įrangos vidinės struktūros analize, būtina gerai suprasti programinės įrangos kompiliavimo struktūrą. Perspektyvi testavimo atvejų generavimo sistema turėtų būti pagrįsta programos viduriu (pagrindiniu įėjimo tašku) kaip tinkamiausiu testavimo įėjimo tašku. Šių modulių įėjimai neryškius įėjimus pavertė labai struktūrizuotais parametrais. Kol galima nustatyti šias sudėtingas struktūras, sudėtingus duomenų tipus žingsnis po žingsnio galima suskirstyti į paprastus duomenų tipus, o parametrų konstravimą galima užbaigti tuo pačiu metu, automatiškai užbaigti vairavimo naudojimo atvejų generavimą.
Modulių testavimas, kurį galima priskirti tradiciniam vienetų testavimui, yra geriausias būdas rasti ir suvaldyti defektus MTEP etape. Tačiau dėl vienetų testavimo apribojimų reikia sukurti daug tvarkyklių, o reklama ir taikymas pramonėje yra labai ribotas. Žinoma, vienetų testai taip pat gali būti atliekami integravus sistemą, kad būtų išvengta virtualių stub programų kūrimo.
Prieš kelias dienas pirmą kartą pasaulyje pristatytas "Nebulas Testing" produktas "Wings" yra išmanioji ir visiškai automatizuota vienetų testavimo atvejų generavimo sistema, kuri ištyrė ir išsprendė šiuos sunkumus ir dabar dalijamasi su jumis.
(1) Išsami programos parametrų analizė
"Wings" naudoja pagrindinę kompiliatoriaus technologiją, kad suformuotų modulio objektus pagal įvesties šaltinio failą pagal funkciją. Objekte yra funkcijos įvesties parametrai, grąžinamos vertės tipas ir kita informacija, kurią gali naudoti tvarkyklės funkcijos modulis ir bandymo atvejo modulis. Kiekvienas failas yra vienetas, kuris atlieka išsamią kiekvienos funkcijos parametro analizę ir gali tiksliai analizuoti ir skaidyti įdėtus tipus, sudėtingus tipus ir kt., paaiškinti sudėtingus tipus sluoksnis po sluoksnio kaip pagrindinius duomenų tipus ir generuoti parametrų struktūros aprašymo failą (PSD).
(2) Funkcija vairuoti automatinį modulių generavimą
Pagal PSD failo formato informaciją, visos bandomos šaltinio programos tvarkyklės funkcijos sugeneruojamos automatiškai, o vieneto testavimo procesas nebepriklauso nuo kūrėjų, kurie rankiniu būdu rašo testavimo funkcijas, o tereikia kartu sukompiliuoti sugeneruotas tvarkyklės funkcijas ir bandomus šaltinio failus, o bandymo rezultatus galima vykdyti ir peržiūrėti bandymo rezultatus. Bandomoji tvarkyklė automatiškai sugeneruoja programą pagal PSD aprašymą, visiškai automatiškai sukuria visus parametrus ir reikalingus globalius kintamuosius, kurie valdo bandomąjį testą, ir gali sugeneruoti struktūrizuotą testavimo tvarkyklę pagal sudėtingų kintamųjų hierarchiją, o tai gali sutaupyti daug laiko rašant vieneto testavimo atvejus.
3) Automatinis bandymų duomenų generavimas ir tvarkymas
Jis naudojamas automatiškai generuoti bandomuosius duomenis, kurie atitinka bandymo funkcijos išgautą informaciją, o duomenys saugomi JSON faile su tam tikru hierarchiniu loginiu ryšiu. Duomenys ir duomenų tipas po skaidymo ir išsiplėtimo atitinka vienas kitą. Vartotojai gali savavališkai marginalizuoti šiuos duomenis pagal verslo reikalavimus ir naudoti JSON failus, kad juos rodytų struktūrizuotai ir hierarchiškai, o tai yra labai aišku. Bandymo duomenys apima visuotinių kintamųjų reikšmes ir parametrų reikšmes, kai iškviečiama bandomoji funkcija.
"Wings" pateikia vieneto testavimo metodą, skirtą automatiškai generuoti vairuotojo funkcijas, kuris daugiausia apima šiuos veiksmus:
1 pav.: Vieneto bandymais pagrįstas kūrimo srautas
1   Bandomos programos informacijos išgavimas
Bandomos programos struktūros informacija daugiausia apima visuotinius kintamuosius ir funkcijos informaciją programoje, o funkcijos informacija daugiausia apima funkcijos parametrų skaičių, parametrų tipus ir grąžinamų reikšmių tipus. Svarbiausia yra išgauti simbolių informaciją ir tipo informaciją kai kuriems sudėtingiems tipams ir analizuoti juos į pagrindinius duomenų tipus sluoksnis po sluoksnio, kad būtų užbaigta globalių kintamųjų ir funkcijų parametrų konstrukcija.
Kintamųjų tipai paprastai skirstomi į pagrindinius tipus, konstrukcijos tipus, rodyklių tipus ir nulinius tipus. "Wings" naudoja pagrindinę kompiliavimo technologiją, kad skirtingais būdais apdorotų skirtingus kintamųjų tipus.
(1) Pagrindiniai tipai, pvz., unsigned int u_int=20, Wings išanalizuos kintamojo pavadinimą į u_int ir duomenų tipą į unsigned int.
(2) Konstrukcijų tipai, konstrukcijų tipai apytiksliai skirstomi į masyvus, struktūras, bendrąsias ir išvardijimo tipus.
● Masyvo tipas, pvz., intarray[2][3], masyvo pavadinimas yra masyvas, tipas int ir 2D masyvo ilgis, elgesys 2, 3 stulpelis.
● Struktūros tipas, struktūroms kaip masyvai, struktūriniai susieti sąrašai ir kt., skirstomi skirtingi žymekliai.
(3) Rodyklės tipas, pvz., int **ptr = 0; , analizuoja žymeklį kaip int tipo 2 lygio rodyklę.
(4) Null tipas, kuris yra nuspręsta būti NULL.
(5) Sistemų tipai, tokie kaip failas, size_t ir kt., yra pažymėti kaip sistemos tipai, jie bus įtraukti į šabloną ir priskirti vartotojo.
(6) Funkcijos rodyklės tipas, išanalizuokite grąžinamos vertės tipą, parametro tipą ir funkcijos parametrų skaičių
Kiekvienam bandomos šaltinio programos kompiliavimo vienetui analizuojama funkcijos informacija saugoma atitinkamoje PSD struktūroje ir aprašomi šie šaltinio kodo pavyzdžiai:
   

Aukščiau pateiktoje programoje anuliuokite StructTypeTest3(myy_struct mm_struct[2])Išsaugota PSD struktūra yra tokia:

Kiekvieno PSD failo mazgo reikšmės yra šios:
●StructTypeTest3 reiškia funkcijos pavadinimą, parmType0 – parametro tipą, o parmNum – parametrų skaičių
●mm_struct reiškia funkcijos parametro simbolį, baseType1 reiškia tipų klasifikaciją (pagrindinis duomenų tipas, konstrukcijos tipas, rodyklės tipas, nulinis tipas), tipas reiškia konkrečius tipus, įskaitant int, char, short, long, double, float, bool ir šių tipų nepasirašytus tipus bei kitus pagrindinius tipus, ir yra keletas specialių tipų, tokių kaip: ZOA_FUN tipas reiškia funkcijos tipą, StructureOrClassType reiškia struktūros tipą ir t. t., o pavadinimas – struktūros, sąjungos ir išvardijimo tipo pavadinimą
●i_int reiškia bazinį tipą, kuris yra mažiausias priskyrimo vienetas
●array_one reiškia masyvo tipą, RowSize reiškia masyvo ilgį, o masyvą galima suskirstyti į vienmatius masyvus, dvimačius masyvus ir kt
●Taškas reiškia žymeklio tipą, rodyklė yra padalinta į pirmojo lygio žymeklį, antrojo lygio žymeklį ir kt., o bendrasis žymeklis naudojamas kaip funkcijos parametras kaip masyvas, todėl pagrindiniam rodyklės tipui reikšmėms priskirti naudojamas dinaminio paskirstymo masyvo metodas, o vartotojas gali modifikuoti atitinkamą reikšmių failą pagal poreikius.
● W reiškia bitų lauko tipą, o bitfileld – skaitmenų skaičių
●functionPtr nurodo funkcijos rodyklės tipą, kuris atitinkamai analizuoja parametro tipą, parametrų skaičių ir grąžinamos vertės informaciją
● Dem reiškia konsorciumo tipą
● DY reiškia išvardijimo tipą, o reikšmė – išvardijimo tipo reikšmę
● failas reiškia struktūros tipą, SystemVar reiškia šį kintamąjį priklauso kintamajam sistemos antraštės faile, šio tipo kintamajam Wings prideda šablono kintamuosius į šablonų biblioteką, vartotojai gali priskirti specialias reikšmes pagal konkrečius poreikius. Pavyzdžiui, failo tipas tvarkomas taip:

Vartotojai taip pat gali pridėti savo priskyrimo metodus. Sistemų tipams "Wings" galima atskirti nuo įprastų vartotojo nustatytų tipų, o analizuojant į integruotą sistemos tipą, jis gali sustabdyti rekursinę analizę žemyn.
●g_int reiškia visuotinius kintamuosius, o globalus – globalius kintamuosius
●Next nurodo susieto sąrašo struktūrą, o NodeType nurodo šią struktūrą kaip susietą sąrašą
●returnType nurodo funkcijos grąžinamos reikšmės tipą.
2   Automatinis tvarkyklių generavimas
Aukščiau pateiktame straipsnyje analizuojama ir išgaunama globalių kintamųjų ir funkcijų struktūrinė informacija, o ši informacija naudojama išsaugoti PSD, kad būtų užbaigtas bendras bandomos šaltinio programos vairavimo sistemos generavimas.
Generacija daugiausia skirstoma į šiuos aspektus:
Ø Visuotinių kintamųjų deklaravimas
Ø Funkcijos parametrų priskyrimo operacija, pagal funkcijos parametrų skaičių, paeiliui priskirkite reikšmes
Ø Visuotinių kintamųjų priskyrimas atliekamas nuosekliai pagal analizei naudojamų globalių kintamųjų skaičių
Ø Pradinės funkcijos iškvietimas
Kai kurie dalykai, į kuriuos reikia atkreipti dėmesį, yra šie:
● Tvarkyklės generavimo proceso metu kai kurios specialios funkcijos, pvz., pagrindinės funkcijos, statinės funkcijos ir kt., nėra laikinai apdorojamos, nes išorinis pasaulis jų negali pasiekti.
● Kiekvienam bandomam šaltinio failui sugeneruojamas atitinkamas tvarkyklės failas.
● Pavaros valdymas yra įtrauktas į Driver_main.cpp, kad būtų galima automatiškai konfigūruoti funkcijos testų skaičių naudojant makrokomandas
Aukščiau pateiktos šaltinio programos sugeneruota tvarkyklės funkcija yra tokia:
● Visi kintamieji pavadinti prieš pradinio kintamojo pavadinimą, pridėkite _
●Gavus atitinkamus bandymo duomenis, kintamieji priskiriami paeiliui
● Integruotiems sistemos parametrams ir specialiesiems vartotojo parametrams priskyrimo metodas yra vienodai sukonfigūruotas naudojant šablono metodą.
● Priskirkite ir iškvieskite parametrus bandomajai funkcijai.
3   Testo duomenys generuojami automatiškai
Toliau pateikiamas duomenų rinkinys, sugeneruotas PSD formatu 3 paveiksle, kiekvienas duomenų rinkinys išsaugomas JSON formatu, todėl lengviau pamatyti hierarchinį duomenų ryšį.

Kiekvienam kompiliavimo vienetui pagal numatytuosius nustatymus sugeneruojamas visas funkcijas atitinkančių bandomųjų duomenų failų rinkinys, o vertės generavimą galima keisti pagal konfigūracijų skaičių.
4 MySQLRodomi programos testo rezultatai
Kaip užbaigti tvarkyklės sistemos generavimą, toliau pateikiamas išsamus viso atvirojo kodo programos "MySQL" generavimo proceso paaiškinimas.
Toliau pateikiama pagrindinė "Wings" testavimo "Mysql" sąsajos schema:
Spustelėkite mygtuką Failas, kad nustatytumėte bandomos šaltinio programos projekto katalogą. Baigę nustatymus, spustelėkite funkcijos operaciją, kuri daugiausia apima parametrų analizę, tvarkyklės generavimą, vertės failo generavimą ir šablono pridėjimą. Analizei sugeneruojami šie aplankai:
Tarp jų parametrų analizės modulis generuoja "FunXml" ir "GlobalXml", kurie saugo atitinkamai kiekvieno ištraukto kompiliavimo įrenginio funkcijos informaciją ir visuotinę kintamąją informaciją.
Tvarkyklės generavimo modulis bus sugeneruotas Wings_Projects atitinkamą aplanką, kuriame saugomi kiekvieno kompiliavimo įrenginio tvarkyklės failai
Vertės generavimo modulis saugo sugeneruotus kiekvieno kompiliavimo vieneto testavimo duomenis.
Šiame paveikslėlyje parodyta "Mysql" įkelta tvarkyklės failo struktūros informacija, o kairėje esantis naršymo medis yra sugeneruotas tvarkyklės failas, kuriame yra kiekvieno kompiliavimo įrenginio funkcijos, taip pat funkcijų parametrai ir visuotiniai kintamieji. Spustelėkite vieną iš kompiliavimo vienetų, kad įkeltumėte atitinkamą tvarkyklės failą ir atitinkamą vertės failą.
Aukščiau pateiktas tvarkyklės failas ir reikšmių failas, atitinkantis bendrą "Mysql" kartą, o tvarkyklės failas išsamiai aprašytas šiame kode.
● Kiekvienam kompiliavimo vienetui visuotinio kintamojo nuoroda yra išorinė.
● Tvarkyklės funkcija vienodai įvardijama kaip Driver_XXX metodas, JSON naudojamas kaip bandymo duomenų gavimo būdas, o laikas rodo vienos funkcijos bandymų skaičių.
●Kiekvienai parametrų priskyrimo operacijai išanalizuotas PSD saugojimo formatas naudojamas kiekvienai sluoksnio struktūrai paeiliui priskirti reikšmes.
"Wings" taikymas yra labai paprastas, toliau pateikiamas statistinis sugeneruotų bandymo duomenų indeksas naudojant "Mysql" kodą, kurį galima paprastai sudaryti "Visual Studio 2015" kaip pavyzdį, visam generavimo procesui nereikia jokio rankinio įsikišimo, tereikia suformuluoti šaltinio kodo kelią, kurį reikia sugeneruoti ir valdyti.
mysqlBandymo duomenys
  
MySQLversija
  
5.5
CKalbos kodų failų skaičius
578asmenims
Analizės laikas (PSDGeneravimo laikas)
149.099 sek.
Laikas, kurio reikia generacijai skatinti
27.461 sek.
Vertė sukuriama pagal laiką, kurio reikia jai sukurti
84.974 sek.
Kompiuterio konfigūravimo instrukcijos:
  
Operacinė sistema
  
langai7
procesorius
Inter(R) Core(TM) i7-7700cpu 3.60GHz
Atmintis
8.00GB
Sistemos tipas
64bitas
Žemiau pateikiami rezultatai, gauti naudojant šaltinio kodo statistikos įrankį, su daugiau nei 4 milijonais galiojančio vieneto bandymo kodo eilučių, kurias "Wings" sugeneravo visiškai automatiškai. Dar įdomiau yra tai, kad galima pastebėti, kad rankinio šių kodų kūrimo kaina siekia net 1 079 žmogaus mėnesius, o kaina – net 10,79 mln.
"Wings" įgyvendino pirmąjį programos tyrinėjimo žingsnį, kad automatiškai sugeneruotų programą, pirmoji versija šiuo metu yra išleista, susidomėję kūrėjai gali ją atsisiųsti tiesiai į kodo debesies platformą (https://gitee.com/teststars/wings_release), komercinė licencija suteikia vieno mėnesio neribotą funkcijų patirties laikotarpį, galite greitai patirti stebuklingą "Wings" galią, "Wings" c kalbos versija palaiko kelias platformas, tokias kaip "Visual Studio", vxworks, gcc, qt ir kt. "Wings" sukūrė ir sukūrė "Nebulas" testavimo (www.teststar.cc) komanda, o susidomėję kūrėjai gali susisiekti su "Nebulas" testavimo komanda per interaktyvią "Codecloud" platformą ir pateikti savo dizaino idėjas bei atsiliepimus apie produkto naudojimą (už priimtus puikius pasiūlymus "Nebulas" gali pratęsti nemokamo naudojimo laikotarpį mažiausiai trims mėnesiams). "Wings" turi stiprų, pagrindinį geną, kuris labai pagerina programinės įrangos kokybę, o ateityje "Wings" labai optimizuos automatiškai parašytų programų skaitomumą (arčiau gerų programuotojų rašymo lygio) ir palaikys C++ kalbą.





Ankstesnis:Ethereum išmaniųjų sutarčių kūrimas per Nethereum ir .NET
Kitą:"Tencent Cloud Drive" gedimas, dėl kurio vartotojai "visiškai praranda duomenis"
Paskelbta 2018-08-06 15:39:42 |
Atsakomybės apribojimas:
Visa programinė įranga, programavimo medžiaga ar straipsniai, kuriuos skelbia Code Farmer Network, yra skirti tik mokymosi ir mokslinių tyrimų tikslams; Aukščiau nurodytas turinys negali būti naudojamas komerciniais ar neteisėtais tikslais, priešingu atveju vartotojai prisiima visas pasekmes. Šioje svetainėje pateikiama informacija gaunama iš interneto, o ginčai dėl autorių teisių neturi nieko bendra su šia svetaine. Turite visiškai ištrinti aukščiau pateiktą turinį iš savo kompiuterio per 24 valandas nuo atsisiuntimo. Jei jums patinka programa, palaikykite autentišką programinę įrangą, įsigykite registraciją ir gaukite geresnes autentiškas paslaugas. Jei yra kokių nors pažeidimų, susisiekite su mumis el. paštu.

Mail To:help@itsvse.com