5. April 2018 in code IT

ABAP Debugger Erweiterung oder wie man die Testdatenerstellung beschleunigen kann

von Alexander Geppart

In unserer neuen Rubrik <code> IT möchten wir euch heute zwei Open Source Helfer zum Erstellen von Testdaten für ABAP Unit Tests vorstellen. Denn unabhängig davon, ob wir den Test First oder der Test Last Ansatz nutzen, müssen die Testdaten für Unittests aufbereitet werden. Dieser Prozess kann abhängig von den Testdaten sehr zeitintensiv sein. Genau aus diesem Grund haben wir zwei ABAP Debugger Erweiterungen geschrieben, die dieses Problem lösen sollen.

Zum Tabellendatenexport

Zum Strukturdatenenexport

Teil 2, Neuheiten

Stellt euch nur einmal vor die Signatur der zu testenden Methode hätte einen obligatorischen Importing-Parameter für eine Tabelle von Flügen. Diese Tabelle muss n Zeilen enthalten um einen Fehler im Coding zu reproduzieren. Aktuell wären wir gezwungen jede Zeile und jede Feld-Wert Kombination dieser Tabelle manuell aufzubereiten, um dies zu erhalten:

lt_flights = VALUE #(
( carrid = 'AA' fldate = '20170208' price = '422.94' currency = 'USD' )
( carrid = 'LH' fldate = '20170307' price = '431.94' currency = 'USD' )
...

Oftmals können die Testdaten zwar bereits beim ersten Debuggen eines Fehlers im Debugger angesehen werden. Jedoch wäre es deutlich hilfreicher eine Möglichkeit zu nutzen, die diese Daten aus dem Debugger in einer ABAP Coding freundlichen Art und Weise exportieren kann.

Features

Die erste Erweiterung, die wir euch vorstellen möchten, ist für den Tabellenexport. Die Zweite für den Strukturdatenexport, da beide Prozesse ohne eine Erweiterung extrem zeitaufwendig sein können.

Tabellendaten Export

In diesem Schritt zeige ich euch, wie ihr die Daten einer internen Tabelle ganz einfach aus dem Debugger exportieren könnt. Dafür müsst ihr bei internen Tabellen zuerst im Debugger in die Ansicht „Tabellen“ wechseln. Im nächsten Schritt wechselt ihr dann in die ALV Ansicht. Dort findet ihr nun den Knopf „Data for ABAP View“:

Interne Tabelle aus dem Debugger exportieren

Durch den Klick darauf öffnet sich ein Popup, welches die Umbruchstelle für die generierten Daten abfragt:

Interne Tabelle aus dem Debugger exportieren

Anschließend werden die Daten der internen Tabelle entsprechend eurer Angaben aufbereitet angezeigt. Diese Daten könnt ihr nun per „Copy and Paste“ ganz einfach verwenden:

Data for Abap view

Strukturdaten Export

Im zweiten Schritt geht es um den Strukturdaten Export. Dafür müsst ihr euch im Debugger die Struktur anzeigen lassen. Klickt einfach auf den Reiter „Strukturen“. Dort kommt ihr nun mit einem weiteren Klick auf „Toolservices“, wie im folgenden Bild rot markiert, wieder zu der Option „Data for ABAP View“.

Strukturdaten Export

Strukturdaten Export

Von diesem Schritt geht es, wie bereits bei der ersten Erweiterung beschrieben, weiter. Durch den Klick auf „Data for ABAP View“ öffnet sich auch hier wieder ein Popup, welches die Umbruchstelle für die generierten Daten abfragt. Anschließend werden die Daten entsprechend eurer Angaben aufbereitet angezeigt und können per Copy and Paste verwendet werden.

Implementierungsdetails

Wir haben versucht den Debugger durch einen leichtgewichtigen Weg entsprechend zu erweitern. Leichtgewichtig bedeutet in diesem Fall, das Ziel ohne Modifikation sowie Copy&Pasting von Funktionsgruppen zu erreichen. Leider konnten wir keinen passenden UserExit im SAP Coding des Debuggers finden. Aus diesem Grund entschieden wir uns dafür das Enhancement Framework und dessen implizite Erweiterungsmöglichkeiten zu verwenden.

Im Coding unserer Lösung findet ihr die zwei besprochenen Erweiterungen für Tabellendaten (Erweiterung zenh_table_values) und Strukturdaten (Erweiterung z_struc_v_build_services_menue). Passend zu den beiden Erweiterungen ist jeweils eine ABAP Klasse für Tabellendaten (Klasse ZCL_DEBUG_DATA_VIEW_TABLE_ENH) und Strukturdaten (Klasse ZCL_DEBUG_DATA_VIEW_STRUC_ENH) vorhanden.

Weiterhin gibt es dort auch einen ABAP Report Z_DEBUGGER_DATA_VIEW_EXT_DEMO mit dem ihr die beschriebene Funktionalität leicht testen könnt. Dazu müsst ihr lediglich im Report zwei Breakpoints platzieren und den Report laufen lassen. Die aktuelle Lösung basiert stark auf den Klassen CL_DEMO_OUTPUT und CL_DEMO_INPUT. Diese beiden Klassen sind von SAP als „Nur für Demonstrationszwecke“ markiert und sollte nicht in produktiven Systemen eingesetzt werden. Da die Tests in Entwicklungsumgebungen geschrieben und maximal in Testumgebungen laufen gelassen werden, sind auch keine produktiven Systeme davon betroffen.
Wir planen darüber hinaus euch auch eine eigene ABAP Dynpros anzubieten, um die Funktionalität von CL_DEMO_OUTPUT und CL_DEMO_INPUT bereitzustellen.

Voraussetzungen

Die Lösung basiert auf dem neuen VALUE Operator. Aus diesem Grund wird mindestens die ABAP Version 7.40 benötigt. Der Demo ABAP Report verwendet die DB Tabelle SFLIGHT um die Daten zu selektieren. Wenn diese Tabelle im System nicht befüllt wird, kann der Report auch nicht zu Demo Zwecken verwendet werden. In diesem Fall kann die Funktionalität mit jedem ähnlichen Vorgehen getestet werden.

Installation

Das gesamte Coding findet ihr hier.
Um es in eurem System zu importieren, sollte abapGit verwendet werden.
Pull Requests und Issues in GitHub sind willkommen.

Mögliche Erweiterungen der aktuellen Lösung

– SUPPORT für ältere ABAP Versionen
– UI – positive Liste für Felder die gemappt/angezeigt werden sollen
– UI – negative Liste für Felder die ignoriert werden sollen (z.B. Mandant)
– Ersetzen von CL_DEMO_OUTPUT
– Eclipse Plugin mit ähnlicher Funktionalität

 

TEIL 2, DIE WEITERENTWICKLUNG

Im ersten Part habe ich euch zwei Open Source Helfer zum Erstellen von Testdaten für ABAP Unit Tests vorgestellt, um euch durch diese, die Aufbereitung von Testdaten für Unittests zu vereinfachen. Jetzt möchte ich Euch noch ein paar Neuheiten vorstellen.

Fast ein Jahr nach der Veröffentlichung von Teil 1 meiner ABAP Debugger Erweiterung, hat sich durch kontinuierliches Refactoring einiges verändert. Durch den Fokus auf das Single Responsibility Prinzip hat sich zwar die Anzahl der Klassen in der Implementierung etwas vergrößert, jedoch nur zum Vorteil der Wiederverwendbarkeit und besseren Lesbarkeit.

Der nächste Schritt war die Anpassung der eigentlichen Integration in das Debugging Framework – wobei ich vor allem noch einiges über das ABAP asXML Format Format mitnehmen konnte.  Diese Umstellung war essentiell, um auch bei komplexen Datenkonstrukten alle Daten des Konstrukts zu erhalten und somit nicht nur die oberflächlichen Beschreibungen nutzen zu können. Denn nur bei Verfügbarkeit aller Daten sind ebenfalls Absprünge in der Formatierung zwischen Struktur und interner Tabelle und umgekehrt überhaupt möglich. Doch mehr dazu im letzten Abschnitt.

Eines meiner größeren Ziele war die Formatierung des Value # Konstrukts, durch den Einbau von Umbrüchen und Leerzeichen, von der syntaktisch korrekten Aufbereitung des Konstrukts zu entkoppeln. Diese Formatierung führte mich jedoch an die Grenze der ABAP RegEx Möglichkeiten, da durch die fehlende Unterstützung von Look-Behind in ABAP (bzw. in POSIX) eine ausschließliche Formatierung über RegEx nicht möglich war. Ein Ansatz, den ich aus diesen Gründen schnell verworfen habe. Eine Alternative musste her; diese fand ich jedoch schnell in den Funktionen der Klasse CL_ABAP_STRING_C_READER.

Für den Anwender meiner ABAP Debugger Erweiterung hat sich zusätzlich eine entscheidende Funktion verändert. In der neuen Version gibt es keine Abfrage mehr über die maximale Länge der Zeile.  An dieser Stelle wird nun eine Erweiterungsmöglichkeit angeboten, um seine eigene Pretty-Printer Implementierungen zu schreiben. Dazu ist es nötig, dass eine neue Klasse das Interface ZIF_OP_VALUE_PRETTY_PRINTER implementiert. Weiterhin sollte diese Klasse per Transaktion  SM30 in der Tabelle ZTOP_DVE_CUST einem Anwender zugeordnet werden (siehe Abbildung 1). Im Standard Fall wird die mitgelieferte Klasse ZCL_OP_VALUE_PRETTY_PRINTER automatisch zur Aufbereitung verwendet.
Abbildung 1: Zuordnung Pretty-Printer Klasse zu Anwender

Eine weitere und zentrale Verbesserung betrifft die Darstellung von komplexen Datenkonstrukten (itab in itab, itab in Struktur, etc.), wie oben bereits angesprochen. Durch die neue Integration mittels asXML ist es mir gelungen diese Konstrukte nun auch darstellen zu können. Dies bedeutet, dass man neben den bereits verfügbaren Möglichkeiten, Strukturen und Tabellen einzeln darzustellen, nun auch folgende zusätzliche Möglichkeiten der Aufbereitung vorhanden sind:

Abbildung 1: itab in Struktur und  itab in itab Darstellung 

Jetzt dürft ihr wieder ans Werk. Dazu findet ihr den neuesten Stand des Codings hier. Dieser ist wie immer per ABAPGit in das eigene SAP System übertragbar. Bei Problemen oder Fragen zur neuen Version der ABAP Debugger Erweiterung, kann gern hier ein neues Issue aufgemacht werden. 


Das wird dich sicherlich auch interessieren:

MicroService Toolbox als Container-Application
SAP Lumira SDK Extensions mit modernen JavaScript-Tools entwickeln

 

Zurück zur Übersicht