SAPUI5 OPA5

One Page Accetpance Tests

Brandeis Consulting & Cadao

Integration Testing mit One Page Acceptance Tests (OPA)

Was ist OPA (One Page Acceptance)?

OPA ist ein Testframework für automatisierte UI-Tests in Single-Page-Anwendungen

Was ist OPA5?

  • OPA5 ist eine Erweiterung von OPA speziell für SAPUI5
  • Bietet zusätzliche Funktionen für UI5-spezifische Elemente
  • OPA5 kann nahtlos mit QUnit-Tests kombiniert werden
  • Einfache Integration in bestehende UI5-Projekte
  • Ermöglicht das Testen von UI5 Controls und Interaktionen

Vorteile gegenüber anderen Testmethoden

  • Keine externe Abhängigkeiten (wie Selenium)
  • Läuft im Browser, ermöglicht schnelles Feedback
Brandeis Consulting & Cadao

Demo / Übung

Die Demo-Apps im SAPUI5 Demo Kit sind mit OPA Tests ausgestattet:

https://sapui5.hana.ondemand.com/sdk/#/demoapps

Schaut Euch zunächst die App Browse Orders an. Danach startet die Integration Tests.

Brandeis Consulting & Cadao

Übung OPA Test anlegen (1)

  1. Wir legen innerhalb des Test Ordners den Ordner integration an
  2. Darin legen wir eine neue Datei an NavigationJourney.js an

  • Wir können Ordner und das Dokument in einem Zug anglegen
    - Rechtsklick auf den test Ordner. Nun New File und integration/NavigationJourney.js eingeben

  • Der Ordner integration wurde automatisch angelegt. Der Verzeichnisbaum sollte nun so ausshen.
Brandeis Consulting & Cadao

Übung OPA Test anlegen (2)

  • Wir fügen in dem Dokument NavigationJourney.js folgenden Code ein:
sap.ui.define([
	"sap/ui/test/opaQunit",
	"./pages/App"
], (opaTest) => {
	"use strict";

	QUnit.module("Navigation");

	opaTest("Should open the Hello dialog", (Given, When, Then) => {
		// Arrangements
		Given.iStartMyUIComponent({
			componentConfig: {
				name: "ui5.walkthrough"
			}
		});

		//Actions
		When.onTheAppPage.iPressTheSayHelloWithDialogButton();

		// Assertions
		Then.onTheAppPage.iShouldSeeTheHelloDialog();

		// Cleanup
		Then.iTeardownMyApp();
	});
});
Brandeis Consulting & Cadao

Übung OPA Test anlegen (3)

  1. Wir legen innerhalb des integration Ordners den Ordner pages an
  2. Darin legen wir eine neue Datei an App.js an
  • Wir können wieder Ordner und das Dokument in einem Zug anglegen
    - Rechtsklick auf den integration Ordner. Nun New File und pages/App.js eingeben

Brandeis Consulting & Cadao

Übung OPA Test anlegen (4)

  • Wir fügen in dem Dokument pages/App.js folgenden Code ein:
sap.ui.define([
	"sap/ui/test/Opa5",
	"sap/ui/test/actions/Press"
], (Opa5, Press) => {
	"use strict";

	const sViewName = "ui5.walkthrough.view.HelloPanel";

	Opa5.createPageObjects({
		onTheAppPage: {
			actions: {
				iPressTheSayHelloWithDialogButton() {
					return this.waitFor({
						id: "helloDialogButton",
						viewName: sViewName,
						actions: new Press(),
						errorMessage: "Did not find the 'Say Hello With Dialog' button on the HelloPanel view"
					});
				}
			},

			assertions: {
				iShouldSeeTheHelloDialog() {
					return this.waitFor({
						controlType: "sap.m.Dialog",
						success() {
							// we set the view busy, so we need to query the parent of the app
							Opa5.assert.ok(true, "The dialog is open");
						},
						errorMessage: "Did not find the dialog control"
					});
				}
			}
		}
	});
});
Brandeis Consulting & Cadao

Übung OPA Test anlegen (5)

  1. Wir legen innerhalb des integration Ordners das Dokument opaTests.qunit.html an und fügen dort folgenden Code ein:
<!DOCTYPE html>
<html>
<head>
	<title>Integration tests for the UI5 Walkthrough</title>
	<meta charset="utf-8">

	<script
		id="sap-ui-bootstrap"
		src="../../resources/sap-ui-core.js"
		data-sap-ui-theme="sap_horizon"
		data-sap-ui-resource-roots='{
			"ui5.walkthrough": "../../"
		}'
		data-sap-ui-compat-version="edge"
		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="opaTests.qunit.js"></script>
</head>
<body>
	<div id="qunit"></div>
	<div id="qunit-fixture"></div>
</body>
</html>
Brandeis Consulting & Cadao

Übung OPA Test anlegen (6)

  1. Wir legen innerhalb des integration Ordners das Dokument opaTests.qunit.js an und 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/localService/mockserver",
		"ui5/walkthrough/test/integration/NavigationJourney"
	], (mockserver) => {
		// initialize the mock server
		mockserver.init();
		QUnit.start();
	});
});
Brandeis Consulting & Cadao

Übung OPA Test anlegen (7)

  • Nun öffnen wir den Browser und ändern den letzten Teil der Adressezeile von *..*/test/mockServer.html zu *..*/test/integration/opaTests.qunit.html
  • Das QUnit-Layout sollte nun sichtbar sein und der Test „Should see the Hello dialog“ wird sofort ausgeführt. Auf der rechten Seite wird die Anwendung geladen. Wenn alles richtig funktioniert, wird der Buttonklick ausgelöst, ein Dialog erscheint und der Testfall ist grün.
Brandeis Consulting & Cadao

OPA5 Erläuterungen

  • Given: Setzt den Anfangszustand für den Test
    • Beispiel: Starten der Anwendung, Navigieren zu einer bestimmten Seite
    • Given.iStartMyAppInAFrame("index.html");
  • When: Führt die zu testende Aktion aus
    • Beispiel: Klicken eines Buttons, Eingeben von Text
    • When.onTheAppPage.iPressTheSayHelloButton();
  • Then: Überprüft das erwartete Ergebnis
    • Beispiel: Prüfen, ob ein Dialog geöffnet wurde, ob Text angezeigt wird
    • Then.onTheAppPage.iShouldSeeTheHelloDialog();
  • Zusammen bilden sie ein vollständiges Testszenario:
opaTest("Should open the hello dialog", function (Given, When, Then) {
  Given.iStartMyAppInAFrame("index.html");
  When.onTheAppPage.iPressTheSayHelloButton();
  Then.onTheAppPage.iShouldSeeTheHelloDialog();
});
Brandeis Consulting & Cadao

Erweiterte Möglichkeiten mit OPA5

  • Matchers: Präzise Elementauswahl
    • properties: Prüft Eigenschaften von Controls
    • ancestor: Findet Elemente basierend auf Vorfahren
    • descendant: Sucht nach Nachkommen eines Elements
  • Actions: Spezifische UI5-Interaktionen
    • press: Klicken von Buttons oder anderen interaktiven Elementen
    • enterText: Texteingabe in Input-Felder
    • dragAndDrop: Drag-and-Drop-Operationen simulieren
  • Instrumentierung: Tiefere Testintegration
    • opaSkip: Tests selektiv überspringen
    • opaTimeout: Anpassen des globalen Timeouts
  • Debugging: Verbesserte Fehlerbehebung
    • autoWait: Automatisches Warten auf UI-Updates
    • debug(): Aktiviert erweitertes Logging für Tests

weitere Möglichkeiten

  • weitere Möglichkeiten für OPA Tests sind hier aufgelistet.
Brandeis Consulting & Cadao

Aufzeichnen von Tests im Browser

UI5 Test Recorder

Integriertes Tool zum Aufzeichnen von UI-Interaktionen
Zugänglich über das Entwicklermenü in UI5-Anwendungen über die Tastenkombination strg+shift+alt+p

Funktionen:

  • Aufzeichnen von Aktionen:
  • Klicks, Texteingaben, Navigation etc.

Generierung von OPA5-Code:

  • Erstellt automatisch OPA5-Testcode für aufgezeichnete Aktionen

Elementidentifikation:

  • Hilft bei der Auswahl geeigneter Selektoren für UI-Elemente

Interaktive Bearbeitung:

  • Möglichkeit, aufgezeichnete Tests zu bearbeiten und zu verfeinern
Brandeis Consulting & Cadao

OPA Test erweitern mit dem UI5 Test Recorder (1)

  • wir wechseln zu dem BAS Tabreiter und stoppen den Server in dem wir das Terminal Fenster mit der Maus fokussieren und strg+c drücken.
  • wir öffnen die Datei ui5.yaml
  • wir fügen dort unter framerwork\libraries folgenden Code ein:
    - name: sap.ui.testrecorder
    - name: sap.tnt
    - name: sap.ui.table

  • Wir starten den Server neu in dem wir in das Terminal Fenster folgendens eingeben:
  npm run start
Brandeis Consulting & Cadao

OPA Test erweitern mit dem UI5 Test Recorder (2)

  • Wir öffnen den Browser und ändern den letzten Teil der Adressezeile in *..*/test/mockServer.html
  • Wir drücken die Tastenkombination strg+shift+alt+p
  • Es öffnet sich im unteren Teils des Browsers ein neues Fenster
  • Dort klicken wir auf Test-Recorder aktivieren
  • Es kann einige Sekunden dauern bis der TestRecorder geladen wird.
Brandeis Consulting & Cadao

OPA Test erweitern mit dem UI5 Test Recorder (3)

  • Wir wählen als Dialekt OPA5 aus.
  • Wir klicken nun auf den Button Say Hello mit der rechten Maustaste und klicken dort Press
Brandeis Consulting & Cadao

OPA Test erweitern mit dem UI5 Test Recorder (4)

  • In der Mitte des Test Recorders erscheint nun der OPA5-Code, der zur Simulation des Tastendrucks benötigt wird.
  • Nun fügen wir unter webapp/test/integration/pages/App.js den erzeugten Code nach der Funktion iPressTheSayHelloWithDialogButton() ein.

  • Um eine stabile Ausführung von messageToast-Elemente zu gewährleistens setzen wir die waitFor-Methoden explizit auf false.
  autoWait: false,
Brandeis Consulting & Cadao

OPA Test erweitern mit dem UI5 Test Recorder (5)

  • Der Code sollte nun wie folgt aussehen:
 actions: {
	iPressTheSayHelloWithDialogButton() {
		return this.waitFor({
			id: "helloDialogButton",
			viewName: sViewName,
			actions: new Press(),
			errorMessage: "Did not find the 'Say Hello With Dialog' button on the HelloPanel view"
		});
	},
	iPressTheControl: function () {
		this.waitFor({
			controlType: "sap.m.Button",
			autoWait: false,
			viewName: "ui5.walkthrough.view.HelloPanel",
			i18NText: {
				propertyName: "text",
				key: "showHelloButtonText"
			},
			actions: new Press({
					idSuffix: "content"
				})
		});
	}
},
Brandeis Consulting & Cadao

OPA Test erweitern mit dem UI5 Test Recorder (6)

  • Nun fügen wir unter webapp/test/integration/pages/App.js die Funktion iShouldSeeMessageToastAppearance nach der Funktion iShouldSeeTheHelloDialog() ein.
  • der Code sollte nun wie folgt aussehen:
assertions: {
	iShouldSeeTheHelloDialog() {
		return this.waitFor({
			controlType: "sap.m.Dialog",
			success() {
				// we set the view busy, so we need to query the parent of the app
				Opa5.assert.ok(true, "The dialog is open");
			},
			errorMessage: "Did not find the dialog control"
		});
	},
	iShouldSeeMessageToastAppearance: function () {
		return this.waitFor({
			// Turn off autoWait
			autoWait: false,
			check: function () {
				return Opa5.getJQuery()(".sapMMessageToast").length > 0;
			},
			success: function () {
				Opa5.assert.ok(true, "The message toast was shown");
			},
			errorMessage: "The message toast did not show up"
		});
	}
}
Brandeis Consulting & Cadao

OPA Test erweitern mit dem UI5 Test Recorder (7)

  • Damit die zuvor definierten Methoden auch ausgeführt werden, fügen wir unter webapp/test/integration/NavigationJourney.js nach dem ersten opaTest folgenden Code ein:
	QUnit.module("Message Toast");

	opaTest("Should open Hello Message Toast", (Given, When, Then) => {
		// Arrangements
		Given.iStartMyUIComponent({
			componentConfig: {
				name: "ui5.walkthrough"
			}
		});

		//Actions
		When.onTheAppPage.iPressTheControl();

		// Assertions
		Then.onTheAppPage.iShouldSeeMessageToastAppearance();

		// Cleanup
		Then.iTeardownMyApp();
	});
Brandeis Consulting & Cadao

OPA Test erweitern mit dem UI5 Test Recorder (8)

  • Nun lassen wir die Tests noch einmal laufen. Dazu starten wir gegebenenfalls den Server neu. Das Terminal öffnen und den Server starten
	npm run start
  • Nun öffnen wir den Browser und ändern den letzten Teil der Adressezeile von *..*/test/mockServer.html zu *..*/test/integration/opaTests.qunit.html
  • Wir sehen nun, dass der Test erfolgreich war.
Brandeis Consulting & Cadao

UI5 Test Recorder

Vorteile:

  • Beschleunigt die Testerstellung
  • Reduziert manuelle Codierung
  • Erleichtert das Erlernen von OPA5-Syntax

Einschränkungen:

  • Generierter Code kann Optimierung benötigen
  • Komplexe Szenarien erfordern möglicherweise manuelle Anpassungen
Brandeis Consulting & Cadao