OpenKeyWord  Version: 426, Datum:
!DRAFT: Einführungsbeispiel am Calculator

Einleitung

Dieses Beispiel zeigt, wie das OKW-Framework verwendet wird. Das erste Beispiel ist bewusst einfach gehalten um zunächst das Zusammenspielen der OKW-Komponenten zu zeigen:

  • Testfall <-> Schlüsselwörter
  • OKW-Frame <-> GUI-Adapter

des OKW-FrameWorks. Komplexe Beispiele werden folgen.

In diesem Beispiel wird folgende HTML-Seite automatisiert:

Calculator

Das Beispiel ist ein Taschenechner mit den vier Grundrechenarten, Quadratwurzel, natürlicher Logrithmus und der Exponetialfunktion.

Diese sieht wie folgt aus:

Caption text

Die Bereiche des OKW

Das OpenKeyWord-Framework besteht aus zwei Hauptbereichen, die zusammen einen Testfall zur automatiserten Ausführung bringen: "Testfallbeschreibung" und "GUI-Frame".   Für die Umsetzung der Automatisierung können diese Bereiche jeweils folgenden Tester-Rollen zugeordnet:

  • Der Fachtester erstellt die Testfallbeschreibung
  • Der technischer Tester erstellt und definiert die GUI-Frames.  

Aufgaben des Fachtesters

Der Fachtester erstellt konkrete Testfälle als Testfall-Beschreibungen in OKW-Schlüsselwortnotation: Dazu stellt OKW zum Einen sogenannte elementare Schlüsselwörter zur Verfügung. Zum anderen können Kombinationen von elementaren Schlüsselwörtern zu projektspezifischen Sequenzen zusammengestellt werden.   Mit diesen beiden Beschreibungselementen, Elementare Schlüsselwörter und Sequenzen, wird ein Testfall beschrieben.  

Aufgaben des technischen Testers

Der technischen Tester hat die Aufgabe, die Objekterkennung der Oberflächen zu definieren: Wie wird ein GUI-Objekt oder GUI Element erkannt? Welche sind die charkteristischen Eigenschaften um die GUI eindeutig zuerkennen?   Für die Objekt-Erkennung muss jedes test-relevante GUI-Objekt "Erkennungsdienstlich" erfasst werden. Diese Erfassung bedeutet, dass jedes Testrelevante GUI-Objekt als GUI-Frame-Objekt erfasst werden muss.  

  1. Fachlicher Bezeichner des Objektes - wird als OKWGUI-Attribut gesetzt
  2. GUI-Adapter Passend für das jeweilige GUI - Verwendung GUI-Adapter-Klasse
  3. Definition des Locator-s - Wird dem Konstruktor als Parameter mitgegeben.   Die GUI-Adapter sind Module aus den Bestandteil von OKW-tellen  die von OKW zur Verfügung gestellt werden.

Testfall 1: Addition

Unser erster Testfall prüft die Addition des Taschenrechners. Hier zunächst eine Übersicht der Testfallbeschreibung mit allen notwendigen Schritten:

EN.BeginTest("Testcase 1: Addition");

EN.StartApp("Firefox");
EN.SetValue("URL", "https://www2.informatik.hu-berlin.de/Themen/www/selfhtml/javascript/beispiele/anzeige/taschenrechner.htm");

EN.SelectWindow("Calculator");
EN.ClickOn("1");
EN.ClickOn("+");
EN.ClickOn("1");
EN.ClickOn("=");

EN.VerifyValue("Display", "2");

EN.StopApp("Firefox");
EN.EndTest();

Testschritte im Detail

Nun die Schritte im einzelnen:

EN.BeginTest("Testcase 1: Addition");

BeginTest() und EndTest sind obligatotische Befehle.

BeginTest() versetzt OKW immer in den Initial-Zustand: Sollten bereits Tests gelaufen sein und diese sind fehlgeschlagen, dann wird OKW mit BeginTest() für den Test "durchinitialisiert" und wieder in den initialen Zustand versetzt, d.H. als wären vorher keine Tests gelaufen.

Im Hintergrund passiert folgendes (siehe im Detail OKW.NOK.BeginTest(string) ):

  1. Alle OKW-Core Klassen werden initialisiert.
  2. Der interne OKW-Zustand wird von NOK auf OK gesetzt.
  3. Die Logger werden für den nächten Testfall vorbereitet, z.B. es werden neue Dateien angelegt oder neue Test-Blöcke begonnen.
EN.StartApp("Firefox");

Als nächstes müssen wir den WEB-Browser starten. In unserem Fall ist dass der Firefox. OKW stellt für die gängigsten Browser die Frames zur Verfügung.

Im Hintregrund geschiet folgendes:

  1. Es wird eine Instnazt des Firefox-Webdrivers erzeugt, und für die weietern zugriffe gespeichert. Bei Selenium wird dadurch automatisch der zugehörige WEB-Browser gestartet, hier also der Firefox.
  2. Der Kontext wird auf Firefox gesetzt. Damit ist ein SelectWindow("Firefox") nicht notwendig.
EN.SetValue("URL", "https://.../taschenrechner.htm");

Navigation zur gewünschten WEB-Seite. Mit SetValue wird "URL" auf den gegebenen Wert gesetzt.

Hinweis: In alle OKW-Browser Frames ist der fachliche Bezeichner "URL" für die Eingabe der URL definiert.

EN.SelectWindow("Calculator");

Mit SelectWindow() wird der Kontext auf das Frame mit dem fachlichen Bezeichner "Calculator" gesetzt. Anders gesagt: Wir sagen OKW mit welchem Fenster ab jetzt gearbeitet werden soll. Alle nachfolgenden GUI Befehle beziehen sich auf das hier ausgewählte Fenster.

Anmerkung: Wir haben hier stillschweigend vereinbart, dass die WEB-Seite mit dem Taschenrechner fachlich "Calculator" bezeichnet wird.

EN.ClickOn("1");
EN.ClickOn("+");
EN.ClickOn("1");
EN.ClickOn("=");

Die OKW Schlüsselwörter sind so gewählt, dass diese selbsterklärend sind: Hier werden die Tasten "1", "+", "=" geklickt.

Anmerkung: Auch hier haben wir stillschweigend eine Vereinbarung getroffen: Die Tasten Bezeichnungen "1", "+" usw.

EN.VerifyValue("Display", "2");

Das Ergebniss sollte "2" sein. - Das überprüfen wir mit VerifyValue().

VerifyValue hat zwei Parameter:

  • Wie bei allen GUI-Schlüsslewörtern ist der 1. Parameter der fachliche Bezeichner des GUI-Objektes. Hier die Anzeige, welches wir "Diplay" bezeichnen.
  • Der zweite Parameter ist unser Sollwert: Das erwartetet Ergebniss ist "2".
EN.StopApp("Firefox");
Mit StopApp(..) beenden wir eine Anwendung. In unseren Fall: Firefox verschwindet.
EN.EndTest();
Unser letzter OKW-Befehl ist EndTest(). Damit wird der Testfall geschlossen. Im Hintergrund werden z.B. die Logger angewiesen Ihre Datan auf die Platte zu speichern.

Damit ist ein Testfall bereits in Schlüsselwort-Notation beschrieben.

Anmerkung: Die elemetaren Schlüsselwörter von OKW sind weder projektspezifisch noch technoligisch "gebunden": Ein ClickOn kann für alle Button-Typen verwendet werden: Es ist völlig egal, ob ein SAPGUI oder WEB Pushbutton geklickt werden muss.

Mit ClickOn: "1" ist eindeutig klar, das Hier der Knopf mit der Aufschrift "1" geklickt werden soll. Allerdings muss man dem Automaten, also OKW, noch beibringen was "1" ist.

GUI-Frame

Für die Automatisierung müssen immer folgende drei Punkte geklärt werden: (Ankerkung: Diese drei Punkte sind nicht OKW-spezifisch. )

  1. Wie wird ein Objekt fachlich Bezeichnet?
  2. Wie wird mit dem GUI-Objekt technisch interagiert?
  3. Wie wird ein GUI-Objekt eindeutig erkannt?

Diese drei Punkte mussen in Beziehung gebracht werden. Hierzu dient das GUI-Frame des OKW. Bei anderen Testwerkzeugen spricht man von "Frame", "GUI-Map" oder "Object-Repository".

Das GUI-Frame von OKW ermöglicht den technischen Zugriff auf GUI-Objekte. Dazu werden folgede Daten jeweils Zentral definiert:

  1. Fachlicher Bezeichner des GUI-Objektes.
  2. GUI-Adapter-Klasse für den technischen Zugriff auf das GUI-Objekt.
  3. Objekterkennungseigenschaft des GUI-Objektes.

Anmerkung: OKW GUI-Frames sind Fenster bezogen: Es werden jeweils Fenster und dereen die Kindobjekte definiert. Für fachliche Beueichnung reicht diese Verschachtelungstiefe aus.

Am einfachen als Beispiel:

Fachliche Bezeichner

Im Folgenden Bild sind beispielhaft einige fachliche Bezeichner eingetragen:

Caption text

Diese Bezeichner werden in den GUI-Schlüsselwörtern immer als erster Parameter angegeben.

Beispiel:

EN.SelectWindow("Calculator");
EN.ClickOn("1");
EN.VerifyValue("Display","1")

Wir vereinbaren nun:

  1. Das gesamte Fenster bezeichnen wird als Calculator bezeichnet.
  2. Die Anzeige, in der die Ergebnisse angezeigt werden, wird als Display bezeichnet.
  3. Die Eingabe-Knöpfe werden jeweils mit dem sichtbaren Zeichen bezeichnet: 1, 2, ..., 9, 0 usw...

Anmerkung: Die fachlichen Bezeichner können aus beliebigen Zeichen bestehen. D.h. Blank und andere Sonderzeichen sind möglich. Einzige Einschränkung: Die Kombination aus Fenster-Bezeichner + Kindobjekt-Bezeichner dürfen je Test-Projekt nur einmal vorkommen. D.h. die fachlichen Bezeichner muss eindeutig sein. - Typischen Beispiel: "Login" + "User" darf nur einmal existieren, sonst ist es nicht klar welches Login gemeint ist.

"OKW Frame erstellen"

Unser Beispiele GUI-Frame enthält nicht alle Knöpfe des Calculators, sonst würde diese Seite sehr lang werden.

namespace OKW.Frames
{
    using System;
    using OKW.GUI.Selenium;

    [OKWGUI("Calculator")]
    public class frmCalculator : SeBrowserChild
    {
        [OKWGUI("Display")]
        public SeTextField Display = new SeTextField("//INPUT[@name='Display']");
        

        [OKWGUI("1")]
        public SePushButton N1 = new SePushButton("//input[@value='  1   ']");;
        
        [OKWGUI("2")]
        public SePushButton N2 = new SePushButton("//input[@value='  2   ']");;
        
        
        public frmCalculator()
            : base("//title[text()='Taschenrechner']/../..")
        {
        
        }
    }
}

Die Erläuterung im Detail:

namespace OKW.Frames
{
Die Frames müssen dem Namespace OKW.Frames angehören, sonst werden diese nicht ins OKW.FrameObjectDictionary aufgenommen und damit können nicht via Schlüsselwörter angesprochen werden.
use OKW.GUI.Selenium;
Unser Beispiel ist eine HTML-Seite. Für die Automatisierung werden die Selenium-GUI-Adapter verwendet. Diese befinden sich im Namespace OKW.GUI.Selenium.
[OKWGUI("Calculator")]

Ordnet den fachlichen Bezeichner "Calculator" der Klasse "frmCalculator" (siehe folge Zeile) zu. Dieser Eintrag sorgt dafür, dass die Klasse frmCalculator als OKW-Frame erkannt wird.

Anmerkung: Der fachliche Bezeichner wird als Attribute mit der Attribute-Klasse OKWGUI (=OKWGUIAttribute) zugeordnet.

public class frmCalculator : SeBrowserChild
{

Die Klasse frmCalculator ist ein Fenster Objekt und dient als Kontainer für Kindobjekte, die im folgenden definiert werden.

Die Klasse OKW.GUI.Selenium.SeBrowserChild stellt die OKW-Methoden für einen Browser-"Reiter" zur Verfügung.

        [OKWGUI("Display")]
        public SeTextField Display = new SeTextField("//INPUT[@name='Display']");

Die erste Zeile ordnet den fachlichen Bezeichner Display dem nachfolgenden Deklaration zu.

Die zweite Zeile deklariert das Display als Feld. Als GUI-Adapter-Klasse wird OKW.GUI.Selenium.SeTextField verwendet.

Die Klasse OKW.GUI.Selenium.SeTextField enthält bereits alles um mit einem TextFeld interagieren zu können. So u.A. die Methode OKW.GUI.Selenium.SeTextField.GetValue(), die das EN.VerifyValue(string, string) benötigt.

Im Konstruktor ist noch der Locator des Objektes zu erkennen: "//INPUT[@name='Display']" Hierbei handelt es sich um eine XPath-Angabe, die das Display eindeutig identifiziert.

Die Objekt-Erkennung ist einer der heikelsten Aufgaben der Automatisierung: Der Locator muss ein Technisches-Objekt eindeutig Identifizieren. In unserem Beispiel reicht eine Identifizierung über das XML-Attribut "@name" aus. Die Objekt-Erkennung kann jedoch beliebig komplex werden. An dieser Stelle wollen wir aber nicht tiefer auf die Locator-Problematik eingehen.

[OKWGUI("1")]
public SePushButton N1 = new SePushButton("//input[@value='  1   ']");

[OKWGUI("2")]
public SePushButton N2 = new SePushButton("//input[@value='  2   ']");
Die Knöpfe des Taschenrechners werden analog zum Display deklariert. Als Klasse wird OKW.GUI.Selenium.SePushButton verwendet. Der Locator ist ebenfalls anzupassen. Alle Anderen, hier nicht aufgeführten Knöpfe werden nach dem gleichen Schema angelegt.
public frmCalculator()
       : base("//title[text()='Taschenrechner']/../..")
{
}
Zum Schluss wird der Locator für die Objekt-Erkennung des Fenster-Objektes angegeben. Der Locator wird dem Konstruktor des Klasse frmCalculator mitgegeben.

Das Vollständige Frame ist im Nuget-Paket OpenKeyWord.Calculator zu finden.