|
Aripi-Fă testele unitare inteligente și complet automatizateprefață Testarea unitară este un mijloc foarte eficient de a asigura calitatea software-ului, fie din perspectiva conceptului de intervenție timpurie în testare, fie din caracteristicile testelor unitare care pot fi verificate la viteză mare fără a fi afectate de UI, astfel încât dezvoltarea orientată pe teste promovată de industrie, driverul de test menționat aici se referă mai mult la driverul de testare unitar. Totuși, echipa generală de dezvoltare execută foarte rar teste unitare sistematic, iar testarea pentru software-ul aplicației este realizată mai degrabă de echipe profesionale de testare pentru a efectua teste tip cutie neagră. Cea mai mare dificultate a testării unitare nu este că intrarea și ieșirea nu pot fi determinate, până la urmă, acestea sunt deja determinate în etapa de dezvoltare a modulului, ci că scrierea cazurilor de testare unitară va consuma multe ore de muncă ale dezvoltatorului, iar conform statisticilor relevante, timpul cazurilor de testare unitară va depăși cu mult timpul de dezvoltare al funcției în sine. Iată câteva dintre cele mai frecvente motive pentru care dezvoltarea nu scrie teste unitare: ●Cerințele sunt întotdeauna nesfârșite, mai există cerințe funcționale de îndeplinit în etapa următoare și nu există timp pentru a umple unitatea ●Sunt prea multe teste unitare de suplimentat și nu există nicio cale de început, așa că rezist subiectiv. ● Testele unitare sunt dificil de scris. Pe de o parte, motivul poate fi că implementarea funcției funcționale nu este suficient de rezonabilă, iar pe de altă parte, nu există (sau nu există necunoscute) cadre utile de testare unitară și cadre mock. ● Testele unitare nu sunt incluse în volumul de lucru. În al doilea rând, cerințele funcționale sunt încă instabile, iar costurile pentru scrierea testelor unitare nu sunt ridicate. Cu alte cuvinte, dacă cerințele se schimbă mâine, nu doar codul funcțional va fi eliminat, ci și testele unitare. Dacă nu scrii teste unitare, atunci această parte a efortului nu va fi în zadar. De fapt, cauza principală a punctelor de mai sus este că scrierea testelor unitare este prea consumatoare de timp, ceea ce duce în cele din urmă la pierderea puterii motorului pilotat de testare, determinând ca frumoasa viziune a dezvoltării pilotate de teste să fie blocată în scenariul real, deoarece este prea dificil și costisitor să construiești motorul pentru această transmisie. Diferitele unități "x" de pe piață și cadrele de testare unitară rezolvă doar problema generării cadrelor externe orientate spre test, fără nicio logică de caz de utilizare și capacități de generare a datelor bazate pe o înțelegere profundă a programului. Prin urmare, face ca dezvoltatorii să fie reticenți în diverse scenarii legate de dezvoltare. Lansarea Wings (în prezent pentru C) rezolvă una dintre cele mai mari probleme pentru programatori și are potențialul de a schimba fundamental status quo-ul testării unitare, ceea ce va reduce eficient presiunea testării cutiei negre la nivel de sistem și a testării automate bazate pe resurse umane masive. Cazurile de testare a constrângerilor sunt generate automat de programe, iar cea mai critică tehnologie de bază este tehnologia complexă de parsing a parametrilor. Adică, poate defini arbitrar parsing recursiv la nivel imbricat la nivelul compilatorului pentru tipuri arbitrar de complexe. Fără această descoperire în această tehnologie critică, sistemul automat de generare a cazurilor de testare ar fi fost fie comercial incapabil, fie ar evolua pentru a produce date de testare conforme cu o eficiență foarte scăzută. De exemplu, faimosul instrument de fuzzing American Fuzzy Lop nu poate identifica tipul de structură cerut programului utilizatorului și trebuie să evolueze algoritmul de căutare pe baza stratului cel mai exterior. Caracteristicile programului sunt că intrarea la nivelul interfeței și cerințele de date ale unui modul intern sunt departe, iar datele externe sunt de obicei transformate strat cu strat de transformare complexă pentru a deveni tipul de structură de date cerut modulului intern, astfel încât cantitatea de calcul și timpul necesar pentru a explora din stratul exterior vor fi de neimaginat. Bazat pe American Fuzzy Lop, pentru a putea genera o instrucțiune SQL legitimă, modulul intern al programului trebuie explorat în zile, departe de a fi minute sau ore. O altă constrângere este că intrările pe care fiecare program le poate prelua sunt date atent structurate și compilate, cu un număr mare de reguli, iar generarea acestor date prin metode aleatorii + exploratorii este foarte nerealistă și consumatoare de timp. Prin urmare, nu este fezabil să se genereze cazuri de utilizare generate automat din cutia neagră, precum și din intrarea cea mai exterioară. Dacă utilizarea condusă de cazuri de utilizare este generată din analiza structurii interne a software-ului, este necesar să ai o înțelegere profundă a structurii de compilare a software-ului. Un sistem viabil de generare a cazurilor de testare ar trebui să se bazeze pe mijlocul programului (punctul de intrare al cheii) ca cel mai potrivit punct de intrare al testului. Intrările acestor module au transformat intrările fuzzy în parametri foarte structurați. Atâta timp cât aceste structuri complexe pot fi identificate, tipurile complexe de date pot fi degradate în tipuri simple de date pas cu pas, iar construcția parametrilor poate fi finalizată în același timp, generarea cazurilor de utilizare la condus poate fi finalizată automat. Testarea bazată pe module, care poate fi clasificată ca testare unitară tradițională, este cea mai bună metodă de a identifica și controla defectele în faza de cercetare și dezvoltare. Totuși, din cauza limitărilor testării unitare, este nevoie de dezvoltarea unui număr mare de drivere, iar promovarea și aplicarea în industrie sunt foarte limitate. Desigur, testele unitare pot fi executate și după integrarea sistemului pentru a evita construirea programelor virtuale stub. Produsul Wings de la Nebulas Testing, lansat pentru prima dată în lume acum câteva zile, este un sistem inteligent și complet automatizat de generare a cazurilor de testare unitare, care a studiat și rezolvat următoarele dificultăți și este acum împărtășit cu voi. (1) Analiză aprofundată a parametrilor programului Wings folosește tehnologia de bază a compilatorului pentru a forma obiecte module pe baza fișierului sursă de intrare, conform funcției. Obiectul conține parametrii de intrare ai funcției, tipul valorii de retur și alte informații care pot fi folosite de modulul funcției driver și modulul de caz de test. Fiecare fișier este o unitate care efectuează analize aprofundate ale fiecărui parametru al fiecărei funcții din el și poate realiza analize și descompunere precisă pentru tipuri imbricate, tipuri complexe etc., poate explica tipurile complexe strat cu strat ca tipuri de date de bază și poate genera un fișier de descriere (PSD) al structurii parametrilor. (2) Generarea automată a modulelor prin acționarea funcției Conform informațiilor de format din fișierul PSD, toate funcțiile driverului programului sursă testat sunt generate automat, iar procesul de testare unitară nu mai depinde de dezvoltatori pentru scrierea manuală a funcțiilor de testare, ci trebuie doar să compileze împreună funcțiile driverului generate și fișierele sursă aflate sub test, iar rezultatele testului pot fi executate și cele ale testului pot fi vizualizate. Driverul de test generează automat programul pe baza descrierii PSD, construiește complet automat toți parametrii și variabilele globale necesare care conduc testul testat și poate genera un driver de test structurat conform ierarhiei variabilelor complexe, ceea ce poate economisi mult timp la scrierea cazurilor de testare unitare. (3) Generarea și gestionarea automată a datelor de testare Este folosit pentru a genera automat date de testare, care corespund informației extrase de funcția de test, iar datele sunt stocate într-un fișier JSON cu o anumită relație logică ierarhică. Datele și tipul de date după descompunere și extindere corespund unul altuia. Utilizatorii pot marginaliza arbitrar aceste date în funcție de cerințele de business și pot folosi fișiere JSON pentru a le afișa într-un mod structurat și ierarhic, ceea ce este foarte clar. Datele de test includ valorile variabilelor globale și valorile parametrilor atunci când funcția testată este apelată. Wings oferă o metodă de testare unitară pentru generarea automată a funcțiilor driver, care include în principal următorii pași: Figura 1: Flux de construcție condus de teste unitare 1 Extragerea informațiilor despre programul testatInformațiile despre structura programului testat includ în principal variabilele globale și informațiile despre funcție din program, iar informațiile despre funcție includ în principal numărul de parametri, tipurile de parametri și tipurile de valori returnate ale funcției. Cel mai important este să extragi informațiile despre simboluri și tipuri pentru unele tipuri complexe și să le analizezi în tipuri de date de bază, strat cu strat, pentru a finaliza construcția variabilelor globale și a parametrilor funcționali. Tipurile de variabile sunt în general împărțite în tipuri de bază, tipuri de construcție, tipuri de pointer și tipuri nule. Wings folosește tehnologia de compilare de bază pentru a gestiona diferite tipuri de variabile în moduri diferite. (1) Tipuri de bază, cum ar fi int nesemnat u_int=20, Wings vor analiza numele variabilei în u_int și tipul de date în int nesemnat. (2) Tipuri de construcții, tipurile de construcții sunt împărțite aproximativ în array-uri, structuri, comune și tipuri de enumerare. ● Tip de tablou, cum ar fi intarray[2][3], numele tabloului este tablou, tipul int și lungimea tabloului 2D, comportamentul 2, coloana 3. ●Tip de structură, pentru structuri ca array-uri, liste înlănțuite structuri etc., diferiți markeri sunt împărțiți. (3) Tipul pointerului, de exemplu int **ptr = 0; , analizează pointerul ca un pointer de nivel 2 de tip int. (4) Tip nul, care se rezolvă ca fiind NULL. (5) Tipurile de sistem, cum ar fi Fișier, size_t etc., sunt marcate ca tipuri de sistem și vor fi adăugate șablonului și atribuite de utilizator. (6) Tipul pointer de funcție, analizează tipul valorii returnate, tipul parametrului și numărul de parametri ai funcției Pentru fiecare unitate de compilare a programului sursă testat, informațiile despre funcția analizată sunt stocate în structura PSD corespunzătoare, iar următoarele exemple de cod sursă sunt descrise:
În programul de mai sus, anulează StructTypeTest3(myy_struct mm_struct[2])Structura PSD salvată este următoarea:
Semnificațiile fiecărui nod din fișierul PSD sunt următoarele: ●StructTypeTest3 reprezintă numele funcției, parmType0 reprezintă tipul parametrului, iar parmNum reprezintă numărul de parametri ●mm_struct reprezintă simbolul parametrului funcției, baseType1 reprezintă clasificarea tipurilor (tip de date de bază, tip de construcție, tip pointer, tip nul), tipul reprezintă tipuri specifice, inclusiv int, char, short, long, double, float, bool, și aceste tipuri de tipuri nesemnate și alte tipuri de bază, și există unele tipuri speciale precum: tipul ZOA_FUN reprezintă tipul funcției, StructureOrClassType reprezintă tipul struct etc., iar numele reprezintă numele structului, uniunii și tipului enum ●i_int reprezintă tipul de bază, care este cea mai mică unitate de atribuire ●array_one reprezintă tipul tabloului, RowSize reprezintă lungimea tabloului, iar tabloul poate fi împărțit în tablouri unidimensionale, bidimensionale etc ●punctul reprezintă tipul pointerului, pointerul este împărțit în pointer de nivel întâi, pointor de nivel doi etc., iar pointerul general este folosit ca parametru de funcție ca un tablou, astfel încât pentru tipul de bază de pointer, metoda array-ului de alocare dinamică este folosită pentru a atribui valori, iar utilizatorul poate modifica fișierul de valori corespunzător în funcție de nevoi. ● w reprezintă tipul câmpului de bit, iar bitfileld reprezintă numărul de cifre ●functionPtr reprezintă tipul pointer de funcție, care analizează tipul parametrilor, numărul de parametri și, respectiv, informațiile despre valoarea returnării ●Dem înseamnă tip consorțiu ● dy reprezintă tipul enum, iar valoarea reprezintă valoarea tipului enum ●file reprezintă tipul de structură, SystemVar reprezintă această variabilă care aparține variabilei din fișierul de antet de sistem, pentru acest tip de variabilă, Wings adaugă variabile șablon în biblioteca de șabloane, utilizatorii pot atribui valori speciale în funcție de nevoi specifice. De exemplu, tipul fișierului este tratat astfel:
Utilizatorii pot, de asemenea, să adauge propriile metode de atribuire. Pentru tipurile de sistem, Wing-urile pot fi diferențiate de tipurile obișnuite definite de utilizator, iar atunci când analizează la tipul încorporat al sistemului, poate opri analiza recursivă în jos. ●g_int reprezintă variabilele globale, iar globalType reprezintă variabilele globale ●next reprezintă structura listei legate, iar NodeType reprezintă această structură ca o listă legată ●returnType reprezintă tipul de valoare returnată al funcției. 2 Generarea automată a driverelorÎn lucrarea de mai sus, informațiile structurale ale variabilelor și funcțiilor globale sunt analizate și extrase, iar următoarele informații sunt folosite pentru a salva în PSD pentru a finaliza generarea generală a cadrului de conducere al programului sursă testat. Generarea este împărțită în principal în următoarele aspecte: Ø Declarația variabilelor globale Ø Operația de atribuire a parametrilor funcției, în funcție de numărul de parametri ai funcției, atribuie la rândul lor valori Ø Atribuirea variabilelor globale se realizează secvențial în funcție de numărul de variabile globale folosite de analiză Ø Apelul funcției originale Câteva aspecte de reținut sunt următoarele: ●În timpul procesului de generare a driverului, unele funcții speciale, cum ar fi funcțiile principale, funcțiile statice etc., nu sunt procesate temporar deoarece nu pot fi accesate de lumea exterioară. ● Pentru fiecare fișier sursă testat, este generat un fișier driver corespunzător. ● Controlul unității este inclus în Driver_main.cpp pentru a configura automat numărul de teste ale funcției prin macro-uri Funcția de driver generată de programul sursă de mai sus este următoarea: ● Toate variabilele sunt denumite înainte de numele variabilei originale, adaugă _ ●Prin obținerea datelor corespunzătoare de test, variabilele sunt atribuite la rândul lor ●Pentru parametrii încorporați ai sistemului și parametrii speciali ai utilizatorului, metoda de atribuire este configurată uniform prin metoda șablon. ●Atribuiți și apelați parametri funcției testate. 3 Datele de test sunt generate automatUrmătorul este un set de date generate în format PSD în Figura 3, fiecare set de date fiind salvat în format JSON, facilitând vizualizarea relației ierarhice a datelor.
Pentru fiecare unitate de compilare, un set de fișiere de date de test corespunzătoare tuturor funcțiilor este generat implicit, iar generarea valorii poate fi modificată în funcție de numărul de configurații. 4 MysqlRezultatele testelor programului sunt afișateCum să finalizezi generarea cadrului driver, următoarea este o explicație detaliată a întregului proces de generare al programului open source MySQL. Următoarea este diagrama principală a interfeței Wings testând Mysql: Faceți clic pe butonul File pentru a seta directorul proiectului programului sursă testat. După finalizarea setărilor, apasă pe operația funcției, care include în principal parsarea parametrilor, generarea driverelor, generarea fișierelor de valoare și adăugarea de șabloane. Următoarele foldere sunt generate pentru analiză: Dintre acestea, modulul de analizare a parametrilor generează FunXml și GlobalXml, care stochează informațiile despre funcție și variabile globale ale fiecărei unități de compilare extrase, respectiv. Modulul de generare a driverelor va fi generat Wings_Projects folder corespunzător, care stochează fișierele driverelor pentru fiecare unitate de compilare Modulul de generare a valorii stochează datele de test generate pentru fiecare unitate de compilare. Figura următoare arată informațiile despre structura fișierului de driver încărcate de Mysql, iar arborele de navigație din stânga este fișierul driver generat, care conține funcțiile fiecărei unități de compilare, precum și parametrii și variabilele globale ale funcțiilor. Faceți clic pe una dintre unitățile de compilare pentru a încărca fișierul driver corespunzător și fișierul de valori corespunzător. Cele de mai sus reprezintă fișierul driver și fișierul de valori corespunzător generării generale a Mysql, iar fișierul driver este descris în detaliu în codul următor. ● Pentru fiecare unitate de compilare, referința variabilei globale este externă. ●Funcția de driver este denumită uniform ca metoda Driver_XXX, JSON este folosit ca metodă de obținere a datelor de testare, iar times reprezintă numărul de teste ale unei singure funcții. ●Pentru fiecare operație de alocare a parametrilor, formatul de stocare PSD analizat este folosit pentru a atribui valori fiecărei structuri de strat pe rând. Aplicarea Wings este foarte simplă, următorul este un indice statistic al datelor de test generate folosind cod Mysql, care poate fi compilat normal în Visual Studio 2015, de exemplu, întregul proces de generare nu necesită intervenție manuală, ci doar formularea traseului codului sursă care trebuie generat și controlat. mysqlDate de testare | Mysqlversiune | | CNumărul fișierelor de cod lingvistic | | Timpul necesar pentru analiză (PSDTimp de generare) | | Timpul necesar pentru a stimula generarea | | Valoarea este generată de timpul necesar pentru a o genera | |
Instrucțiuni de configurare a calculatorului: | Sistem de operare | | | Inter(R) Core(TM) i7-7700cpu 3.60GHz | | | | |
Mai jos sunt rezultatele obținute folosind instrumentul de statistici a codului sursă, cu peste 4 milioane de linii de cod valid de testare unitară generate de Wings complet automat. Ceea ce este și mai interesant este că se poate vedea că costul dezvoltării manuale a acestor coduri ajunge până la 1.079 luni-om, iar costul ajunge la 10,79 milioane.
Wings a realizat primul pas de explorare de către program pentru a genera automat programul, prima versiune este lansată în prezent, dezvoltatorii interesați o pot descărca direct pe platforma code cloud (https://gitee.com/teststars/wings_release), licențierea comercială oferă o perioadă nelimitată de experiență funcțională de o lună, poți experimenta rapid puterea magică a Wings, versiunea Wings în limbajul C suportă mai multe platforme, cum ar fi Visual Studio, vxworks, gcc, qt, etc. Wings este proiectat și dezvoltat de echipa de testare (www.teststar.cc) Nebulas, iar dezvoltatorii interesați pot lua legătura cu echipa de testare Nebulas prin platforma interactivă Codecloud pentru a contribui cu ideile lor de design și feedback asupra utilizării produsului (pentru sugestiile excelente adoptate, Nebulas poate prelungi perioada de utilizare gratuită cu cel puțin trei luni). Wings are o genă puternică de bază care îmbunătățește semnificativ calitatea software-ului, iar pe viitor, Wings va optimiza profund lizibilitatea programelor scrise automat (mai aproape de nivelul de scriere al programatorilor buni) și suportul pentru limbajul C++.
|