Die GUI-Objekte (Objekte der grafischen Benutzerschnittstelle) werden in zwei zusammengehörigen Hierarchien angeordnet: "übergeordnetes und untergeordnetes Element" (parent-child) und "Eignerspezifisch" (owner-owned). Ein Beispiel für eine parent-child-Beziehung ist ein Dialogfenster und eine darin enthaltene Schaltfläche. Ein Beispiel für eine owner-owned-Beziehung ist ein Fenster der höchsten Ebene und ein Dialogfenster. Verwenden Sie einen beliebigen Hierarchietyp für ein Objekt.
Im Rahmen der Proxy-Implementierung kommt es beim zugrundeliegenden Objektmodell (z. B. Java und HWND) häufig vor, dass diese beiden Beziehungen verwechselt werden und deshalb die owner-owned-Beziehung als asymmetrische parent-child-Beziehung behandelt wird. In diesem Fall muss der Proxy die Annahme zurückweisen, dass es ein übergeordnetes Element für ihn gibt, wenn "owner-owned" das zu bevorzugende Beziehungsmodell ist. Die folgenden Methoden können zum Durchlaufen der Hierarchie verwendet werden: "getParent()", "getChildren()", "getOwner()" und "getOwned()".
Eigenschaften sind benannte Werte. Die Eigenschaft selbst verfügt über keinen Typ; der Wert hat einen Typ. Vermeiden Sie es festzulegen, dass Proxys unterschiedliche Typen für dieselbe Eigenschaft zurückgeben sollen. Manchmal kann ein Eigenschaftswert ein Verweis auf ein Objekt statt ein Wert sein. Wird ein solcher Wert an ein Script zurückgegeben, so wird er als Testobjekt zurückgegeben. Die Methoden für den Zugriff auf die Eigenschaften umfassen "getProperty()", "setProperty()", "getProperties()" und "getNonValueProperties()".
Standardmäßig enthalten die neuen Proxyobjekte u. U. keine Objekterkennungseigenschaften und Wertigkeiten. Verwenden Sie dann die Objektbibliothek zum Zuordnen der Erkennungseigenschaften und Wertigkeiten. Die Methoden für den Zugriff auf die Objekterkennungseigenschaften und Wertigkeiten sind "GetRecognitionProperties()" und "getRecognitionPropertyWeight()". Wenn das übergeordnete Objekt mehrere Objekte derselben Klasse enthält, fügen Sie die Eigenschaft ".classIndex" (ein positiver numerischer Wert, der mit "0" anfängt) als Erkennungseigenschaft für das untergeordnete Objekt hinzu.
Im Allgemeinen ist die gesamte Hierarchie der Objekte in der Übersicht enthalten. Bestimmte Objekte werden jedoch häufig zwischen den verschiedenen Builds der Testanwendung geändert. So ist es beispielsweise in Java üblich, Anzeigen hinzuzufügen, um Cluster aus Objekten zu bilden. Bei Functional Tester kann der Benutzer festlegen, dass das Proxy-Objekt nicht zugeordnet werden soll. Obwohl die Objekte, die nicht in die Übersicht aufgenommen werden können, in der Testobjektübersicht nicht enthalten sind, werden sie in der Objekthierarchie aufgelistet, während die Hierarchie der über- und untergeordneten Elemente durchlaufen wird. Die Methoden zum Verwalten der Hierarchie, die zugeordnet werden kann, umfassen "shouldBeMapped()", "getMappableParent()" und "getMappableChildren()".
In einigen Fällen unterstützt das zugrundeliegende Objektmodell ein Konzept von Eigenschaften, z. B. Java, HTML und .NET. Functional Tester ermöglicht Proxys das Implementieren zusätzlicher Eigenschaften. Wenn ein Proxy eine Eigenschaft direkt implementiert, muss der Eigenschaftsname ein anderes Muster aufweisen, um die Verwechslung mit einer beliebigen Eigenschaft des Objekts zu vermeiden. Der reguläre Eigenschaftsname, der für die Erkennung verwendet werden könnte, muss mit einem Punkt (.) beginnen.. Namen bestimmter Verwaltungseigenschaften, die vom Framework verwendet werden und nicht für die Erkennung eingesetzt werden können, beginnen mit einem Nummernzeichen (#).
In vielen Fällen verfügt das zugrundeliegende Objekt über Methoden, die gefunden und aufgerufen werden können. Normalerweise werden diese Methoden vom Framework und von der Domänenimplementierung direkt verwaltet, doch "getMethod()" wird häufig in einem Basisproxy einer Domäne implementiert.
Sorgen Sie dafür, dass Mausaktionen nach Möglichkeit direkt wiedergegeben werden. Wenn ein Methodenname den Begriff "click" (Klicken) oder "drag" (Ziehen) enthält, müssen Mausereignisse die Aktion ausführen. Verwenden Sie keine Methodennamen wie "click" oder "drag", wenn Mausereignisse nicht zum Implementieren der Aktion verwendet werden. Verwenden Sie keine Methodennamen, die sich auf Tasten oder die Tastatur beziehen, wenn die Aktion nicht durch Tastaturereignisse implementiert wird. Sorgen Sie dafür, dass die Methoden die Aktion widerspiegeln, die während der Wiedergabe zuverlässig ausgeführt werden soll. Vermeiden Sie Heuristik.
Objekte können andere Objekte enthalten und weisen möglicherweise eine interne Struktur auf, die nicht als ein oder mehrere verschachtelte Objekte offen gelegt werden. So enthält eine Liste z. B. Einträge, doch die Einträge werden vom Listenobjekt nicht als Objekte offen gelegt. Dieses Verhalten ist in HWND-basierten Objekten üblich. Die häufigsten Methoden zum Bearbeiten von subitem-Elementen umfassen "getSubitem()" sowie die Mausaktionsmethoden "click()", "drag()" und "doubleClick()". Die Methode "getSubitem()" gibt "0" (null) oder eine Zeichenfolge zurück.
Verwenden Sie eine der folgenden Strategien, wenn die Objekte in den subitem-Elementen nicht als eigenständige Objekte offen gelegt werden sollen:
Deklarieren Sie den Proxy für das subitem-Element als Objekt, das nicht in die Übersicht aufgenommen werden kann. Das jeweilige Objekt kommuniziert mit seinem übergeordneten Element, und der übergeordnete Proxy ist zuständig für das Aufzeichnen von Aktionen für das zusammengefasste Objekt sowie für die Unterstützung der Wiedergabe von GUI-Aktionen, die auf subitem-Elementen basieren.
Während der Aufzeichnung übergibt der Proxy für das subitem-Element die Aufrufe des Typs "processMouseEvent()" an sein übergeordnetes Element. Der übergeordnete Proxy ist zuständig für das Aufzeichnen von Aktionen für das zusammengefasste Objekt sowie für die Unterstützung der Wiedergabe von GUI-Aktionen, die auf subitem-Elementen basieren.
Während der Aufzeichnung verarbeitet der Proxy für das subitem-Element Aufrufe des Typs "processMouseEvent()" und generiert die Methodenaufrufe für das übergeordnete Objekt. Der übergeordnete Proxy ist für das Aufzeichnen von Aktionen für das zusammengefasste Objekt nicht zuständig. Zuständig ist er jedoch für die Wiedergabe von GUI-Aktionen, die auf subitem-Elementen basieren.
Sorgen Sie für eine neue Art eines Objektverweises, der in Tags eingeschlossen ist. Damit wird die Registrierung des Verweises aufgehoben, nachdem er als Anker verwendet wurde. Dies ermöglicht es, ein Objekt mit Hilfe von subitem-Elementen eines anderen Objekts zu verankern. Sie können das verschachtelte Objekt als untergeordnetes Element des übergeordneten Objekts zuordnen.
Beachten Sie während der Implementierung von Ausnahmebedingungen und Fehlern die folgenden Regeln:
Lösen Sie keine privaten oder internen Ausnahmebedingungen über die Proxys aus. Möglicherweise steht die API-Dokumentation für die Proxys nicht zur Verfügung. Verwenden Sie Standardausnahmebedingungen, vorzugsweise "RationalTestExceptions".
Verwenden Sie die Ausnahmebedingungen aus dem Paket "com.rational.test.ft" (Java) oder dem Namensbereich "Rational.Test.Ft" (.NET) wieder. Wenn ein Java-Proxy eine Ausnahmebedingung des Typs "com.rational.test.ftMethodNotFoundException" auslöst und das Script in VB geschrieben wurde, ruft das VB-Script eine Ausnahmebedingung des Typs "Rational.Test.Ft.MethodNotFoundException" auf. Wenn Sie eine Ausnahmebedingung auslösen, deren Name unter "com.rational.test.ft" nicht mit "com" anfängt, wird dafür ein Marshaling als Ausnahmebedingung des Typs "WrappedException" ausgeführt.
Alle Ausnahmebedingungen des Typs "RationalTestExceptions", für die ein Marshaling ausgeführt werden kann, müssen einen Konstruktor unterstützen, der einen einzigen Zeichenfolgeparameter verwendet.
Wenn Sie in einem in Java implementierten Proxy eine neue Ausnahmebedingung hinzufügen, die an den Client zurückgegeben werden soll, stellen Sie sicher, dass die gleiche Ausnahmebedingung in .NET implementiert wird.
In Java müssen Ausnahmebedingungen deklariert werden, die für einige Tester möglicherweise nicht hilfreich sind. Da sich viele Ausnahmebedingungen aus fast jeder GUI-Methode ergeben, verwenden Sie in Java Laufzeitausnahmebedingungen statt Ausnahmebedingungen. Vermeiden Sie es, Fehler zu verwenden. Ein Fehler sollte bewirken, dass die gesamte Wiedergabe- oder Aufzeichnungssitzung gestoppt wird.
Falls das Objekt nicht gefunden wurde, löst das Framework eine Ausnahmebedingung des Typs "ObjectNotFound" aus. Wenn das Objekt gefunden wurde, ein angegebenes subitem-Element aber nicht gefunden werden konnte, muss der Proxy eine Ausnahmebedingung des Typs "SubItemNotFoundException" auslösen. Die Ausnahmebedingung "SubItemNotFoundException" wird vom Framework erkannt und die Suche automatisch wiederholt.
Wenn die Eingabekoordinaten für einen Mausklick auf ein Objekt oder subitem-Element stehen, das außerhalb des Bereichs liegt, ändern Sie die Koordinaten so, dass der Bereich in das Objekt bzw. in das subitem-Element eingeschlossen wird. Fügen Sie einen Mechanismus hinzu, damit beim Eintreten dieses Falls eine Warnung im Protokoll generiert wird. Möglicherweise muss der Proxy koordinatenbasierte Mausklicks verwenden, weil das Anzeigenlayout des Objekts nicht vollständig beschrieben werden kann. So ist z. B. bei einem JTree-Objekt die Geometrie PLUS_MINUS nicht bekannt, doch kann diese relativ zum zugehörigen subitem-Element gefunden werden. Es ist akzeptabel, dass der Proxy den Bereich des subitem-Elements erweitert, um PLUS_MINUS einzuschließen. Sie können negative Koordinaten für subitem-Elemente verwenden. Dokumentieren Sie sämtliche Nichteinhaltungen des normalen Verhaltens. Stellen Sie sicher, dass bei subitem-Elementen mit einem festgelegten koordinatenbasierten Mausklick außerhalb des Objekts geklickt wird.
Wenn auf ein falsches Objekt geklickt wird, lösen Sie eine Ausnahmebedingung des Typs "com.rational.test.ft.CoordinateOnWrongObjectException" aus. Möglicherweise überschneidet sich das falsche Objekt mit dem richtigen Ziel. Sie können die Koordinaten so ändern, dass das untergeordnete Objekt in einem Container vermieden wird. Ignorieren Sie den angegebenen Punkt, und suchen Sie nach einem anderen Punkt in einem geeigneten Objekt, auf das geklickt werden kann. Vermeiden Sie das Aufzeichnen von Koordinaten in Objekten, die über untergeordnete Elemente verfügen, die zugeordnet werden können. Lassen Sie keine Mausklicks auf die falschen Objekte zu.
Wenn auf ein falsches subitem-Element geklickt wird, lösen Sie eine Ausnahmebedingung des Typs "com.rational.test.ft.CoordinateOnWrongSubitemException" aus. Diese Ausnahmebedingung gilt nicht für Mausklicks, die einem Objekt zugeordnet sind, bei dem kein subitem-Element angegeben wurde. Diese Art eines Mausklicks gilt nur, wenn auf das Objekt und jedes darin enthaltene subitem-Element geklickt wird. In diesem Fall überschneidet sich das falsche subitem-Element mit dem richtigen Ziel und ist wahrscheinlich ein untergeordnetes Element. Vermeiden Sie eine Aufzeichnung der Koordinaten für subitem-Elemente mit verschachtelten subitem-Elementen, damit diese Ausnahmebedingung nicht eintreten kann. Ignorieren Sie den angegebenen Punkt, und suchen Sie nach einem anderen Punkt für ein entsprechendes subitem-Element, auf das geklickt werden kann.