7
Unterelemente komplexer GUI Komponenten

In typischen Java GUIs gibt es Komponenten wie Bäume und Tabellen, die ziemlich komplex sind und eine beliebige Zahl von Unterelementen wie Baumknoten oder Tabellenfelder enthalten können. Diese Unterelemente sind selbst keine echten GUI Komponenten, sondern nur eine grafische Darstellung der zugrunde liegenden Daten. Diese Unterscheidung ist rein technischer Natur und da es aus Sicht eines Testers durchaus Sinn macht, die Elemente als eigenständig und als mögliche Ziele für Events anzusehen, bietet QF-Test dafür spezielle Möglichkeiten, indem es ein Unterelement durch einen 'Element' Knoten repräsentiert.

7.1
'Elemente'

Ein 'Element' wird durch zwei Dinge definiert: die Komponente, zu der es gehört, und einen Index innerhalb dieser Komponente. Der Parentknoten des 'Elements' legt die Komponente fest. Der Index kann entweder eine Zahl sein, oder ein Text. Numerische Indizes starten mit 0. So entspricht z.B. in einer JList Komponente das Element mit Index 1 dem zweiten Listeneintrag. Für Bäume sind einfache numerische Indizes nahezu unbrauchbar, da durch das Ein- und Ausklappen von Ästen die Indizes aller darunter liegenden Knoten verändert werden.

Ein Textindex definiert ein Element durch den Text, den es an der Oberfläche anzeigt. Ein Listenelement namens "Eintrag1" in einer JList Komponente würde z.B. mit dem Textindex "Eintrag1" aufgezeichnet. Die Textform ist flexibler als die numerische, kann aber Probleme bereiten, wenn die angezeigten Texte der Elemente in einer Komponente nicht eindeutig sind. In diesem Fall wird das erste passende Element angesprochen. Ein Textindex kann auch als regulärer Ausdruck (vgl. Abschnitt 36.4) angegeben werden. Auch in diesem Fall ist das Ziel das erste Element, das auf den regulären Ausdruck passt.

Die Option Format für Unterelemente legt fest, welches Format beim Aufzeichnen von Elementen verwendet wird.

Beinahe alle Arten von 'Elementen' haben nur einen Index. Dies reicht für die Zelle einer JTable Komponente nicht, da Tabellen zweidimensionale Strukturen sind. Entsprechend sind zwei Indizes nötig, um eine Zelle exakt zu beschreiben. Der erste, der 'Primärindex', legt die Tabellenspalte fest, der 'Sekundärindex' die Zeile.

Ein Element für ein Tabellenfeld
Abbildung 7.1:  Ein 'Element' für ein Tabellenfeld

Auch Baumknoten nehmen eine Sonderstellung ein. Wie oben beschrieben lässt sich die hierarchische Struktur nicht so leicht auf eine lineare Struktur abbilden. Außerdem treten in Bäumen oft Baumknoten mit den gleichen Namen auf. Wenn man dagegen die direkten und indirekten Parentknoten mit in den Namen einbezieht, lässt sich meistens Eindeutigkeit erreichen.

QF-Test verwendet eine besondere Syntax um Baumknoten darzustellen. Ein Index, der mit einem '/' Zeichen beginnt, wird als Pfadindex interpretiert. Denken Sie dabei einfach an ein Dateisystem: Die Datei namens "/tmp/file1" kann entweder flach als "file1" dargestellt werden, was zu Konflikten mit anderen Dateien namens "file1" in anderen Verzeichnissen führen kann, oder als der volle, eindeutige Pfad "/tmp/file1". QF-Test unterstützt auch numerische Indizes mit dieser Syntax: Ein numerischer Index der Form "/2/3" bezeichnet den vierten Kindknoten des dritten Kindknotens des Wurzelknotens. Eine kombinierte Form um z.B. mittels "/tmp/2" den dritten Knoten im "tmp" Knoten anzusprechen, ist derzeit nicht möglich.

Hinweis Diese spezielle Syntax macht das '/' Zeichen zu einem Sonderzeichen für 'Elemente' in einer Baumkomponente. Taucht dieses Zeichen selbst in einem Namen auf, muss es daher geschützt werden. Näheres zu diesem Thema finden Sie in Abschnitt 36.6.

7.2
Die 'Id' eines 'Elements'

Alles was in Abschnitt 6.3 zum 'Id' Attribut von 'Komponenten' gesagt wurde, trifft auch auf die 'Id' eines 'Elements' zu. Sie muss eindeutig sein und wird von Events und Checks referenziert.

Wenn QF-Test die 'Id' eines 'Elements' automatisch zuweist, erzeugt es diese indem es die 'Id' der 'Komponente' des Parentknotens nimmt und den Index (oder die Indizes) anhängt. Diese Art von 'Id' ist normalerweise gut zu lesen und zu verstehen. Leider ist sie aber auch die Quelle eines häufigen Missverständnisses: Wenn Sie den Index eines aufgezeichneten 'Elements' ändern wollen, um auf ein anderes Element zu verweisen, dürfen Sie nicht das Attribut 'Id der Komponente' des Knotens ändern, der darauf verweist (es sei denn Sie verwenden die besondere Syntax, die im folgenden Abschnitt beschrieben wird). Stattdessen müssen Sie den 'Primärindex' des 'Element' Knotens ändern.

7.3
Besondere 'Id'-Syntax für direkten Zugriff auf Elemente

Es gibt noch eine zweite Möglichkeit auf Unterelemente von komplexen Komponenten zuzugreifen, bei der auf zusätzliche 'Element' Knoten verzichtet werden kann. Diese bedient sich einer speziellen Syntax direkt im Attribut 'Id der Komponente' des entsprechenden Knotens. An Stelle der 'Id' eines 'Elements' geben Sie hier die 'Id' des 'Komponente' Knotens an, der die komplexe Komponente, also einen Baum, eine Tabelle, etc. repräsentiert. Diese 'Id' wird dann mit einem speziellen Trennzeichen um den Index des Unterelements erweitert. Das Trennzeichen legt dabei fest, ob es sich um einen numerischen Index, einen Textindex oder einen regulären Ausdruck handelt:

Trennzeichen Index Format
@ Textindex
& Numerischer Index
% Regulärer Ausdruck
Tabelle 7.1:  Trennzeichen und Indexformat für den Zugriff auf Unterelemente

Um auf eine Zelle in einer Tabelle mit 'Primärindex' und 'Sekundärindex' zuzugreifen, hängen Sie einfach ein weiteres Trennzeichen an, gefolgt vom 'Sekundärindex'. Die beiden Indizes dürfen dabei durchaus verschiedene Formate haben.

Ein Beispiel: Wenn Ihre Testsuite einen 'Komponente' Knoten für eine JTable Komponente mit der 'Id' table hat und Sie einen Mausklick auf die Zelle in der 6. Zeile und in der Spalte mit der Überschrift "Name" simulieren wollen, legen Sie einen 'Mausevent' an und setzen Sie sein 'Id der Komponente' Attribut auf den Wert table@Name&5.

3.3+

Beinahe alle internen ItemResolver Implementierungen (vgl. Abschnitt 39.2) erlauben die Verwendung negativer Indizes um die Zählung von hinten beginnen zu lassen. So adressiert etwa table&-1&-1 die unterste Zelle in der rechten Tabellenspalte.

Es hängt von der jeweiligen Situation ab, ob ein 'Element' Knoten oder die spezielle Syntax sinnvoller ist. Sie können beide Methoden nach belieben verwenden und auch mischen. Als Faustregel gilt, dass 'Element' Knoten besser für Komponenten mit wenigen, konstanten Elementen geeignet sind, wie z.B. die Spalten einer Tabelle oder die Reiter einer JTabbedPane. Die Syntax ist vorzuziehen, wenn QF-Test Variablen in Indizes verwendet werden oder wenn die Namen von Elementen variieren oder editierbar sind. Die Option Art der Unterelemente legt fest, ob QF-Test beim Aufzeichnen 'Element' Knoten anlegt oder die 'Id'-Syntax verwendet. Mit der Standardeinstellung "Intelligent" folgt QF-Test obigen Regeln.

Hinweis Die besondere Bedeutung der Trennzeichen '@', '&' und '%' macht diese zu Sonderzeichen, die geschützt werden müssen, wenn sie selbst in einem Namen auftauchen. Näheres zu diesem Thema finden Sie in Abschnitt 36.6.