zurück
Avatar of Yann Spöri
Autor: Yann Spöri
16. April 2019

Implementieren von Checkern

Beim Testen einer Anwendung gehört das Überprüfen des aktuellen Zustandes einer Anwendung mit zu den wichtigsten Schritten. Wenn wir z.B. eine Taschenrechneranwendung testen, so muss überprüft werden, dass die Anwendung zu einem gegebenen Zeitpunkt das richtige Ergebnis anzeigt. Das heißt, wir brauchen eine Überprüffunktion (einen Check) um zu überprüfen, dass eine GUI Komponente, z.B. ein Textfeld die korrekten Informationen anzeigt.

Der einfachste Weg um in QF-Test eine Check-Aktion aufzunehmen ist in den Check-Aufnahme-Modus zu wechseln, z.B. in dem man auf das entsprechende Symbol in der Symbolleiste klickt.

Anschließend kann man über einen Rechtsklick auf die entsprechende Komponente den gewünschten Check aufnehmen.

Einen Moment: Was kann man tun, wenn der gewünschte Check nicht in der angezeigten Liste vorhanden ist? In diesen Fall kann man sich entweder mit einem SUT-Skript behelfen, um den Zustand der gewünschten Komponente zu überprüfen oder wir können unseren eigenen Checker implementieren.

Bitte beachten Sie, dass sich beide Möglichkeiten sehr ähneln und Programmierkenntnisse sowie (meistens) Kentnisse über die verwendete GUI Technologie und/oder die Komponentenimplementation nötig sind. Es kann also eine gute Idee sein, sich von einem Entwickler bei der Implementierung eines Checkers helfen zu lassen.

Ein Beispie: Wie in dem obigen Bild zu sehen ist, gibt es in der Liste der verfügbaren Checker keinen Check, der die Textfarbe überprüft. Ich werde anhand von Jython erklären wie man einen derartigen Checker hinzufügt, allerdings kann so einen Checker auch in einem Groovy und/oder Java Script SUT Skript (oder in einer beliebig anderen Skriptsprache, die in Zukunft hinzugefügt wird) implementieren werden.

1. Analysieren der Komponente

Wenn wir nicht genau wissen, wie das Setzen der Textfarbe implementiert wurde, so müssen wir die Komponenteneigenschaften / -methoden zuerst analysieren, um eine Methode zu finden, welche die gewünschten Informationen zurückliefert. Am einfachsten geht das in Jython mit der Methode dir bzw. der Methode type:

com = rc.getComponent("<QF-Test component id>")
type(com)
print dir(com)

Dieses Skript benötigt die QF-Test Komponenten ID der gewünschten Komponente. Um diese ID zu kriegen, kann man einfach einen beliebigen Check oder eine beliebige Aktion (z.B. einen Klick) auf die gewünschte Komponente aufnehmen. Anstelle des print-Keywords, kann auch die rc.logMessage()-methode verwendet werden. In diesem Fall wird die Ausgabe der dir/type Methoden in das Protokoll geschrieben.

Für obiges Beispiel liefert

type(com)

zurück, dass es sich um eine Java Standard Komponente, nämlich javax.swing.JTextField, handelt. Wir können also in der zugehörigen Dokumentation nachschauen, um herauszufinden, dass man bei einer solchen Komponente mithilfe der setForeground() die Textfarbe ändern kann und mithilfe der Methode getForeground() die aktuelle Farbe auslesen kann. Das Skript:

com = rc.getComponent("<QF-Test component id>")
print com.getForeground().getRGB() #

liefert also die aktuelle Farbe in Form einer Zahl zurück.

2. Implementieren des Checks

Das Wissen, dass die getForeground() Methode die gewünschte Farbe zurückliefert, können wir jetzt ausnutzen um in einem SUT Skript einen entsprechenden Checker zu implementieren und zu registrieren:

from de.qfs.apps.qftest.extensions.checks import CheckerRegistry, \
    Checker, DefaultCheckType, CheckDataType
from de.qfs.apps.qftest.shared.data.check import StringCheckData
from de.qfs.lib.util import Pair
import jarray

componentClass = "javax.swing.JTextField"
foregroundColorCheckerType = DefaultCheckType("Color", CheckDataType.STRING, "Foreground color")

class ForegroundColorChecker(Checker):
    def getSupportedCheckTypes(self, com, item):
        return jarray.array([foregroundColorCheckerType], DefaultCheckType)

    def getCheckData(self, com, item, checkType):
        if foregroundColorCheckerType.getIdentifier() == checkType.getIdentifier():
            color = com.getForeground().getRGB()
            return StringCheckData(checkType.getIdentifier(), str(color))
        return Non

    def getCheckDataAndItem(self, com, item, checkType):
        data = self.getCheckData(com, item, checkType)
        if data == None: return None
        return Pair(data, None)

global foregroundColorChecker

# unregister a maybe already present instance of this checker
try: CheckerRegistry.instance().unregisterChecker(componentClass, foregroundColorChecker)
except: pass

# after unregistering, register a new instance of this checker
foregroundColorChecker = ForegroundColorChecker()
CheckerRegistry.instance().registerChecker(componentClass, foregroundColorChecker)

Nachdem dieses Skript ausgeführt wurde, erscheint der neu erstellte Checker in der Liste der verfügbaren Checker und kann genauso wie die anderen Checker aufgenommen und wiedergegeben werden.

Hinweis

  • Das ist ein etwas vereinfachtes Beispiel. Im echten Leben könnte es Sinn machen dass der Checker die Zahlenwertrepräsentation der Farbe in eine lesbarere Form konvertiert.
  • Mithilfe von selbstimplementierten Checkern kann man QF-Test beibringen, wie es mit selbstimplementierten Komponenten umgehen soll.

Die Kommentarfunktion ist für diesen Artikel deaktiviert.

0 Kommentare