Code analysieren und testen
Korrekte Verwendung von Datentypen und Typkonvertierungen
Verarbeitung von Zeichenfeldern
Code-Pushdown in ABAP SQL verwenden
Performance interner Tabellen verbessern
Implementieren von Berechtigungsprüfungen
Effektiven objektorientierten Code entwerfen
Ausnahmeklassen definieren und mit Ausnahmeklassen arbeiten
Dokumentation zum ABAP-Quelltext hinzufügen

Quelltexttests mit ABAP Unit implementieren

Objectives

After completing this lesson, you will be able to:
  • Implementieren Sie eine Testklasse.
  • Führen Sie einen ABAP-Unit-Test aus.

ABAP Unit

Modultests

Immer wenn Programmierer Code schreiben oder ändern, besteht die Chance, dass sie Programmierfehler verursachen. Daher sind Tests ein entscheidender Bestandteil jedes Entwicklungsprojekts.

In der modernen Programmierung ist der Quelltext in wiederverwendbare Klassen und Methoden strukturiert. Um potenzielle Programmierfehler zu erkennen und zu lokalisieren, ist ein gründlicher Test jeder Modularisierungseinheit erforderlich.

Sehen wir uns ein Beispiel an.

ABAP Unit - Modultests in ABAP implementieren

ABAP Unit ist eine Technik, mit der Sie Modultests mit der Sprache ABAP implementieren können. Sie können die Testausführung während der Entwicklung manuell auslösen, aber auch automatisch in größerem Umfang und regelmäßig.

ABAP-Unit-Tests werden als Methoden von speziell dafür vorgesehenen ABAP-Klassen implementiert. Diese Testmethoden dienen als Testskripte, mit denen der zu testende Code ausgeführt und die Ergebnisse ausgewertet werden können.

Fahren wir mit unserem Beispiel fort.

Es ist sehr wichtig, dass Sie, sobald die Tests vorhanden sind, sie jederzeit und beliebig oft durchführen können: vor der Erstauslieferung, nachdem Sie Änderungen am produktiven Code vorgenommen haben, oder zur Fehleranalyse, wenn ein Benutzer ein Problem meldet. Und die Ausführung der Tests kostet nur wenige Mausklicks.

Wichtige Funktionen von ABAP Unit

Modultestklassen

Der Zusatz FOR TESTING in der Klassendefinition unterscheidet eine Testklasse von einer gewöhnlichen ABAP-Klasse. Der Zusatz ist sowohl für lokale Klassen als auch für globale Klassen verfügbar.

Der Zusatz RISK LEVEL wird verwendet, um dem Test eine Risikostufe zuzuordnen. Wenn der Zusatz fehlt, wird standardmäßig die Risikostufe CRITICAL verwendet.

Zentrale Einstellungen auf Mandantenebene können die Ausführung von Tests mit einer bestimmten Risikostufe verhindern.

Die folgenden Risikostufenwerte sind verfügbar:

KRITISCH

Ein Test ändert Systemeinstellungen oder Customizing-Daten

GEFÄHRLICH

Ein Test ändert persistente Daten

HARMLOS

Ein Test ändert weder Systemeinstellungen noch persistente Daten

Der Zusatz DURATION gibt die erwartete Ausführungszeit an. Zentrale Einstellungen auf Mandantenebene können verwendet werden, um obere Laufzeitgrenzen für die drei Werte zu definieren.

Folgende Werte für die Dauer stehen zur Verfügung:

KURZ

Es wird eine unmerkliche Ausführungszeit von einigen Sekunden erwartet.

MITTEL

Es wird eine merkliche Ausführungszeit von rund einer Minute erwartet.

LANG

Es wird eine sehr spürbare Ausführungszeit von mehr als einer Minute erwartet.

Eine Testklasse kann zwei Arten von Methoden haben:

Testmethoden

Testmethoden werden mit dem Zusatz FOR TESTING hinter dem Methodennamen definiert. Jede Testmethode stellt einen Test dar. Das ABAP-Unit-Framework führt diesen Test durch, indem es die zugehörige Testmethode aufruft. Testmethoden dürfen keine Parameter haben.

Hilfsmethoden

Hilfsmethoden sind gewöhnliche Methoden der Testklasse. Sie werden nicht vom ABAP-Unit-Framework aufgerufen. Sie können Hilfsmethoden verwenden, um den Code Ihrer Testmethoden zu strukturieren oder wenn Sie dieselbe Funktion in mehreren Testmethoden wiederverwenden möchten. Hilfsmethoden können beliebig viele Parameter haben.

Notiz

Das ABAP-Unit-Framework kann alle Testmethoden aufrufen, auch wenn ihre Sichtbarkeit auf PRIVATE gesetzt ist. Eigentlich wird empfohlen, Testmethoden im privaten Bereich der Testklasse zu definieren, um sicherzustellen, dass die Testklassen nicht direkt im Quelltext aufgerufen werden.

Eine Testklasse sollte mindestens eine Testmethode enthalten. Eine Testmethode darf keine Parameter haben.

Bei der Ausführung der Tests einer Testklasse ruft das ABAP-Unit-Framework alle Tests in der Testklasse in unbestimmter Reihenfolge auf.

Wenn Sie lokale Testklassen in einer globalen ABAP-Klasse definieren, gibt es dafür einen dedizierten Ort. Während normale lokale Klassen auf der Registerkarte Lokale Typen definiert werden, sollten lokale Testklassen auf der Registerkarte Testklassen definiert werden.

Wie in der Abbildung dargestellt, bietet ADT die Quelltextvorlage testClass, um den Definitionsteil und den Implementierungsteil einer lokalen Testklasse zu generieren.

In der Demo „Definieren und Implementieren einer Testklasse" erfahren Sie, wie diese Quelltextvorlage aufgerufen wird.

Unit-Test-Implementierung

Serviceklasse CL_ABAP_UNIT_ASSERT

Im Allgemeinen hat die Implementierung einer Testmethode die folgende Struktur:

  1. Führen Sie den produktiven Quelltext unter Test aus.
  2. Ergebnis analysieren
  3. Unerwartetes Ergebnis an das ABAP-Unit-Framework melden

Für Schritt 3 stellt das ABAP-Unit-Framework die globale Serviceklasse CL_ABAP_UNIT_ASSERT bereit. Testmethoden rufen die statischen Methoden dieser Klasse auf, um Fehler zu melden und die Testausführung zu beeinflussen (z.B. einen oder mehrere Tests überspringen, weil Voraussetzungen nicht erfüllt sind).

  • Methode fail( ) meldet einen unbedingten Fehler. In der Regel ist ein Aufruf dieser Methode von einer Kontrollstruktur wie IF … ENDIF. oder TRY … ENDTRY umgeben, um sicherzustellen, dass sie nur unter einer Bedingung erreicht wird.
  • Methoden, die mit assert_ check für eine bestimmte Erwartung beginnen und einen Fehler melden, wenn diese Erwartung nicht erfüllt ist.
    • Die Methode assert_equals( ) vergleicht beispielsweise den Inhalt zweier Datenobjekte und meldet einen Fehler, wenn sie sich unterscheiden.
    • Die Methode assert_different( ) ist gleich, meldet aber einen Fehler, wenn die Datenobjekte den gleichen Inhalt haben.

Parameter der Methode failed( )

Sehen Sie sich das folgende Video an, um mehr zu erfahren.

Parameter von Assert-Methoden

Alle Assert-Methoden haben die optionalen Importing-Parameter MSG, LEVEL und QUIT, die immer die gleiche Bedeutung wie in method fail( ) haben.

Außerdem haben die meisten Assert-Methoden einen Importing-Parameter ACT für das zu verifizierende Datenobjekt.

Vergleichsmethoden wie assert_equals( ), assert_differents( ) usw. haben zusätzlich einen Parameter EXP für den erwarteten Wert.

Definieren und Implementieren einer Testklasse

In dieser Demo erfahren Sie, wie Sie eine lokale Testklasse anlegen und implementieren.

Modultestausführung

Es gibt zwei Möglichkeiten, ABAP-Unit-Tests auszuführen: interaktive Tests während der Entwicklung und Massentests mit dem ABAP Test Cockpit.

Sehen Sie sich das folgende Video an, um mehr über die Modultestausführung zu erfahren.

Ergebnisse eines ABAP-Unit-Tests

In ADT wird das neueste ABAP-Unit-Testergebnis in der ABAP-Unit-View angezeigt.

Die Zusammenfassung oben zeigt die Gesamtzahl der ausgeführten Testmethoden und die Gesamtdauer des Tests in Millisekunden an.

Verwenden Sie die Ankreuzfelder in der Zusammenfassung, um die Ergebnisanzeige zu filtern: Nur fehlgeschlagene Tests, nur Tests mit Warnungen, nur erfolgreich beendete Tests usw.

Das Ergebnis selbst wird als Baum mit den Repository-Objekten oben angezeigt, z.B. die globale Klasse. Die Knoten auf der zweiten Ebene repräsentieren die lokalen Testklassen, und die Endpunkte entsprechen Testmethoden. Die Symbole helfen Ihnen dabei, zwischen erfolgreichen Tests, Fehlern usw. zu unterscheiden.

Ein Linksklick wählt die Testmethode aus und zeigt die Details auf der rechten Seite an. Im Beispiel sehen Sie den Schweregrad (Kritischer Assertion-Fehler für Schweregrad mittel), den Wert des Parameters MSG ('Keine Ausnahme') und den Wert des Parameters DETAILS (der Text unter Details aufgeklappt).

Ausführen eines Modultests und Analysieren des Ergebnisses

In dieser Demo erfahren Sie, wie Sie die Modultests ausführen und die Ergebnisse analysieren.

Testaufbauten und Voraussetzungen

Methoden für Test-Fixtures

Manchmal benötigt ein Test eine bestimmte Konfiguration, bevor er ordnungsgemäß ausgeführt werden kann. Eine solche Testkonfiguration wird als Prüfvorrichtung bezeichnet. Ein Test-Fixture kann aus Testdaten, Testobjekten und Ressourcen bestehen.

Um Warenträger anzulegen und zu entfernen, können Sie zusätzliche Methoden in einer Testklasse implementieren. Diese Methoden haben vordefinierte Namen und werden bei Ausführung des Tests automatisch von der ABAP-Laufzeitumgebung aufgerufen.

Es gibt folgende Fixture-Methoden:

  • SETUP

    Diese Instanzmethode wird vor jedem Test der Testklasse aufgerufen. Verwenden Sie diese Methode für Warenträger, die Sie für jeden Test neu anlegen möchten.

  • TEARDOWN

    Diese Instanzmethode wird nach jedem Test der Testklasse aufgerufen. Verwenden Sie diese Methode, um die Änderungen rückgängig zu machen, die Sie in der Methode SETUP vorgenommen haben. Die Verwendung von TEARDOWN ist besonders wichtig, wenn das SETUP Änderungen an persistenten Daten (Systemkonfiguration, Customizing, Stammdaten usw.) vornimmt.

  • CLASS_SETUP

    Diese statische Methode wird einmal vor dem ersten Test der Testklasse ausgeführt. Verwenden Sie diese Methode nur für Warenträger, die zeitaufwendig sind und bei denen Sie sicher sind, dass die Einstellungen durch keine der Testmethoden geändert werden.

  • CLASS_TEARDOWN

    Diese statische Methode wird einmal nach dem letzten Test der Testklasse ausgeführt. Mit dieser Methode können Sie Änderungen rückgängig machen, die Sie in der Methode CLASS_SETUP vorgenommen haben.

Ablauflogik des ABAP Unit Tests

Diese Grafik veranschaulicht den Programmablauf von ABAP UNIT für eine einzelne Testklasse.

  • Zunächst wird die Testklasse in den Programmspeicher geladen. Wenn die Testklasse einen statischen Konstruktor enthält (statische Methode CLASS_CONSTRUCTOR), wird diese Methode wie gewohnt ausgeführt.
  • Anschließend werden die Tests dieser Testklasse durchgeführt. Jeder Test beginnt mit dem Anlegen einer Instanz der Testklasse. Wenn die Testklasse einen Instanzkonstruktor (Methode CONSTRUCTOR) enthält, wird er wie gewohnt ausgeführt.
  • Anschließend ruft das ABAP-Unit-Framework die Testmethode auf.
  • Nach dem Test wird die Instanz verworfen.

Wenn es mehr als eine Testmethode in der Testklasse gibt, wird für jeden Test eine neue Instanz angelegt.

Nach der letzten Testmethode ist die Verarbeitung dieser Testklasse abgeschlossen und das Framework fährt mit der nächsten Testklasse fort, falls vorhanden.

Phasenmodell des ABAP-Unit-Tests

Diese Grafik veranschaulicht das Phasenmodell für ABAP-Unit-Tests, d.h. die Zeitpunkte, zu denen das Framework Fixture-Methoden aufruft.

CLASS_SETUP wird nur einmal nach dem statischen Konstruktor und vor dem ersten Test aufgerufen.

CLASS_TEARDOWN wird aufgerufen, bevor das Framework mit der Verarbeitung der nächsten Testklasse beginnt.

SETUP wird nach dem Instanzkonstruktor und vor der Testausführung aufgerufen.

TEARDOWN wird aufgerufen, bevor das Framework die Testklasseninstanz verwirft.

Fehlende Voraussetzungen melden

Sie haben bereits gelernt, wie Sie Methoden der Serviceklasse CL_ABAP_UNIT_ASSERT verwenden, um fehlgeschlagene Tests zu melden.

Aber was sollen Sie im Falle einer fehlenden Voraussetzung tun, z.B. fehlende Berechtigungen? Oder eine Situation, in der eine SETUP-Methode Probleme bei der Vorbereitung des Tests hat?

Genau für diese Situationen enthält die Klasse CL_ABAP_UNIT_ASSERT eine Methode skip( ) und mehrere Methoden, die mit ASSUME_ beginnen.

Die Methoden funktionieren ähnlich wie fail( ) und die Assert-Methoden, sehen jedoch im UNIT-Testergebnis anders aus. Dies erleichtert die Unterscheidung zwischen Fehlern im getesteten Quelltext und Fehlern in der Systemkonfiguration oder im Testdesign.

Sehen wir uns ein Beispiel an:

Die Methode test_with_fail( ) ruft die Methode cl_abap_unit_assert=>fail( ) auf. Diese Methode wird als fehlgeschlagener Test gezählt, und das Fehler-Trace für diese Methode zeigt einen kritischen Assertion-Fehler vor dem Meldungstext an.

Die Methode test_with_skip( ) ruft die Methode cl_abap_unit_assert=>skip( ) auf. Diese Methode wird als abgebrochener Test gezählt, und das Fehler-Trace für diese Methode zeigt Fehlende Voraussetzungen vor dem Meldungstext an.

Notiz

Es gibt keine Parameter QUIT und LEVEL in den Methoden skip( ) und den angenommen Methoden. Bei fehlenden Voraussetzungen ist es nicht sinnvoll, den Test fortzusetzen, und wir unterscheiden nicht zwischen verschiedenen Schweregraden.

Ausführen eines komplexen Modultests mit SETUP

In dieser Demo erfahren Sie, wie Sie einen komplexeren Test ausführen, der eine Setup-Methode enthält.

ABAP-Unit-Test implementieren und ausführen

Sie stellen fest, dass bei der Ausgabe Ihres Quelltexts etwas nicht korrekt ist. Insbesondere der Termin für den nächsten verfügbaren Frachtflug scheint falsch zu sein. Sie definieren und implementieren einen ABAP-Unit-Test für die Methode find_cargo_flight der lokalen Klasse lcl_carrier, um dieses Problem weiter zu analysieren.

Vorlage:

  • /LRN/CL_S4D401_ATS_CHECKED (globale Klasse)

Lösung:

  • /LRN/CL_S4D401_ATS_UNIT_TEST (globale Klasse)

Aufgabe 1: Vorlage kopieren (optional)

Kopieren Sie die Vorlagenklasse /LRN/CL_S4D401_ATS_CHECKED. Wenn Sie die vorherige Übung abgeschlossen haben, können Sie diese Aufgabe überspringen und mit der Bearbeitung Ihrer Klasse ZCL_##_SOLUTION fortfahren.

Schritte

  1. Kopieren Sie die Klasse /LRN/CL_S4D401_ATS_CHECKED in eine Klasse in Ihrem eigenen Paket (Namensvorschlag: ZCL_##_SOLUTION, wobei ## für Ihre Gruppennummer steht).

    1. Klicken Sie im Project Explorer mit der rechten Maustaste auf die Klasse /LRN/CL_S4D401_ATS_CHECKED, um das Kontextmenü zu öffnen.

    2. Wählen Sie im Kontextmenü Duplizieren....

    3. Geben Sie den Namen Ihres Pakets in das Feld Package ein. Geben Sie im Feld Name den Namen ZCL_##_SOLUTION ein, wobei ## für Ihre Gruppennummer steht.

    4. Wählen Sie Next.

    5. Bestätigen Sie den Transportauftrag, und wählen Sie Finish.

  2. Aktivieren Sie die Kopie.

    1. Drücken Sie Strg + F3, um die Klasse zu aktivieren.

Aufgabe 2: Lokale Testklasse definieren

Definieren Sie in Ihrer globalen Klasse eine lokale Testklasse (Namensvorschlag: ltcl_find_flight). Definieren und implementieren Sie einen Test für die Methode find_cargo_flight der Klasse lcl_carrier.

Schritte

  1. Legen Sie eine lokale Testklasse ltcl_find_flight an.

    1. Navigieren Sie zur Registerkarte Testklassen (nicht vorhanden).

    2. Wenn die Drucktaste Testklassen anlegen... auf der Registerkarte angezeigt wird, wählen Sie sie aus.

    3. Positionieren Sie den Cursor in der ersten Quelltextzeile am Ende des Kommentars, und drücken Sie die Eingabetaste.

    4. Geben Sie in der neuen Quelltextzeile test ein, und drücken Sie Strg + Leertaste, um die Quelltextvervollständigung aufzurufen.

    5. Wählen Sie die Quelltextvorlage testClass - Test class (ABAP Unit), und drücken Sie die Eingabetaste.

    6. Während der vorläufige Klassenname ltcl_ hervorgehoben ist, geben Sie den vollständigen Klassennamen ltcl_find_flight ein.

  2. Verwenden Sie eine Schnellkorrektur, um die vordefinierte Testmethode umzubenennen (Namensvorschlag: test_find_cargo_flight).

    1. Klicken Sie mit der rechten Maustaste auf first_test, und wählen Sie Quickfix. Wählen Sie in der angezeigten Liste Umbenennen first_test. Während der Name hervorgehoben ist, geben Sie den neuen Namen test_find_cargo_flight ein.

  3. Implementieren Sie die Methode test_find_cargo_flight. Lesen der Schlüsselfelder (carrier_id, connection_id, flight_date) und der beiden Flughäfen (airport_from_id und airport_to_id) eines beliebigen Frachtflugs mit einer freien Kapazität von mindestens 1 kg aus der Datenbanktabelle /LRN/CARGOFLIGHT. Speichern Sie das Ergebnis in einem geeigneten Datenobjekt (Namensvorschlag: some_flight_data).

    Hinweis

    Die freie Kapazität wird als Differenz zwischen den beiden Tabellenfeldern maximum_load und actual_load berechnet.
    1. Passen Sie den Quelltext wie folgt an:

      ABAP
      12345678910
      METHOD test_find_cargo_flight. SELECT SINGLE FROM /lrn/cargoflight FIELDS carrier_id, connection_id, flight_date, airport_from_id, airport_to_id WHERE maximum_load - actual_load >= 1 INTO @DATA(some_flight_data). ENDMETHOD.
  4. Wenn in der Tabelle /LRN/CARGOFLIGHT kein passender Datensatz vorhanden ist, melden Sie den Test als fehlgeschlagen.

    1. Passen Sie den Quelltext wie folgt an:

      ABAP
      1234567891011121314
      METHOD test_find_cargo_flight. SELECT SINGLE FROM /lrn/cargoflight FIELDS carrier_id, connection_id, flight_date, airport_from_id, airport_to_id WHERE maximum_load - actual_load >= 1 INTO @DATA(some_flight_data). IF sy-subrc <> 0. cl_abap_unit_assert=>fail( `No suitable data in table /LRN/CARGOFLIGHT` ). ENDIF. ENDMETHOD.
  5. Wenn Sie einen passenden Datensatz aus der Tabelle /LRN/CARGOFLIGHT lesen konnten, verwenden Sie den Wert carrier_id dieses Datensatzes, um eine Instanz der Klasse lcl_carrier anzulegen (Namensvorschlag für die Referenz: the_carrier).

    1. Fügen Sie am Ende der Methode den folgenden Quelltext hinzu:

      ABAP
      12
      DATA(the_carrier) = NEW lcl_carrier( i_carrier_id = some_flight_data-carrier_id ).
  6. Wenn der Konstruktor der Klasse lcl_carrier eine Ausnahme auslöst, melden Sie den Test als failed.

    1. Passen Sie den Quelltext wie folgt an:

      ABAP
      123456
      TRY. DATA(the_carrier) = NEW lcl_carrier( i_carrier_id = some_flight_data-carrier_id ). CATCH cx_abap_invalid_value. cl_abap_unit_assert=>fail( `Unable to instantiate lcl_carrier` ). ENDTRY.
  7. Wenn die Instanziierung erfolgreich war, rufen Sie die Methode find_cargo_flight für die Instanz von lcl_carrier auf. Verwenden Sie die Flughäfen und das Flugdatum des ausgewählten Frachtflugs als Eingabe. Setzen Sie das minimale freie Frachtgut (Parameter i_Freight) auf 1. Speichern Sie das Ergebnis in geeigneten Datenobjekten (Namensvorschläge: flight und days_later).

    1. Fügen Sie am Ende der Methode den folgenden Quelltext hinzu:

      ABAP
      12345678910
      the_carrier->find_cargo_flight( EXPORTING i_airport_from_id = some_flight_data-airport_from_id i_airport_to_id = some_flight_data-airport_to_id i_from_date = some_flight_data-flight_date i_cargo = 1 IMPORTING e_flight = data(flight) e_days_later = data(days_later) ).
  8. Analysieren Sie die Ausgabe der Methode. Rufen Sie geeignete Assert-Methoden auf, um sicherzustellen, dass der Parameter e_flight eine gültige Objektreferenz und der Parameter e_days_later null zurückgibt.

    Notiz

    Dass der Parameter e_days_later den Wert Null zurückgibt, bedeutet, dass die Methode direkt am gewünschten Tag einen passenden Flug gefunden hat. Dies erwarten wir, wenn wir die Eigenschaften eines vorhandenen Flugs als Eingabe verwenden.
    1. Fügen Sie am Ende der Methode den folgenden Code hinzu:

      ABAP
      12345678910
      cl_abap_unit_assert=>assert_bound( act = flight msg = `Method find_cargo_flight does not return a result` ). cl_abap_unit_assert=>assert_equals( act = days_later exp = 0 msg = `Method find_cargo_flight returns wrong result` ).
  9. Aktivieren Sie Ihre Klasse.

    1. Drücken Sie Strg + F3, um die Klasse zu aktivieren.

Aufgabe 3: Modultest ausführen

Führen Sie den Modultest aus. Analysieren Sie das Ergebnis und passen Sie die Implementierung der Methode find_cargo_flight an, wenn der Test einen Fehler zurückgibt.

Achtung

Wenn der Modultest mit der Meldung Maximale zulässige Dauer von 60 Sekunden überschritten abgebrochen wird, erhöhen Sie die erwartete Ausführungszeit. Ändern Sie dazu den Zusatz DURATION in der Anweisung CLASS … DEFINITION Ihrer Testklasse von DURATION SHORT in DURATION MEDIUM.

Schritte

  1. Führen Sie die Modultests in Ihrer globalen Klasse ZCL_##_SOLUTION aus.

    1. Klicken Sie im Project Explorer mit der rechten Maustaste auf die Klasse ZCL_##_SOLUTION, und wählen Sie Run AsABAP Unit Test.

  2. Wenn der Test abgeschlossen ist, analysieren Sie das Ergebnis in der ABAP-Unit-Sicht.

    1. Wenn sie noch nicht angezeigt wird, klicken Sie im unteren Bildbereich auf die Registerkarte ABAP Unit.

    2. Neben dem Symbol Fehler sollte der Wert 1 angezeigt werden.

    3. Wählen Sie im Baum den Testmethodennamen ( zcl_##_solutionltcl_find_flighttest_find_cargo_flight ), um die Details des Fehlers anzuzeigen.

  3. Analysieren Sie den Quelltext der Methode find_cargo_flight, und beheben Sie den Fehler.

    1. Doppelklicken Sie im Baum auf test_find_cargo_flight, um zur Implementierung der Testmethode zu navigieren.

    2. Blättern Sie nach unten zum Aufruf der Methode find_cargo_flight. Positionieren Sie den Cursor auf dem Methodennamen, und drücken Sie F3, um zur zugehörigen Implementierung zu navigieren.

    3. Suchen Sie die Berechnung von days_later. Hier wird das Datum des Flugs von dem angegebenen Datum abgezogen. Dies sollte umgekehrt sein.

    4. Um den Fehler zu beheben, fügen Sie vor dieser Anweisung ein Kommentarzeichen hinzu:

      ABAP
      1
      * DATA(days_later) = i_from_date - flight->flight_date.

      Ersetzen Sie ihn durch den folgenden Quelltext:

      ABAP
      1
      DATA(days_later) = flight->flight_date - i_from_date.
  4. Aktivieren Sie Ihre Klasse, und führen Sie den Modultest erneut aus, um zu bestätigen, dass der Fehler nun nicht mehr auftritt.

    1. Drücken Sie Strg + F3, um die Klasse zu aktivieren.

    2. Wählen Sie in der Symbolleiste auf der Registerkarte ABAP Unit die Option Tests erneut ausführen.

    3. Stellen Sie sicher, dass der Test nun null Fehler anzeigt.

  5. Führen Sie Ihre globale Klasse als Konsolen-App aus, um sicherzustellen, dass das Datum des nächsten verfügbaren Frachtflugs in naher Zukunft liegt.

Aufgabe 4: Methode CLASS_SETUP implementieren (optional)

Sie möchten Ihrer Testklasse weitere Testmethoden hinzufügen, die alle eine Instanz von lcl_carrier benötigen. Um die Performance Ihrer Tests zu verbessern, verschieben Sie die zeitaufwendige Instanziierung der Klasse lcl_carrier in die Methode class_setup, da diese Methode nur einmal für alle Tests der Testklasse ausgeführt wird.

Schritte

  1. Definieren Sie in Ihrer Testklasse ltcl_find_flight eine private statische Methode class_setup (ohne Parameter) und fügen Sie die Methodenimplementierung per Quickfix hinzu.

    1. Fügen Sie den folgenden Quelltext zum privaten Bereich der Klasse ltcl_find_flight hinzu.

      ABAP
      1
      CLASS-METHODS class_setup.
    2. Klicken Sie mit der rechten Maustaste auf class_setup, und wählen Sie Quickfix.

    3. Wählen Sie in der Vorschlagsliste Implementierung für class_setup hinzufügen.

  2. Deklarieren Sie in der Testklasse ein privates statisches Attribut, in dem Sie eine Referenz auf eine Instanz der Klasse lcl_carrier (Namensvorschlag: the_carrier) hinterlegen können.

    1. Fügen Sie den folgenden Quelltext zum privaten Bereich der Klasse ltcl_find_flight hinzu.

      ABAP
      1
      CLASS-DATA the_carrier TYPE REF TO lcl_carrier.
  3. Deklarieren Sie ein privates statisches Attribut, in dem Sie einen Datensatz aus der Datenbanktabelle /LRN/CARGOFLIGHT speichern können (Namensvorschlag: some_flight_data).

    1. Fügen Sie den folgenden Quelltext zum privaten Bereich der Klasse ltcl_find_flight hinzu.

      ABAP
      1
      CLASS-DATA some_flight_data TYPE /lrn/cargoflight.
  4. Verschieben Sie die SELECT-Anweisung und die Instanziierung der Klasse lcl_carrier von der Methode test_find_cargo_flight in die Methode class_setup. Hinterlegen Sie die Daten von der Datenbank im statischen Attribut some_flight_data und die Referenz auf die Instanz von lcl_carrier im statischen Attribut the_carrier.

    1. Schneiden Sie den folgenden Quelltext aus der Implementierung der Methode test_find_cargo_flight aus, und fügen Sie ihn in die Implementierung der Methode class_setup ein.

      ABAP
      1234567891011121314151617
      SELECT SINGLE FROM /lrn/cargoflight FIELDS carrier_id, connection_id, flight_date, airport_from_id, airport_to_id WHERE maximum_load - actual_load >= 1 INTO @DATA(some_flight_data). IF sy-subrc <> 0. cl_abap_unit_assert=>fail( `No suitable data in table /LRN/CARGOFLIGHT` ). ENDIF. TRY. DATA(the_carrier) = NEW lcl_carrier( i_carrier_id = some_flight_data-carrier_id ). CATCH cx_abap_invalid_value. cl_abap_unit_assert=>fail( `Unable to instantiate lcl_carrier` ). ENDTRY.
    2. Ersetzen Sie INTO @DATA(some_flight_data) durch INTO CORRESPONDING FIELDS OF @some_flight_data.

    3. Ersetzen Sie DATA(the_carrier) durch the_carrier.

    4. Nun sollte der Quelltext der Methode class_setup wie folgt aussehen:

      ABAP
      123456789101112131415161718192021
      METHOD class_setup. SELECT SINGLE FROM /lrn/cargoflight FIELDS carrier_id, connection_id, flight_date, airport_from_id, airport_to_id WHERE maximum_load - actual_load >= 1 INTO CORRESPONDING FIELDS OF @some_flight_data. IF sy-subrc <> 0. cl_abap_unit_assert=>fail( `No suitable data in table /LRN/CARGOFLIGHT` ). ENDIF. TRY. the_carrier = NEW lcl_carrier( i_carrier_id = some_flight_data-carrier_id ). CATCH cx_abap_invalid_value. cl_abap_unit_assert=>fail( `Unable to instantiate lcl_carrier` ). ENDTRY. ENDMETHOD.
  5. Aktivieren Sie die Klasse, und führen Sie den Modultest erneut aus, um sicherzustellen, dass er weiterhin funktioniert.

    1. Drücken Sie Strg + F3, um die Klasse zu aktivieren.

    2. Führen Sie den Modultest wie bisher aus.