SAPUI5 Unit Testing

Brandeis Consulting & Cadao

Unittests

Definition

Ein Unit Test ist ein Stück Code, das einen kleinen, spezifischen Teil Ihres Codes (eine 'Unit') isoliert aufruft und überprüft, ob er sich wie erwartet verhält.

Vorteile

  • Unabhängig von externen Faktoren oder anderen Units
  • wiederholt ausführbar
  • automatisiert
  • schnelles Feedback

Kleinste testbare Einheiten

  • Funktionen
  • Methoden
  • Klassen
Brandeis Consulting & Cadao

Unittests in SAPUI5

Testumgebung

Das Unittest Framework braucht eine eigene HTML-Seite in unserer Anwendung! Dort wird die Ausführung der Unittests angezeigt. In ABAP übernimmt die Entwicklungsumgebung (ADT/SE80) diese Aufgabe!

Artefakte hierfür:

  • HTML-Seite, die die entsprechenden QUnit Bibliotheken lädt
  • JavaScript Datei, die dann die zu testenden Scripts lädt und ausführt

Brandeis Consulting & Cadao

Download Übung OpenUI5

Wir wollen nun unsere eigenen Unit Tests schreiben.
Als Grundlage dient das SAP-Beispiel aus dem Tutorial Step 26.

  • Download des Beispiels per Zip Link
  • oben rechts auf den Donwload Button klicken
Brandeis Consulting & Cadao

Importieren der Übung im BAS

  • Wir öffnen das BAS und vergewissern uns, dass wir im richtigen Verzeichnis sind /home/user/projects
  • Über den Burger Button (Burger-Button) -> Terminal -> New Terminal ein Terminal Fenster öffnen und folgendes eingeben:
cd /home/user/projects
  • Über den Burger Button (Burger-Button) -> File -> Import Project das heruntergeladene ZIP File auswählen

Brandeis Consulting & Cadao

Installieren der Übung

Installation und Starten der Anwendung

  • Das Terminal Fenster mit dem Cursor fokussieren und folgende Befehle eingeben:
> cd sap.m.tutorial.walkthrough.26

> npm install

> npm start

neue App im Browserfenster

  • Nun sollte sich im Browser ein neues Fenster öffnen
Brandeis Consulting & Cadao

Übung Unittest anlegen (1)

  1. Wir legen innerhalb des Test Ordners den Ordner unit an
  2. In diesem Ordenr legen wir den Ordner model an
  3. Darin legen wir eine neue Datei formatter.js an

  • Wir können beide Ordner durch folgende Eingabe erstellen: unit/model

  • Rechtsklick auf den neuen Ordner model. Nun New File und formatter.js eingeben

  • So sollte nun der Verzeichnisbaum aussehen

Brandeis Consulting & Cadao

Übung Unittest anlegen (2)

  • Die neue Datei formatter.js mit folgenden Code füllen:
sap.ui.define([
	"ui5/walkthrough/model/formatter",
	"sap/ui/model/resource/ResourceModel",
], (formatter, ResourceModel) => {
	"use strict";

	QUnit.module("Formatting functions", {});

	QUnit.test("Should return the translated texts", (assert) => {
        const oResourceModel = new ResourceModel({
            bundleUrl: sap.ui.require.toUrl("ui5/walkthrough/i18n/i18n.properties"),
            supportedLocales: [
                ""
            ],
            fallbackLocale: ""
        });

        const oControllerMock = {
            getOwnerComponent() {
                return {
                    getModel() {
                        return oResourceModel;
                    }
                };
            }
        };

        const fnIsolatedFormatter = formatter.statusText.bind(oControllerMock);

        // Assert
        assert.strictEqual(fnIsolatedFormatter("A"), "New", "The long text for Status A is correct");
        assert.strictEqual(fnIsolatedFormatter("B"), "In Progress", "The long text for Status B is correct");
        assert.strictEqual(fnIsolatedFormatter("C"), "Done", "The long text for Status C is correct");
        assert.strictEqual(fnIsolatedFormatter("Foo"), "Foo", "The long text for Status Foo is correct");
	});
});
Brandeis Consulting & Cadao

Übung Unittest anlegen (3)

  • Wir legen innerhalb des unit Ordners die Datei unitTests.qunit.html an
  • Wir fügen dort folgenden Code ein:
<!DOCTYPE html>
<html>
<head>
	<title>Unit tests for UI5 Walkthrough</title>
	<meta charset="utf-8">

	<script
		id="sap-ui-bootstrap"
		src="../../resources/sap-ui-core.js"
		data-sap-ui-resource-roots='{
			"ui5.walkthrough": "../../"
		}'
		data-sap-ui-async="true">
	</script>

	<link rel="stylesheet" type="text/css" href="../../resources/sap/ui/thirdparty/qunit-2.css">

	<script src="../../resources/sap/ui/thirdparty/qunit-2.js"></script>
	<script src="../../resources/sap/ui/qunit/qunit-junit.js"></script>

	<script src="unitTests.qunit.js"></script>
</head>
<body>
	<div id="qunit"/>
	<div id="qunit-fixture"/>
</body>
</html>
Brandeis Consulting & Cadao

Übung Unittest anlegen (4)

  • Wir legen innerhalb des unit Ordners die Datei unitTests.qunit.js an
  • Wir fügen dort folgenden Code ein:
QUnit.config.autostart = false;

sap.ui.require(["sap/ui/core/Core"], async(Core) => {
	"use strict";

	await Core.ready();

	sap.ui.require([
		"ui5/walkthrough/test/unit/model/formatter"
	], () => {
		QUnit.start();
	});
});
  • So sollte der Verzteichnisbaum nun aussehen:
Brandeis Consulting & Cadao

Übung Unittest anlegen (5)

  • Nun öffnen wir den Browser und ändern den letzten Teil der Adressezeile von *..*/test/mockServer.html zu *..*/test/unit/unitTests.qunit.html
  • Durch Klicken auf Should return the translated texts werden die durchgeführten Tests angezeigt, die in der Datei webapp/test/unit/model/formatter.js definiert sind.
Brandeis Consulting & Cadao

QUnit Erläuterungen

  • QUnit.module „gruppiert“ alle nachfolgenden Tests unter dem angegebenen Namen.
QUnit.module("Eigene Tests", {}); 
  • QUnit.test deklariert den eigentlichen Unit Test
QUnit.test("Should return the translated texts", (assert) => {... 
  • Mit assert können Testbedingungen deklariert werden. Eine Übersicht über alle möglichen Assertion-Methoden findet sich hier
assert.strictEqual(fnIsolatedFormatter("A"), "New", "The long text for Status A is correct");... 
Brandeis Consulting & Cadao

Weitere Assertions

Es gibt noch jede Menge weitere Assertions im QUnit Framework, siehe https://qunitjs.com/api/assert/. Allerdings funktionieren nicht all Funktionen wie gewünscht.

Negativ-Beispiel: assert.false()

Es ist gut möglich, dass das an dem verwendeten Versionsstand liegt

Brandeis Consulting & Cadao

Übung mit eigenen Tests erweitern (1).

  • Wir erweitern die Datei test/unit/model/formatter.js nach den asserts nach der Zeile }); mit folgendem Code:
    QUnit.module("Eigene Tests", {});

    QUnit.test("Demonstration von Assert-Funktionen", function (assert) {
        // Gleichheit (ohne Typ-Prüfung)
        assert.equal(5, "5", "equal: Werte sind gleich (implizite Typkonvertierung)");

        // Strikte Gleichheit (mit Typ-Prüfung)
        assert.strictEqual(5, 5, "strictEqual: Werte und Typen sind gleich");

        // Ungleichheit
        assert.notEqual(5, 6, "notEqual: Werte sind nicht gleich");

        // Wahrheitswert
        assert.ok(true, "ok: Der Wert ist wahr");

        // Tiefe Gleichheit für Objekte/Arrays
        assert.deepEqual({ a: 1, b: 2 }, { a: 1, b: 2 }, "deepEqual: Objekte sind strukturell gleich");

        // Prüfung auf Typ
        assert.propEqual({ value: "test" }, { value: "test" }, "propEqual: Objekte haben gleiche Eigenschaften");

        // Prüfung auf geworfene Ausnahme
        assert.throws(
            function () { throw new Error("Test"); },
            Error,
            "throws: Funktion wirft erwartete Ausnahme"
        );

        // Fehler provozieren
        var v_now = "1.9.2024 15:00:00";
        assert.equal(v_now, new Date().toLocaleString(), "Datum ist gleich");

        // Prüfung auf erwartete Anzahl von Assertions
        assert.expect(8);
    });
Brandeis Consulting & Cadao

Übung mit eigenen Tests erweitern (2).

  • Wir werden die Tests jetzt erneut durchführen, indem wir die Browserseite aktualisieren.
  • Wir sehen nun dass der 8. Test in der Gruppe Eigene Tests fehlgeshlagen ist.
Brandeis Consulting & Cadao

Best Practices Unit Tests

  • Tests isoliert halten
  • Mocks für externe Abhängigkeiten verwenden
  • Aussagekräftige Testbeschreibungen
  • Abdeckung wichtiger Geschäftslogik
Brandeis Consulting & Cadao