SmartID

6.0+

SmartIDs ermöglichen eine einfache und flexible Wiedererkennung von Komponenten direkt auf Basis der ID, ohne dass die Wiedererkennungskriterien an anderer Stelle abgespeichert werden. Dies verschlankt den aufgenommenen Komponentenbaum in "Fenster und Komponenten" deutlich. Bei ausschließlicher Verwendung von SmartIDs wird der Komponentenbaum überhaupt nicht mehr benötigt. Es ist allerdings zu berücksichtigen, dass diese Flexibilität und Vereinfachung ihren Preis hat und - je nach Situation - die Performanz und Wartbarkeit beeinträchtigen kann.

SmartIDs verwenden die gleichen Wiedererkennungsmerkmale, die bei der klassischen Komponentenerkennung in den 'Komponente'-Knoten abgespeichert werden. Der Unterschied ist, dass aus den möglichen Wiedererkennungsmerkmalen eines oder mehrere explizit ausgewählt und an Stelle der Referenz zur aufgenommenen 'Komponente' eingetragen werden. Zum Beispiel direkt im Attribut 'QF-Test ID der Komponente' eines Mausklick-Knotens.

Ziel der SmartIDs ist eine Verschlankung des Komponentenbaums - so weit sinnvoll, aber nicht um jeden Preis. Einfaches soll möglichst einfach genutzt werden können, aber wenn es schwierig ist, eine Komponente anzusprechen, sind 'Komponente' Knoten besser geeignet. Die Themen "Eindeutigkeit" und "Performanz" können alternativ über das Scope-Konzept adressiert werden, siehe Geltungsbereich (Scope).

Die SmartID wird durch ein führendes # gekennzeichnet. Die einfachste Version der SmartID ist entweder der Name oder die Beschriftung der Komponente mit einem vorangestellten #. Zum Beispiel #username, um eine Komponente mit dem Namen username anzusprechen oder #Anwendername, wenn Anwendername die Beschriftung des Feldes ist.

Typischerweise besteht die SmartID jedoch aus #, gefolgt von der Klasse der Komponente, die mit einem Doppelpunkt abgeschlossen wird. Bei Beschriftungen folgt nun ein optionaler Kennzeichner mit Gleichheitszeichen. Dahinter steht der Wert der SmartID, zum Beispiel #TextField:left=Anwendername.

Der Kennzeichner gibt an, worauf sich der SmartID-Wert bezieht. Bei der Wiedergabe ohne Kennzeichner greift die Option Priorität bei Aufnahme von SmartIDs mit Kennzeichner. Es stehen folgende Kennzeichner zur Verfügung:

Die Angabe der Klasse und des Kennzeichners dienen der besseren Lesbarkeit und der Performanz. Ob die Klasse aufgenommen wird, kann über die Option Für SmartID immer die Klasse aufnehmen gesteuert werden. Dies gilt jedoch nur für Komponenten, deren Klasse zu den Generische Klassen gehört. Für andere Klassen muss der Klassenname auf jeden Fall spezifiziert werden, zum Beispiel #DIV:compid.

Die SmartID wird im Attribut 'QF-Test ID der Komponente' eingetragen, zum Beispiel im Attribut 'QF-Test ID der Komponente' von Event- oder Check-Knoten. Sie kann genauso wie die 'QF-Test ID der Komponente' in Variablen gespeichert, in Parametern übergeben oder in Skripten genutzt werden. Bei komplexen Komponenten wie Tabellen, Listen oder Bäumen kann die SmartID ebenfalls die 'QF-Test ID der Komponente' ersetzen. Der Index, der das Unterelement bezeichnet, bleibt unverändert. Im Anschluss an eine SmartID kann eine darin enthaltene Komponente entweder über eine weitere SmartID oder mittels XPath (Adressierung mit XPath und/oder CSS-Selektoren) adressiert werden.

SmartID-spezifische Sonderzeichen und Trenner für Unterelemente (":", "@", "&" und "%", siehe auch Abschnitt 46.4) müssen mit einem vorangestellten \ geschützt werden, wenn sie im Wert der SmartID oder in der Klasse vorkommen.

SmartIDs können für alle Client-Technologien genutzt werden.

Wie bei SmartIDs ist zu berücksichtigen, dass die Aktualisierung nicht so komfortabel ist wie bei 'Komponente'-Knoten Knoten. Allerdings steht in QF-Test eine mächtige "Suchen und Ersetzen" Funktionalität zur Verfügung, um SmartIDs suiteübergreifend anzupassen.

Hinweis Für eine kleine Einführung in SmartID lesen Sie auch unseren Blogartikel SmartID - Die nächste Generation der Komponentenerkennung .

Anwendungsbereiche für SmartIDs

Die Anwendungsbereiche sind die gleichen, in denen bisher Generische Komponenten zum Einsatz kamen. SmartIDs ersetzen generische Komponenten weitgehend und sind einfacher zu nutzen als diese.

Lesbarkeit
Bei der direkten Aufnahme von Testfällen kann der Einsatz von SmartIDs die aufgenommenen Event- und Checkknoten lesbarer machen. Insbesondere, wenn die aufgenommenen Namen der Komponenten kryptisch sind und stabile Beschriftungen vorhanden sind. In diesem Fall macht es Sinn, die Reihenfolge für die Aufnahme der Wiedererkennungskriterien auf "zuerst Beschriftung, dann Name" zu ändern. Stellen Sie hierzu die Option Priorität bei Aufnahme von SmartIDs mit Kennzeichner auf label,name.
Ignorieren der Komponentenhierarchie
Manche Anwendungen haben tief verschachtelte Komponentenhierarchien. SmartIDs machen es einfach, den Komponentenbaum zu reduzieren, was insbesondere dann hilfreich ist, wenn die Komponentenhierarchie über die Versionen hinweg nicht stabil bleibt. (Bisher wurden zu diesem Zweck Generische Komponenten eingesetzt. Dies ist auch weiterhin möglich, auch parallel zu SmartIDs.)
Testgetriebene Entwicklung
Bei testgesteuerter Entwicklung bieten SmartIDs den großen Vorteil, dass keine 'Komponente'-Knoten Knoten angelegt werden müssen. Außerdem werden bei testgesteuerter Entwicklung häufig die Komponentenbezeichner im technischen Design festgelegt, die dann für die Testerstellung genutzt werden können.
Schlüsselwort-basierende Tests
Schlüsselwort-basierende Tests werden technisch über Prozeduraufrufe und Parameter implementiert. Der Testersteller nimmt somit keine Komponenten auf und ist für die Identifikation der Komponenten auf visuelle Informationen aus dem GUI angewiesen. Dies kann die Beschriftung der Komponente oder deren Funktion (Klasse) sein. Weitere Informationen finden Sie in Schlüsselwortgetriebenes bzw. Keyword-Driven Testing mit QF-Test.
Integration mit anderen Test-Tools
Bei der Steuerung der Testausführung seitens QF-Test über andere Test-Tools wie Robot Framework können die Wiedererkennungskriterien direkt über SmartIDs spezifiziert werden.

SmartID-Syntax für 'Klasse'

Die Klasse wird in der SmartID direkt nach dem # angegeben und mit einem : abgeschlossen, zum Beispiel #Button:.

Für Komponentenklassen, mit denen der Anwender typischerweise interagiert, muss die Klasse nicht explizit in der SmartID angegeben werden. Bei diesen Klassen kann die SmartID auch einfach nur den Komponentenbezeichner oder die Komponentenbeschriftung (entweder das Merkmal oder eine der qfs:label*-Varianten) umfassen, zum Beispiel #btnOK, wenn der Name des Buttons "btnOK" ist, oder #Speichern, wenn die Beschriftung des Buttons "Speichern" lautet. Dies macht eine SmartID einfacher in der Handhabung, allerdings in gewissem Maß auf Kosten der Performance, da ohne Angabe der Klasse mehr Kandidaten auf Übereinstimmung mit der SmartID geprüft werden müssen.

Auf Grund der besseren Performance wird bei der Aufnahme einer SmartID standardmäßig die Klasse mit aufgenommen. Falls dies nicht erwünscht ist, können Sie dies über die Option Für SmartID immer die Klasse aufnehmen deaktivieren.

Im Kapitel 59 ist in den Klasseneigenschaften vermerkt, wenn die Klasse in der SmartID angegeben werden muss. Alle Klassen, die nicht in dem Kapitel genannt werden, müssen immer in der SmartID spezifiziert werden. Beispiel: #DIV:addresses wobei "addresses" hier der Name des DIV-Elements in einer Web-Anwendungen ist.

Panels sind insofern ein Sonderfall, da sich Panels mit Beschriftung für geschachtelte SmartIDs (siehe Abschnitt 5.6.7) oder Scopes (siehe Abschnitt 5.7) anbieten. Daher gehört der Klassentyp Panel:TitledPanel zu den SmartID-Klassen und muss nicht separat angegeben werden.

Wenn Sie zusätzlich zur generischen Klasse einen vordefinierten Klassentyp verwenden, können Sie diese Kombination wie gewohnt schreiben, zum Beispiel #Button:ComboBoxButton:. Die vordefinierten Klassentypen finden Sie in Generische Klassen. Bei eigenen Klassentypen muss der innere Doppelpunkt mittels \ geschützt werden, zum Beispiel #Panel\:myPanel:. Auch die Indextypkennzeichner "@", "&" und "%" müssen mit einem vorangestellten \ geschützt werden (siehe Abschnitt 46.4).

Informationen zu Kombinationsmöglichkeiten finden Sie in Abschnitt 46.3.

SmartID-Syntax für 'Name'

Ein Name kann in der SmartID direkt nach dem # angegeben werden, z.B. #txtUsername. Wenn die Klasse der Komponente zu den Generische Klassen gehört, reicht die einfache Angabe des Namens. Ansonsten muss die Klasse vorangestellt werden, zum Beispiel #DIV:txtUsername.

Der verwendete Name kann SmartID-spezifische Sonderzeichen enthalten ":", "@", "&" und "%" (siehe auch Abschnitt 46.4), diese müssen jedoch mit einem vorangestellten \ geschützt werden.

Um zu erzwingen, dass der Name für die Komponentenerkennung verwendet wird, kann in der SmartID Name= vorangestellt werden, zum Beispiel #Name=txtUsername. Die Groß-/Kleinschreibung muss beim Präfix Name= nicht beachtet werden.

Weitere Informationen zu Kombinationsmöglichkeiten finden Sie in Abschnitt 46.3.

SmartID-Syntax für 'Merkmal'

Das Wiedererkennungskriterium Merkmal kann in der SmartID direkt nach dem # angegeben werden, zum Beispiel #Anwendername. Wenn die Klasse der Komponente zu den Generische Klassen gehört, reicht die einfache Angabe des Merkmals. Ansonsten muss die Klasse vorangestellt werden, zum Beispiel #DIV:Anwendername.

Das verwendete Merkmal kann SmartID-spezifische Sonderzeichen enthalten, diese müssen jedoch mit einem vorangestellten \ geschützt werden.

Um zu erzwingen, dass das Merkmal für die Komponentenerkennung verwendet wird, kann dem Merkmal Feature= vorangestellt werden, zum Beispiel #Feature=Anwendername. Wenn es unwichtig ist, ob das Merkmal oder das weitere Merkmal qfs:label*-Varianten verwendet wird, kann Label= vorangestellt werden, zum Beispiel #Label=Anwendername. Die Groß-/Kleinschreibung muss bei den Präfixen Feature= und Label= nicht beachtet werden.

Weitere Informationen zu Kombinationsmöglichkeiten finden Sie in Abschnitt 46.3.

SmartID-Syntax für 'Weitere Merkmale'

Wiedererkennungskriterien aus der Gruppe der Weitere Merkmale stehen ebenfalls für die SmartID zur Verfügung. Diese können über den Kennzeichner, der vor den SmartID-Wert gesetzt wird, angesprochen werden. Zwischen Kennzeichner und SmartID steht ein =. Für alle 'Weiteren Merkmals' entspricht der Kennzeichner dem Namen des weiteren Merkmals. Die Groß- und Kleinschreibung muss berücksichtigt werden. Der SmartID-Wert entspricht dem Wert des weiteren Merkmals. Auch hier ist die Groß- und Kleinschreibung relevant.

Beispiele:

  • Die SmartID #module=Modul1 referenziert eine Komponente mit einem weiteren Merkmal mit dem Namen module und dem Wert Modul1.
  • Die SmartID #my\:foo=Irgend\&etwas referenziert eine Komponente mit einem weiteren Merkmal mit dem Namen my:foo und dem Wert Irgend&etwas.

Für die qfs:label*-Varianten gibt es Kurzformen für den Kennzeichner. Diese werden weiter unten in diesem Kapitel erläutert.

SmartID-spezifische Sonderzeichen ":", "@", "&" und "%" (siehe auch Abschnitt 46.4) müssen mit einem vorangestellten \ geschützt werden, wenn sie im Wert der SmartID, Bezeichner oder in der Klasse vorkommen.

Informationen zu Kombinationsmöglichkeiten finden Sie in Abschnitt 46.3.

qfs:label*-Varianten

Eine herausragende Stellung haben die qfs:label*-Varianten, die Beschriftungen für eine Komponente enthalten. Wenn für eine Komponente Beschriftungen existieren, kann in der SmartID entweder die Beste Beschriftung oder eine spezifische Beschriftung genutzt werden. Der Vorteil einer spezifischen Beschriftung ist neben der präziseren Angabe auch die Performanz bei der Wiedergabe, da direkt nach der entsprechenden Beschriftung gesucht werden kann. Andernfalls wird aus allen in Frage kommenden Beschriftungen die beste Beschriftung ermittelt, dieser Vorgang ist zeitintensiver. Um eine spezifische Beschriftung zu nutzen, starten Sie mit # dann ein Bezeichner, das heißt, der Kurzform des weiteren Merkmalnamens (siehe qfs:label*-Varianten), gefolgt von "=" und dem SmartID-Wert an, zum Beispiel #left=Vorname. Die beste Beschriftung können Sie direkt nach dem # angeben oder mit #qlabel= spezifizieren. Wenn Sie #label= verwenden, kann sich der Wert auf das Merkmal oder eine der qfs:label*-Varianten beziehen. Die Groß- und Kleinschreibung muss bei diesen Kennzeichnerkurzformen nicht beachtet werden. Die Beschriftung kann in der SmartID auch ohne Kennzeichner verwendet werden, zum Beispiel #Anwendername. Dann gilt die in der Option Priorität bei Aufnahme von SmartIDs mit Kennzeichner eingestellte Reihenfolge. Standardmäßig ist dies: Name - beste Beschriftung - Merkmal.

Beispiele:

  • #left=Vorname - Die Beschriftung links der Komponente muss "Vorname" lauten.
  • #qlabel=Vorname - Die Beste Beschriftung für die Komponente muss "Vorname" lauten.
  • #label=Vorname - Entweder muss das Merkmal oder die beste Beschriftung für die Komponente "Vorname" lauten.
  • #Vorname - Entweder muss der Name der Komponente oder das Merkmal oder die beste Beschriftung für die Komponente "Vorname" lauten.
Weitere Merkmale qfs:text und text

Auch die weiteren Merkmale qfs:text und text haben eine Sonderstellung. Beide können über den Kennzeichner text= vor dem eigentlichen Wert angesprochen werden. Wenn dediziert qfs:text verwendet werden soll, können Sie qtext= verwenden.

Beispiele: #text=Anna, #qtext=Benno

Hinweis Genaugenommen wird bei vorangestelltem #text= zuerst nach dem weiteren Merkmal #qfs:labelText= gesucht und dann nach qfs:text und text. Da jedoch die beiden letzteren speziell für Textkomponenten gedacht sind, für die #qfs:labelText= nicht aufgenommen wird, ergibt sich hier kaum Konfliktpotenzial.

Die weiteren Merkmale qfs:text und text können auch ohne vorangestelltem #text= genutzt werden. Hierzu können Sie die Option Priorität bei Aufnahme von SmartIDs mit Kennzeichner entprechend ergänzen, zum Beispiel "name,feature,qlabel,text".

Weiteres Merkmal qfs:type
Das weitere Merkmal qfs:type gibt den Typ einer Klasse an. Wenn nicht einer der von QF-Test vordefinierten Typen (siehe Generische Klassen) verwendet wird, müssen die darin enthaltenen Doppelpunkte mit \ geschützt werden.

SmartID mit Index

Alle SmartIDs können mit einem Index versehen werden, wenn mehrere Komponenten für die gleiche SmartID in Frage kommen. Dabei zählt die technische Reihenfolge der Komponenten in der Hierarchie. Diese muss nicht der visuellen Reihenfolge entsprechen. Die Zählung des Index beginnt bei 0. Der Index wird in spitzen Klammern angegeben. Wird kein Index angegeben, wird implizit der Index 0 verwendet.

Beispiele: #Name<2>, #TextField:<2>

Sonderfälle

Bei Komponenten der Klasse Label gilt diese Reihenfolge nicht. Da sie in den meisten Fällen als Beschriftung anderer Komponentenklassen genutzt werden und dort im Merkmal oder als qfs:label*-Varianten abgespeichert werden, werden die Komponenten der Klasse Label nachrangig behandelt. Label Komponenten müssen daher explizit mit vorangestellter Klasse Label: angesprochen, zum Beispiel #Label:Vorname werden.

Informationen zur allgemeinen SmartID-Syntax finden Sie in Abschnitt 46.3.

SmartID-Syntax für Komponentenhierarchien

Die Komponentenhierarchie kann auch mit SmartIDs für die Wiedererkennung genutzt werden. Als Trennzeichen zwischen den Hierarchieebenen dient @.

Beispiele:

Komponente in Container
Die SmartID #Kundeninformationen@#Name referenziert eine Komponente mit der SmartID #Name in einer übergeordneten Komponente (zum Beispiel einem TitledPanel) mit der SmartID #Kundeninformationen.
Komponente in "normaler" Komponente
Manchmal werden Komponenten wie zum Beispiel ein Button keine guten eigenen Wiedererkennungsmerkmale besitzen, über die Komponente, in der sie liegen, sehr gut angesprochen werden können.
Ein typisches Beispiel ist hier der Button zum Aufklappen der Liste in einer ComboBox:
#ComboBoxSmartID@#Button:
Komponente in Unterelement
Links oder Buttons in Listen- oder Tabellenelementen können mit verschachtelten SmartIDs adressiert werden:
#ListenSmartID&22@#Link:<1>
Hierbei adressiert der Teil vor "@" ein Listenelement, #Link:<1> adressiert den zweiten Link darin.

Aufnehmen und Abspielen von SmartIDs

Wenn Sie SmartIDs aufnehmen wollen, aktivieren Sie die Option Aufnahme von SmartIDs oder haken Sie einfach den Menüpunkt »Aufnahme«-»Aufnahme von SmartIDs« an.

Bei der Aufnahme von SmartIDs prüft QF-Test zunächst, ob ein Name vorhanden ist. Falls ja, wird dieser für die SmartID verwendet. Wenn nicht, wird nach einer Beschriftung gesucht (Merkmal oder Weitere Merkmale.) Wenn die ermittelte SmartID für mehrere Komponenten gültig ist, wird ein Index angefügt.

Hinweis Normalerweise ist die Aufnahme von SmartIDs relativ einfach. Anhängig von der Zielkomponente und den vorhandenen Informationen kann es aber vorkommen, dass keine SmartID aufgenommenen werden kann, so dass ganz klassisch ein 'Komponente'-Knoten Knoten aufgenommen wird. Dies ist zum Beispiel der Fall, wenn dem GUI-Element keine generische Klasse zugewiesen werden kann oder wenn QF-Test für das GUI-Element weder Name, noch Merkmal noch das weitere Merkmal qfs:label*-Varianten ermitteln kann.

Standardmäßig wird die generische Klasse der SmartID vorangestellt. Dies erhöht nicht nur die Lesbarkeit sondern kann auch die Performanz bei der Wiedergabe deutlich verbessern. Über die Option Für SmartID immer die Klasse aufnehmen kann das Voranstellen der Klasse deaktiviert werden. Dabei ist zu beachten, dass die Klassen 'Label' und 'Panel' trotzdem vorangestellt werden, um die korrekte Wiedergabe zu gewährleisten.

Das Abspielen von Knoten mit SmartIDs unterscheidet sich nicht von dem mit aufgenommenen Komponenten. Es können beide Varianten innerhalb eines Testfalls verwendet werden. SmartIDs können auch bei aufgenommenen Komponenten zur Adressierung untergeordneter Komponenten verwendet werden. Das Beispiel aufgenommeneListe&10@#Button: zeigt Kombination der 'QF-Test ID' einer aufgenommenen Liste mit Index und der SmartID des in dem Listenelement liegenden Buttons.

'QF-Test ID' der Komponente als SmartID

Es ist möglich, die 'QF-Test ID' einer aufgenommenen 'Komponente' auf eine SmartID inklusive vorangestelltem # Kennzeichen zu setzen. Dies kann genutzt werden, um die SmartID quasi umzuleiten und die Komponentenerkennung klassisch über die Wiedererkennungsmerkmale der aufgenommenen Komponente durchzuführen. Einzelne Komponenten aufzunehmen macht insbesondere dann Sinn, wenn die SmartID lang und umständlich wird, schlechte Performance hat oder schwer eindeutig zu machen ist. Das SmartID-Kennzeichen # kann dann der Einheitlichkeit halber genutzt werden, muss aber nicht.