Dieser Artikel ist ein Spiegelartikel der maschinellen Übersetzung, bitte klicken Sie hier, um zum Originalartikel zu springen.

Ansehen: 13725|Antwort: 1

[C++] Flügel – Lassen Sie Einheitstests intelligent und automatisch generiert werden

[Link kopieren]
Veröffentlicht am 06.08.2018 14:30:37 | | | |
Flügel-Mach Unittests intelligent und vollautomatisiertVorwort
Unit-Testing ist ein sehr effektives Mittel, um die Softwarequalität sicherzustellen, sei es aus der Perspektive des Konzepts der frühen Intervention im Testen oder durch die Eigenschaften von Unit-Tests, die mit hoher Geschwindigkeit verifiziert werden können, ohne von der UI beeinflusst zu werden. Daher bezieht sich die von der Branche empfohlene testgetriebene Entwicklung eher auf den Unit Test Driver. Das allgemeine Entwicklungsteam führt Unit-Tests jedoch immer noch selten systematisch aus, und der Test für Anwendungssoftware wird eher von professionellen Testteams durchgeführt, um Black-Box-Tests durchzuführen. Die größte Schwierigkeit des Unit-Tests ist nicht, dass Eingabe und Ausgabe nicht bestimmt werden können – sie sind schließlich bereits in der Modulentwicklungsphase festgelegt –, sondern dass das Schreiben von Unit-Test-Fällen viele Entwickler-Arbeitsstunden beansprucht, und laut relevanten Statistiken wird die Zeit der Unit-Test-Fälle sogar die Entwicklungszeit der Funktion selbst bei weitem übersteigen. Hier sind einige der häufigsten Gründe, warum die Entwicklung keine Unit-Tests schreibt:
●Die Anforderungen sind immer endlos, und es gibt noch funktionale Anforderungen in der nächsten Phase, und es bleibt keine Zeit, die Einheit zu füllen.
●Es gibt zu viele Unit-Tests, die ergänzt werden könnten, und es gibt keinen Anfang, also widerstehe ich subjektiv.
● Unit-Tests sind schwer zu schreiben. Einerseits könnte der Grund sein, dass die funktionale Funktionsimplementierung nicht vernünftig genug ist, andererseits gibt es keine (oder unbekannten) nützlichen Unit-Test- und Mock-Frameworks.
● Unit-Tests sind nicht in der Arbeitslast enthalten.
Zweitens sind die funktionalen Anforderungen weiterhin instabil, und die Kosten für das Schreiben von Unit-Tests sind nicht hoch. Mit anderen Worten: Wenn sich die Anforderungen morgen ändern, wird nicht nur der funktionale Code verworfen, sondern auch die Unit-Tests. Wenn du keine Unit-Tests schreibst, ist dieser Teil der Arbeit nicht umsonst.
Tatsächlich ist die Hauptursache der oben genannten Punkte, dass das Schreiben von Unit-Testtests zu zeitaufwendig ist, was schließlich zum Leistungsverlust des testgetriebenen Motors führt, wodurch die schöne Vision der testgetriebenen Entwicklung im realen Szenario ins Stocken gerät, da es zu schwierig und teuer ist, den Motor für diese Fahrt zu bauen. Die verschiedenen "x"-Einheiten auf dem Markt und Unittesting-Frameworks lösen nur das Problem, testgetriebene äußere Frames zu generieren, ohne jegliche Anwendungsfalllogik und Datengenerierungsmöglichkeiten, die auf tiefgehendem Programmverständnis basieren. Daher macht es Entwickler in verschiedenen entwicklungsbezogenen Szenarien widerstandsfähig. Die Veröffentlichung von Wings (derzeit für C) löst eines der größten Probleme für Programmierer und hat das Potenzial, den Status quo des Unit-Testings grundlegend zu verändern, was den Druck durch systemweites Black-Box-Testing und automatisiertes Testen auf Basis massiver Personalressourcen effektiv lindern wird.
Die Constraint-Testfälle werden automatisch von Programmen generiert, und die kritischste zugrundeliegende Technologie ist die komplexe Parameter-Parsing-Technologie. Das heißt, es kann beliebig verschachtelte rekursive Parsing auf Compilerebene für beliebige komplexe Typen definieren. Ohne diesen Durchbruch in dieser kritischen Technologie wäre das automatische Testfall-Generierungssystem entweder kommerziell unfähig oder würde sich so weiterentwickeln, dass konforme Testdaten mit sehr geringer Effizienz erzeugt werden. Zum Beispiel kann das berühmte Fuzzing-Tool American Fuzzy Lop die vom Benutzerprogramm benötigte Struktur nicht identifizieren und muss den Suchalgorithmus basierend auf der äußersten Ebene weiterentwickeln. Die Eigenschaften des Programms sind, dass die Eingabe auf Schnittstellenebene und die Datenanforderungen eines internen Moduls weit entfernt sind, und die externen Daten werden üblicherweise Schicht für Schicht komplexer Transformation transformiert, um den Datenstrukturtyp zu erhalten, der vom internen Modul benötigt wird, sodass der Aufwand an Berechnung und Zeit, die von außen benötigt wird, unvorstellbar ist. Basierend auf dem amerikanischen Fuzzy Lop muss das interne Modul des Programms, um eine legitime SQL-Anweisung generieren zu können, innerhalb von Tagen erkundet werden, anstatt Minuten oder Stunden zu dauern. Eine weitere Einschränkung ist, dass die Eingaben, die jedes Programm übernehmen kann, sorgfältig strukturiert und kompilierte Daten mit einer großen Anzahl von Regeln sind, und es ist sehr unrealistisch und extrem zeitaufwendig, diese Daten durch zufällige + explorative Methoden zu generieren. Daher ist es nicht machbar, automatisch generierte Anwendungsfälle sowohl aus der Black Box als auch aus dem äußersten Input zu generieren.
Wenn der Use Case Driven aus der Analyse der internen Struktur der Software stammt, ist es notwendig, ein tiefes Verständnis der Kompilierungsstruktur der Software zu haben. Ein brauchbares Testfall-Generierungssystem sollte auf der Mitte des Programms (Key Entry Point) als geeignetstem Testeintrittspunkt basieren. Die Eingaben dieser Module haben unscharfe Eingaben in hochstrukturierte Parameter umgewandelt. Solange diese komplexen Strukturen identifiziert, die komplexen Datentypen Schritt für Schritt in einfache Datentypen degradiert werden können und die Parameterkonstruktion gleichzeitig abgeschlossen werden kann, kann die Erzeugung der treibenden Anwendungsfälle automatisch abgeschlossen werden.
Modulbasierte Tests, die als traditionelle Einheitstests klassifiziert werden können, sind der beste Weg, um Fehler in der F&E-Phase zu finden und einzudämmen. Aufgrund der Einschränkungen des Unit-Tests müssen jedoch viele Treiber entwickelt werden, und Werbung sowie Anwendung in der Branche sind stark eingeschränkt. Natürlich können Unit-Tests auch nach der Integration des Systems ausgeführt werden, um das Erstellen virtueller Stub-Programme zu vermeiden.
Das Wings-Produkt von Nebulas Testing, das vor einigen Tagen erstmals weltweit vorgestellt wurde, ist ein intelligentes und vollautomatisches System zur Erzeugung von Unit-Testfällen, das die folgenden Schwierigkeiten untersucht und gelöst hat und nun mit Ihnen geteilt wird.
(1) Tiefgehende Analyse der Programmparameter
Wings nutzt die zugrundeliegende Technologie des Compilers, um Modulobjekte basierend auf der Eingabequellendatei entsprechend der Funktion zu bilden. Das Objekt enthält die Eingabeparameter der Funktion, den Rückgabe-Werttyp und weitere Informationen, die sowohl vom Treiberfunktionsmodul als auch vom Testfallmodul verwendet werden können. Jede Datei ist eine Einheit, die eine tiefgehende Analyse jedes Parameters jeder Funktion durchführt und eine genaue Parsing und Zerlegung von verschachtelten, komplexen Typen usw. erreichen kann, komplexe Typen Ebene für Schicht als grundlegende Datentypen erklären und eine Beschreibungsdatei (PSD) der Parameterstruktur generieren kann.
(2) Funktionsantrieb automatische Generierung von Modulen
Laut den Formatinformationen der PSD-Datei werden alle Treiberfunktionen des zu testenden Quellprogramms automatisch generiert, und der Unit-Test-Prozess ist nicht mehr darauf angewiesen, dass Entwickler Testfunktionen manuell schreiben, sondern müssen lediglich die generierten Treiberfunktionen und die zu testenden Quelldateien zusammen kompilieren, und die Testergebnisse können ausgeführt und die Testergebnisse angesehen werden. Der Testtreiber erzeugt das Programm automatisch basierend auf der PSD-Beschreibung, baut vollständig automatisch alle Parameter und notwendigen globalen Variablen, die den getesteten Test steuern, und kann einen strukturierten Testtreiber entsprechend der Hierarchie der komplexen Variablen erzeugen, was viel Zeit beim Erstellen von Einheitstestfällen spart.
(3) Automatische Generierung und Verwaltung von Testdaten
Es wird verwendet, um Testdaten automatisch zu generieren, die den von der Testfunktion extrahierten Informationen entsprechen, und die Daten werden in einer JSON-Datei mit einer bestimmten hierarchischen logischen Beziehung gespeichert. Die Daten und der Datentyp nach Zerlegung und Expansion stimmen miteinander überein. Nutzer können diese Daten beliebig nach Geschäftsanforderungen marginalisieren und JSON-Dateien verwenden, um sie strukturiert und hierarchisch darzustellen, was sehr klar ist. Die Testdaten enthalten die Werte globaler Variablen und die Parameterwerte, wenn die zu testende Funktion aufgerufen wird.
Wings bietet eine Einheitstestmethode zur automatischen Erzeugung von Treiberfunktionen, die hauptsächlich folgende Schritte umfasst:
Abbildung 1: Unit-testgesteuerter Build-Flow
1   Extraktion der Informationen des zu testenden Programms
Die Strukturinformationen des zu testenden Programms umfassen hauptsächlich die globalen Variablen und Funktionsinformationen im Programm, und die Funktionsinformationen umfassen hauptsächlich die Anzahl der Parameter, Parametertypen und Rückgabe-Werttypen der Funktion. Das Wichtigste ist, die Symbolinformationen und Typinformationen für einige komplexe Typen zu extrahieren und sie Schicht für Schicht in grundlegende Datentypen zu analysieren, um die Konstruktion globaler Variablen und Funktionsparameter abzuschließen.
Die Variablentypen werden im Allgemeinen in Basistypen, Konstruktionstypen, Zeigertypen und Nulltypen unterteilt. Wings nutzt die zugrundeliegende Kompilationstechnologie, um verschiedene Variablentypen auf unterschiedliche Weise zu handhaben.
(1) Grundtypen, wie unsigned int u_int=20, Wings parsen den Namen der Variablen zu u_int und den Datentyp zu unsigned int.
(2) Bauarten, Konstruktionstypen werden grob in Arrays, Strukturen, Gemeinmengen und Aufzählungstypen unterteilt.
● Array-Typ, wie intarray[2][3], Array-Name ist Array, Typ int und Länge des 2D-Arrays, Verhalten 2, Spalte 3.
● Strukturtyp, für Strukturen als Arrays, Struct-verkettete Listen usw., werden verschiedene Marker geteilt.
(3) Zeigertyp, z. B. int **ptr = 0; , analysiert den Zeiger als einen Level-2-Pointer vom Int-Typ.
(4) Null-Typ, der als NULL aufgelöst wird.
(5) Systemtypen wie Datei, size_t usw. werden als Systemtypen markiert und werden der Vorlage hinzugefügt und vom Benutzer zugewiesen.
(6) Funktionszeigertyp, Analyse des Rückgabe-Werttyps, Parametertyps und Anzahl der Parameter der Funktion
Für jede Kompilierungseinheit des zu testenden Quellprogramms werden die geparsten Funktionsinformationen in der entsprechenden PSD-Struktur gespeichert, und folgende Quellcodebeispiele werden beschrieben:
   

Im obigen Programm wird StructTypeTest3 ungültig gemacht(myy_struct mm_struct[2])Die gespeicherte PSD-Struktur ist wie folgt:

Die Bedeutungen jedes Knotens in der PSD-Datei sind wie folgt:
●StructTypeTest3 steht für den Funktionsnamen, parmType0 für den Parametertyp und parmNum für die Anzahl der Parameter
●mm_struct repräsentiert das Symbol des Funktionsparameters, baseType1 steht für die Klassifikation von Typen (Basisdatentyp, Konstruktionstyp, Zeigertyp, Nulltyp), Type repräsentiert spezifische Typen, darunter int, char, short, long, double, float, bool, und diese Arten von unsignierten Typen und andere Grundtypen, und es gibt einige spezielle Typen wie: ZOA_FUN Typ repräsentiert den Funktionstyp, StructureOrClassType stellt den Struct-Typ usw. dar, und Name steht für den Namen des Struct-, Union- und Enum-Typs
●i_int stellt den Basistyp dar, der die kleinste Zuweisungseinheit ist
●array_one repräsentiert den Array-Typ, RowSize die Länge des Arrays, und das Array kann in eindimensionale, zweidimensionale Arrays usw. unterteilt werden
●Punkt repräsentiert den Zeigertyp, der Zeiger wird in Zeiger erster Ebene, Zeiger auf zweiter Ebene usw. unterteilt, und der allgemeine Zeiger wird als Funktionsparameter als Array verwendet, sodass für den Grundzeigertyp die Methode des dynamischen Allokationsarrays verwendet wird, um Werte zuzuweisen, und der Benutzer kann die entsprechende Wertedatei je nach Bedarf anpassen.
● w steht für den Typ des Bitfeldes, und bitfileld für die Anzahl der Ziffern
●functionPtr repräsentiert den Funktionszeigertyp, der den Parametertyp, die Anzahl der Parameter und die Rückgabewertung analysiert.
●Dem steht für Konsortiumtyp
● dy steht für den Enum-Typ, und der Wert für den Wert des Enum-Typs
●file repräsentiert den Strukturtyp, SystemVar repräsentiert, diese Variable gehört zur Variable in der Systemheaderdatei, für diesen Variablentyp fügt Wings Vorlagenvariablen zur Vorlagenbibliothek hinzu, Benutzer können spezielle Werte entsprechend spezifischen Anforderungen zuweisen. Zum Beispiel wird der Dateityp wie folgt behandelt:

Nutzer können auch eigene Zuweisungsmethoden hinzufügen. Für Systemtypen lassen sich Wings von gewöhnlichen, benutzerdefinierten Typen unterscheiden, und beim Parsen auf den eingebauten Systemtyp kann die rekursive Analyse nach unten gestoppt werden.
●g_int repräsentiert globale Variablen, und globalType repräsentiert globale Variablen
●next stellt die verknüpfte Listenstruktur dar, und NodeType stellt diese Struktur als verkettete Liste dar
●returnType repräsentiert den Rückgabe-Werttyp der Funktion.
2   Automatische Generierung von Fahrern
In der obigen Arbeit werden die strukturellen Informationen globaler Variablen und Funktionen analysiert und extrahiert, und die folgenden Informationen werden verwendet, um in PSD zu speichern, um die Gesamtgenerierung des Antriebsrahmens des zu testenden Quellprogramms abzuschließen.
Die Erzeugung ist hauptsächlich in folgende Bereiche unterteilt:
Ø Deklaration globaler Variablen
Ø Zuweisungsoperation von Funktionsparametern, entsprechend der Anzahl der Funktionsparameter, weist nacheinander Werte zu
Ø Die Zuordnung globaler Variablen erfolgt sequentiell entsprechend der Anzahl der in der Analyse verwendeten globalen Variablen
Ø Ruf der ursprünglichen Funktion
Einige zu beachten Punkte sind wie folgt:
●Während des Treibergenerierungsprozesses werden einige spezielle Funktionen, wie Hauptfunktionen, statische Funktionen usw., nicht vorübergehend verarbeitet, da sie von der Außenwelt nicht zugänglich sind.
● Für jede zu testende Quelldatei wird eine entsprechende Treiberdatei generiert.
● Die Laufwerkssteuerung ist im Driver_main.cpp enthalten, um automatisch die Anzahl der Tests der Funktion über Makros zu konfigurieren
Die vom obigen Quellprogramm erzeugte Treiberfunktion ist wie folgt:
● Alle Variablen werden vor dem Namen der ursprünglichen Variablen benannt, addiere _
●Durch die Ermittlung der entsprechenden Testdaten werden die Variablen nacheinander zugewiesen
●Für die eingebauten Systemparameter und die speziellen Parameter des Benutzers wird die Zuweisungsmethode einheitlich über die Vorlagenmethode konfiguriert.
●Parametern werden der zu testen Funktion zugewiesen und aufgerufen.
3   Testdaten werden automatisch erzeugt
Im Folgenden ist ein Datensatz im PSD-Format in Abbildung 3 dargestellt; jeder Datensatz ist im JSON-Format gespeichert, was es erleichtert, die hierarchische Beziehung der Daten zu erkennen.

Für jede Kompilierungseinheit wird standardmäßig eine Menge von Testdatendateien erzeugt, die allen Funktionen entsprechen, und die Werterstellung kann um die Anzahl der Konfigurationen angepasst werden.
4 MysqlDie Ergebnisse der Programmtests werden angezeigt
Wie man die Generierung des Treiber-Frameworks abschließt: Im Folgenden eine detaillierte Erklärung des vollständigen Generierungsprozesses des Open-Source-Programms MySQL.
Im Folgenden ist das Haupt-Schnittstellendiagramm von Wings beim Testen von Mysql:
Klicken Sie auf die Datei-Schaltfläche, um das Projektverzeichnis des Quellprogramms unter Test einzustellen. Nachdem die Einstellungen abgeschlossen sind, klicken Sie auf die Funktionsoperation, die hauptsächlich Parameterparsing, Treibergenerierung, Wertdateiengenerierung und Vorlagenhinzufügen umfasst. Für die Analyse werden folgende Ordner erstellt:
Darunter erzeugt das Parameterparsing-Modul FunXml und GlobalXml, die jeweils die Funktionsinformationen und globale Variableninformationen jeder extrahierten Kompilierungseinheit speichern.
Das Treibergenerierungsmodul wird Wings_Projects entsprechenden Ordner generiert, der die Treiberdateien für jede Kompilierungseinheit speichert
Das Werterstellungsmodul speichert die generierten Testdaten für jede Kompilierungseinheit.
Die folgende Abbildung zeigt die von Mysql geladenen Informationen zur Treiberdateistruktur, und der Navigationsbaum links ist die generierte Treiberdatei, die die Funktionen jeder Kompilierungseinheit sowie die Parameter und globalen Variablen der Funktionen enthält. Klicken Sie auf eine der Kompilierungseinheiten, um die entsprechende Treiberdatei und die entsprechende Wertdatei zu laden.
Oben ist die Treiber- und Wertdatei, die der Gesamtgenerierung von MySQL entspricht, und die Treiberdatei wird im folgenden Code ausführlich beschrieben.
● Für jede Kompilierungseinheit ist die Referenz der globalen Variablen durch extern.
●Die Treiberfunktion wird einheitlich als Driver_XXX bezeichnet, JSON wird als Methode zur Erfassung von Testdaten verwendet, und Times steht für die Anzahl der Tests einer einzelnen Funktion.
●Für jede Parameterzuweisungsoperation wird das geparste PSD-Speicherformat verwendet, um jeder Schichtstruktur nacheinander Werte zuzuweisen.
Die Anwendung von Wings ist sehr einfach: Folgendes ist ein statistischer Index der generierten Testdaten mit Mysql-Code, der in Visual Studio 2015 normal kompiliert werden kann. Als Beispiel ist der gesamte Generierungsprozess nicht manuell erforderlich, sondern nur der Pfad des Quellcodes, der generiert und gesteuert werden muss.
MySQLTestdaten
  
MysqlVersion
  
5.5
CAnzahl der Sprachcodedateien
578Einzelpersonen
Zeit, die zur Analyse benötigt wird (PSDGenerationszeit)
149,099
Die Zeit, die zur Erzeugung benötigt wird
27,461s
Der Wert wird durch die benötigte Zeit erzeugt
84.974
Konfigurationsanweisungen für den Computer:
  
Betriebssystem
  
Windows7
Prozessor
Inter(R) Core(TM) i7-7700cpu 3,60GHz
Gedächtnis
8,00 GB
Systemtyp
64Bit
Nachfolgend sind die Ergebnisse mit dem Quellcode-Statistiktool erhalten, mit über 4 Millionen Zeilen gültigen Unit-Testcodes, die von Wings vollständig automatisch generiert wurden. Noch interessanter ist, dass man sieht, dass die manuellen Entwicklungskosten dieser Codes bis zu 1.079 Arbeitsmonate betragen und die Kosten bis zu 10,79 Millionen betragen.
Wings hat den ersten Schritt der Erkundung durch das Programm realisiert, indem es automatisch generiert wird, die erste Version ist derzeit veröffentlicht, interessierte Entwickler können sie direkt auf der Code-Cloud-Plattform herunterladen (https://gitee.com/teststars/wings_release), die kommerzielle Lizenzierung bietet eine einmonatige unbegrenzte Funktionserfahrung, man kann schnell die magische Kraft von Wings erleben, die C-Sprachversion von Wings unterstützt mehrere Plattformen, wie zum Beispiel Visual Studio. VXWORKS, GCC, QT usw. Wings wurde vom Nebulas-Testteam (www.teststar.cc) entworfen und entwickelt, und interessierte Entwickler können über die interaktive Plattform von Codecloud mit dem Nebulas-Testteam in Kontakt treten, um Designideen und Feedback zur Produktnutzung einzubringen (für die ausgezeichneten Vorschläge kann Nebulas seine kostenlose Nutzungsdauer um mindestens drei Monate verlängern). Wings besitzt ein starkes, zugrundeliegendes Gen, das die Softwarequalität erheblich verbessert, und in Zukunft wird Wings die Lesbarkeit automatisch geschriebener Programme (näher am Schreibniveau guter Programmierer) und die Unterstützung für die C++-Sprache tiefgreifend optimieren.





Vorhergehend:Entwicklung von Ethereum-Smart-Contracts über Nethereum und .NET
Nächster:Tencent-Cloud-Laufwerksausfall, der dazu führt, dass Nutzer "vollständig Daten verlieren"
Veröffentlicht am 06.08.2018 15:39:42 |
Verzichtserklärung:
Alle von Code Farmer Network veröffentlichten Software, Programmiermaterialien oder Artikel dienen ausschließlich Lern- und Forschungszwecken; Die oben genannten Inhalte dürfen nicht für kommerzielle oder illegale Zwecke verwendet werden, andernfalls tragen die Nutzer alle Konsequenzen. Die Informationen auf dieser Seite stammen aus dem Internet, und Urheberrechtsstreitigkeiten haben nichts mit dieser Seite zu tun. Sie müssen die oben genannten Inhalte innerhalb von 24 Stunden nach dem Download vollständig von Ihrem Computer löschen. Wenn Ihnen das Programm gefällt, unterstützen Sie bitte echte Software, kaufen Sie die Registrierung und erhalten Sie bessere echte Dienstleistungen. Falls es eine Verletzung gibt, kontaktieren Sie uns bitte per E-Mail.

Mail To:help@itsvse.com