|
Vleugels-Maak unittests intelligent en volledig geautomatiseerdinleiding Unit testing is een zeer effectief middel om softwarekwaliteit te waarborgen, of het nu gaat om het concept van vroege interventie in testen of vanuit de kenmerken van unit tests die op hoge snelheid kunnen worden geverifieerd zonder beïnvloed te worden door de UI, dus de testgedreven ontwikkeling die door de industrie wordt bepleit, de testdriver die hierin wordt genoemd, verwijst meer naar de unit test driver. Het algemene ontwikkelingsteam voert echter nog steeds zelden systematische unittests uit, en de test voor applicatiesoftware wordt meer uitgevoerd door professionele testteams om black box-tests uit te voeren. De grootste moeilijkheid van unittesten is niet dat de invoer en output niet bepaald kunnen worden, want dat is al bepaald in de moduleontwikkelingsfase, maar dat het schrijven van unittestcases veel ontwikkelaarsmanuren zal kosten, en volgens relevante statistieken zal de tijd van unittestcases zelfs de ontwikkeltijd van de functie zelf ruimschoots overtreffen. Hier zijn een paar van de meest voorkomende redenen waarom ontwikkeling geen unittests schrijft: ●De vereisten zijn altijd eindeloos, en er zijn nog functionele vereisten te realiseren in de volgende fase, en er is geen tijd om de eenheid te vullen ●Er zijn te veel unittests om aan te vullen, en er is geen manier om te beginnen, dus ik verzet me subjectief daartegen. ● Unittests zijn moeilijk te schrijven. Enerzijds kan de reden zijn dat de implementatie van functionele functies niet redelijk genoeg is, en anderzijds zijn er geen (of onbekende) nuttige unittestframeworks en mock-frameworks. ● Unittests zijn niet inbegrepen in de werklast. Ten tweede zijn de functionele eisen nog steeds instabiel en zijn de kosten en prestaties van het schrijven van unittests niet hoog. Met andere woorden, als de eisen morgen veranderen, wordt niet alleen de functionele code weggegooid, maar ook de unittests. Als je geen unittests schrijft, is dit deel van de inspanning niet voor niets. De oorzaak van bovenstaande punten is namelijk dat het schrijven van unittests te tijdrovend is, wat uiteindelijk leidt tot het verlies van vermogen van de testgedreven motor, waardoor de mooie visie van testgedreven ontwikkeling in het echte scenario vastloopt, omdat het te moeilijk en duur is om de motor voor deze drive te bouwen. De verschillende "x"-units op de markt en unit testing-frameworks lossen alleen het probleem op van het genereren van testgedreven buitenframes, zonder enige use case-logica en datageneratiemogelijkheden gebaseerd op diepgaand programmabegrip. Daarom maakt het ontwikkelaars resistent in verschillende ontwikkelingsgerelateerde scenario's. De release van Wings (momenteel voor C) lost een van de grootste problemen voor programmeurs op en heeft het potentieel om de status quo van unit testing fundamenteel te veranderen, wat effectief de druk van systeemniveau black box testing en geautomatiseerd testen gebaseerd op enorme menselijke hulpbronnen zal verlichten. De constraint-testcases worden automatisch door programma's gegenereerd, en de meest kritieke onderliggende technologie is de technologie voor complexe parameterparsing. Dat wil zeggen, het kan willekeurig geneste niveau recursieve parsing definiëren op compilerniveau voor willekeurig complexe types. Zonder deze doorbraak in deze kritieke technologie zou het automatische testcase-generatiesysteem commercieel niet in staat zijn of evolueren om conforme testgegevens met zeer lage efficiëntie te produceren. Zo kan de beroemde fuzzing-tool American Fuzzy Lop het type structuur dat het programma van de gebruiker vereist niet identificeren en moet het zoekalgoritme evolueren op basis van de buitenste laag. De kenmerken van het programma zijn dat de invoer op interfaceniveau en de datavereisten van een interne module ver weg liggen, en de externe data wordt meestal laag voor laag getransformeerd in complexe transformatie tot het type datastructuur dat vereist is door de interne module, dus de hoeveelheid rekenwerk en tijd die nodig is om vanuit de externe laag te verkennen zal onvoorstelbaar zijn. Gebaseerd op de Amerikaanse Fuzzy Lop moet de interne module van het programma om een legitieme SQL-instructie te kunnen genereren in enkele dagen worden onderzocht, in plaats van minuten of uren. Een andere beperking is dat de invoer die elk programma kan overnemen zorgvuldig gestructureerd en gecompileerd zijn met een groot aantal regels, en het is zeer onrealistisch en extreem tijdrovend om deze data te genereren via willekeurige + verkennende methoden. Daarom is het niet haalbaar om automatisch gegenereerde use cases te genereren uit de black box naast de buitenste input. Als de use case-gedreven vorm voortkomt uit de analyse van de interne structuur van de software, is het noodzakelijk om een diepgaand begrip te hebben van de compilatiestructuur van de software. Een levensvatbaar testcase-generatiesysteem moet gebaseerd zijn op het midden van het programma (key entry point) als het meest geschikte testingangspunt. De inputs van deze modules hebben fuzzy inputs omgezet in sterk gestructureerde parameters. Zolang deze complexe structuren kunnen worden geïdentificeerd, de complexe datatypes stap voor stap kunnen worden teruggebracht tot eenvoudige datatypen, en de parameterconstructie tegelijkertijd kan worden voltooid, kan het genereren van de aangedreven use cases automatisch worden afgerond. Module-gebaseerde testen, die kunnen worden geclassificeerd als traditionele unittesten, zijn de beste manier om defecten in de R&D-fase te vinden en te beheersen. Door de beperkingen van unit testing moeten echter veel drivers worden ontwikkeld, en zijn promotie en toepassingen in de industrie sterk beperkt. Natuurlijk kunnen unittests ook worden uitgevoerd nadat het systeem is geïntegreerd om het bouwen van virtuele stubprogramma's te voorkomen. Het Wings-product van Nebulas Testing, dat enkele dagen geleden voor het eerst wereldwijd werd gelanceerd, is een intelligent en volledig geautomatiseerd systeem voor het genereren van unittestcases, dat de volgende problemen heeft bestudeerd en opgelost, en nu met u gedeeld wordt. (1) Diepgaande analyse van programmaparameters Wings gebruikt de onderliggende technologie van de compiler om moduleobjecten te vormen op basis van het invoerbronbestand volgens de functie. Het object bevat de invoerparameters van de functie, het type retourwaarde en andere informatie, die kan worden gebruikt door de driverfunctiemodule en de testcasemodule. Elk bestand is een eenheid die diepgaande analyses uitvoert van elke parameter van elke functie erin, en nauwkeurige parsing en decompositie kan realiseren voor geneste types, complexe types, enzovoort, complexe types laag voor laag kan uitleggen als basisdatatypes, en een beschrijvingsbestand (PSD) van parameterstructuur kan genereren. (2) Functie-aandrijving automatische generatie van modules Volgens de formaatinformatie van het PSD-bestand worden alle driverfuncties van het bronprogramma dat wordt getest automatisch gegenereerd, en vertrouwt het unit testing-proces niet langer op ontwikkelaars om testfuncties handmatig te schrijven, maar hoeft alleen de gegenereerde driverfuncties en de bronbestanden samen te compileren, en kunnen de testresultaten worden uitgevoerd en de testresultaten worden bekeken. De testdriver genereert automatisch het programma op basis van de PSD-beschrijving, bouwt volledig automatisch alle parameters en benodigde globale variabelen die de te testen test aansturen, en kan een gestructureerde testdriver genereren volgens de hiërarchie van complexe variabelen, wat veel tijd kan besparen bij het schrijven van unittestcases. (3) Automatische generatie en beheer van testgegevens Het wordt gebruikt om automatisch testgegevens te genereren, die overeenkomen met de informatie die door de testfunctie wordt geëxtraheerd, en de gegevens worden opgeslagen in een JSON-bestand met een bepaalde hiërarchische logische relatie. De gegevens en het datatype na decompositie en expansie komen overeen met elkaar. Gebruikers kunnen deze data willekeurig marginaliseren volgens zakelijke vereisten en JSON-bestanden gebruiken om ze op een gestructureerde en hiërarchische manier weer te geven, wat heel duidelijk is. De testgegevens bevatten de waarden van globale variabelen en de parameterwaarden wanneer de te testen functie wordt aangeroepen. Wings biedt een unit testing-methode voor het automatisch genereren van driverfuncties, die voornamelijk de volgende stappen omvat: Figuur 1: Unit test-gedreven bouwflow 1 Extractie van de informatie van het te testen programmaDe structuurinformatie van het getest programma omvat voornamelijk de globale variabelen en functie-informatie in het programma, en de functie-informatie omvat voornamelijk het aantal parameters, parametertypes en retourwaardetypes van de functie. Het belangrijkste is om de symboolinformatie en type-informatie voor enkele complexe types te extraheren en deze laag voor laag te analyseren tot basisdatatypes om de constructie van globale variabelen en functieparameters te voltooien. De typen variabelen worden over het algemeen onderverdeeld in basistypen, constructietypen, pointertypes en nulltypes. Wings gebruikt de onderliggende compilatietechnologie om verschillende variabeletypes op verschillende manieren te behandelen. (1) Basistypen, zoals ongetekende int u_int=20, Wings zullen de naam van de variabele naar u_int parsen en het datatype naar ongetekende int. (2) Constructietypes, constructietypes worden grofweg onderverdeeld in arrays, structs, commons en enumeratietypen. ● Arraytype, zoals intarray[2][3], arraynaam is array, type int en lengte van 2D-array, gedrag 2, kolom 3. ● Structuurtype, voor structs als arrays, struct linked lists, enzovoort, worden verschillende markers verdeeld. (3) Pointertype, bijvoorbeeld int **ptr = 0; , ontleedt de pointer als een level 2 pointer van het type int. (4) Null-type, dat wordt opgelost als NULL. (5) Systeemtypen, zoals Bestand, size_t, enz., worden gemarkeerd als systeemtypen en worden toegevoegd aan het sjabloon en door de gebruiker toegewezen. (6) Functiepointertype, analyseer het type retourwaarde, het parametertype en het aantal parameters van de functie Voor elke compilatie-eenheid van het bronprogramma dat wordt getest, wordt de geparseerde functie-informatie opgeslagen in de bijbehorende PSD-structuur, en worden de volgende broncodevoorbeelden beschreven:
In het bovenstaande programma wordt StructTypeTest3 leeggeldig.(myy_struct mm_struct[2])De opgeslagen PSD-structuur is als volgt:
De betekenissen van elke node in het PSD-bestand zijn als volgt: ●StructTypeTest3 vertegenwoordigt de functienaam, parmType0 het parametertype, en parmNum het aantal parameters ●mm_struct vertegenwoordigt het symbool van de functieparameter, baseType1 vertegenwoordigt de classificatie van typen (basisdatatype, constructietype, pointertype, null type), type vertegenwoordigt specifieke typen, waaronder int, char, short, long, double, float, bool, en deze typen ongetekende types en andere basistypen, en er zijn enkele speciale types zoals: ZOA_FUN type vertegenwoordigt functietype, StructureOrClassType vertegenwoordigt het structtype, enzovoort, en naam staat voor de naam van het struct-, union- en enum-type ●i_int vertegenwoordigt het basistype, dat de kleinste toewijzingseenheid is ●array_one vertegenwoordigt het type array, RowSize geeft de lengte van de array aan, en de array kan worden onderverdeeld in eendimensionale arrays, tweedimensionale arrays, enzovoort ●punt staat voor het type pointer, de pointer is onderverdeeld in pointer op het eerste niveau, de pointer op het tweede niveau, enzovoort, en de algemene pointer wordt gebruikt als functieparameter als array, dus voor het basistype pointer wordt de methode van dynamische allocatie-array gebruikt om waarden toe te wijzen, en kan de gebruiker het bijbehorende waardebestand aanpassen naar de behoeften. ● w staat voor het type bitveld, en bitfileld geeft het aantal cijfers voor ●functionPtr vertegenwoordigt het type functiepointer, dat respectievelijk het parametertype, het aantal parameters en de terugvoerwaarde analyseert ●Dem staat voor consortium type ● dy vertegenwoordigt het enumtype, en waarde vertegenwoordigt de waarde van het enumtype ●bestand vertegenwoordigt het structuurtype, SystemVar vertegenwoordigt deze variabele behoort tot de variabele in het systeemheaderbestand, voor dit type variabele voegt Wings sjabloonvariabelen toe aan de templatebibliotheek, gebruikers kunnen speciale waarden toewijzen aan specifieke behoeften. Bijvoorbeeld, het bestandstype wordt als volgt behandeld:
Gebruikers kunnen ook hun eigen toewijzingsmethoden toevoegen. Voor systeemtypen kan Wings worden onderscheiden van gewone door de gebruiker gedefinieerde types, en bij het parsen naar het ingebouwde type van het systeem kan het recursieve analyse naar beneden stoppen. ●g_int stelt globale variabelen voor, en globalType stelt globale variabelen voor ●next vertegenwoordigt de gekoppelde lijststructuur, en NodeType vertegenwoordigt deze structuur als een gekoppelde lijst ●returnType vertegenwoordigt het type retourwaarde van de functie. 2 Automatische generatie van coureursIn het bovenstaande artikel wordt de structurele informatie van globale variabelen en functies geanalyseerd en geëxtraheerd, en de volgende informatie wordt gebruikt om in PSD op te slaan om de algehele generatie van het aansturende kader van het te testen bronprogramma te voltooien. De generatie is voornamelijk verdeeld in de volgende aspecten: Ø Verklaring van globale variabelen Ø Toewijzingsoperatie van functieparameters, volgens het aantal functieparameters, wijst op hun beurt waarden toe Ø De toewijzing van globale variabelen wordt sequentieel uitgevoerd op basis van het aantal globale variabelen dat door de analyse wordt gebruikt Ø Roep van de oorspronkelijke functie Enkele punten om op te merken zijn als volgt: ●Tijdens het genereren van drivers worden sommige speciale functies, zoals hoofdfuncties, statische functies, enz., tijdelijk niet verwerkt omdat ze niet toegankelijk zijn voor de buitenwereld. ● Voor elk bronbestand dat wordt getest, wordt een overeenkomstig driverbestand gegenereerd. ● Schijfbesturing is opgenomen in de Driver_main.cpp om automatisch het aantal tests van de functie via macro's te configureren De driverfunctie die door het bovenstaande bronprogramma wordt gegenereerd, is als volgt: ● Alle variabelen worden genoemd vóór de naam van de oorspronkelijke variabele, voeg _ toe ●Door de bijbehorende testgegevens te verkrijgen, worden de variabelen op hun beurt toegewezen ●Voor de ingebouwde parameters van het systeem en de speciale parameters van de gebruiker wordt de toewijzingsmethode uniform geconfigureerd via de template-methode. ●Wijs parameters toe en roep aan de te testen functie. 3 Testgegevens worden automatisch gegenereerdHieronder volgt een set data die in PSD-formaat is gegenereerd in Figuur 3; elke set gegevens wordt opgeslagen in JSON-formaat, waardoor het makkelijker is om de hiërarchische relatie van de data te zien.
Voor elke compilatie-eenheid wordt standaard een set testdatabestanden gegenereerd die overeenkomen met alle functies, en kan de waardegeneratie worden aangepast door het aantal configuraties. 4 MysqlResultaten van programmatests worden weergegevenHoe de generatie van het driverframework wordt voltooid, volgt een gedetailleerde uitleg van het volledige generatieproces van het open source-programma MySQL. Hieronder volgt het hoofdinterfacediagram van Wings die Mysql testen: Klik op de Bestandsknop om de projectmap van het bronprogramma onder test in te stellen. Nadat de instellingen zijn voltooid, klik je op de functiebewerking, die voornamelijk parameters parsing, drivergeneratie, waardebestandgeneratie en sjabloontoevoeging omvat. De volgende mappen worden gegenereerd voor de analyse: Onder hen genereert de parameter parsing-module FunXml en GlobalXml, die respectievelijk de functie-informatie en de globale variabeleninformatie van elke geëxtraheerde compilatie-eenheid opslaan. De drivergeneratiemodule wordt gegenereerd Wings_Projects bijbehorende map, waarin de driverbestanden voor elke compilatie-eenheid worden opgeslagen De waardegeneratiemodule slaat de gegenereerde testgegevens op voor elke compilatie-eenheid. De volgende figuur toont de stuurprogrammabestandsstructuur die door Mysql is geladen, en de navigatieboom links is het gegenereerde stuurprogrammabestand, dat de functies van elke compilatie-eenheid bevat, evenals de parameters en globale variabelen van de functies. Klik op een van de compilatie-units om het bijbehorende driverbestand en het bijbehorende waardebestand te laden. Bovenstaande is het driverbestand en het value-bestand dat overeenkomt met de algemene generatie van Mysql, en het driverbestand wordt in detail beschreven in de volgende code. ● Voor elke compilatie-eenheid is de referentie van de globale variabele via extern. ●De driverfunctie wordt uniform aangeduid als de Driver_XXX-methode, JSON wordt gebruikt om testgegevens te verkrijgen, en times vertegenwoordigt het aantal tests van een enkele functie. ●Voor elke parametertoewijzingsoperatie wordt het geparseerde PSD-opslagformaat gebruikt om waarden aan elke laagstructuur afzonderlijk toe te wijzen. De toepassing van Wings is heel eenvoudig; hieronder volgt een statistische index van de gegenereerde testgegevens met Mysql-code die normaal gecompileerd kan worden in Visual Studio 2015 als voorbeeld; het hele generatieproces vereist geen handmatige interventie, alleen het formuleren van het pad van de broncode die gegenereerd en aangestuurd moet worden. MySQLTestgegevens | MysqlVersie | | CAantal taalcodebestanden | | Tijd die nodig is om te analyseren (PSDGeneratietijd) | | De tijd die nodig is om generatie aan te drijven | | De waarde wordt gegenereerd door de tijd die het kost om het te genereren | |
Computerconfiguratie-instructies: | Besturingssysteem | | | Inter(R) Core(TM) i7-7700cpu 3,60GHz | | | | |
Hieronder staan de resultaten verkregen met de broncodestatistiektool, met meer dan 4 miljoen regels geldige unittestcode die volledig automatisch door Wings zijn gegenereerd. Wat nog interessanter is, is dat blijkt dat de kosten voor handmatige ontwikkeling van deze codes wel 1.079 manmaanden bedragen, en de kosten tot wel 10,79 miljoen.
Wings heeft de eerste stap van verkenning door het programma gerealiseerd om het programma automatisch te genereren, de eerste versie is momenteel uitgebracht, geïnteresseerde ontwikkelaars kunnen het direct downloaden op het code cloudplatform (https://gitee.com/teststars/wings_release), commerciële licenties bieden een onbeperkte functionele periode van een maand, je kunt snel de magische kracht van Wings ervaren, de C-taalversie van Wings ondersteunt meerdere platforms, zoals Visual Studio, VXWORKS, GCC, QT, enzovoort. Wings is ontworpen en ontwikkeld door het Nebulas testing (www.teststar.cc) team, en geïnteresseerde ontwikkelaars kunnen via het interactieve platform van Codecloud contact opnemen met het Nebulas-testteam om hun ontwerpideeën en feedback op het productgebruik te leveren (voor de uitstekende suggesties kan Nebulas de gratis gebruiksperiode met minstens drie maanden verlengen). Wings heeft een sterk, onderliggend gen om de softwarekwaliteit aanzienlijk te verbeteren, en in de toekomst zal Wings de leesbaarheid van automatisch geschreven programma's (dichter bij het schrijfniveau van goede programmeurs) en ondersteuning voor de C++-taal grondig optimaliseren.
|