Handbuch

41.2
Wiedererkennung von Komponenten

Das Problem der Wiedererkennung von Komponenten im SUT beim Abspielen eines Tests ist ziemlich kompliziert. Das Problem ist, dass sich die Oberfläche des SUT schon bei normaler Bedienung ständig verändern kann. Fenster werden geöffnet und geschlossen oder in der Größe variiert, wodurch sich die Position und Größe der darin enthaltenen Komponenten ändert. Menüs und Comboboxen werden auf- und zugeklappt, Komponenten werden hinzugefügt oder entfernt, sichtbar oder unsichtbar, aktiviert oder gesperrt. Darüber hinaus wird sich das SUT selbst im Lauf der Zeit weiterentwickeln, was sich auch in Veränderungen an der Oberfläche widerspiegelt. Auf all diese Änderungen muss QF-Test flexibel reagieren und Komponenten so zuverlässig wie möglich zuordnen können.

Dieser Prozess kann deutlich vereinfacht und gleichzeitig äußerst zuverlässig gemacht werden, indem mittels der Java Methode setName eindeutige Namen für die Komponenten des SUT vergeben werden. Wenn Sie Ihre Entwickler überzeugen können, Namen zu vergeben, die innerhalb eines Fensters eindeutig sind, werden Sie kaum Probleme mit der Wiedererkennung bekommen. Selbst drastische Änderungen an der Oberfläche können dadurch kompensiert werden. Darüber hinaus ist der mit setName vergebene Name unabhängig von der Sprache, in der die Komponenten dargestellt werden, so dass Sie mit der selben Testsuite verschiedensprachige Versionen Ihrer Software testen können. Um die Vergabe von Namen zu vereinfachen, bietet QF-Test eine Funktion, um Namen für die Komponenten vorzuschlagen, für die ein Name das Testen verbessert. Näheres dazu finden Sie bei der Option Hotkey für Komponenten.

Um die gesuchte Komponente zu finden, ermittelt QF-Test für jede Komponente im SUT die Wahrscheinlichkeit, mit der sie der gesuchten Komponente entspricht. Die Komponente mit der höchsten Wahrscheinlichkeit wird dann verwendet, sofern diese Wahrscheinlichkeit über einer frei wählbaren Schwelle liegt. Zunächst werden die Wahrscheinlichkeiten der Fenster im SUT untersucht. Anschließend wird die Suche in dem Fenster mit ausreichend hoher Wahrscheinlichkeit fortgesetzt.

Analog wird auf jeder weiteren Ebene verfahren, d.h. für jede direkten und indirekten Parentknoten des gesuchten 'Komponente' Knotens, allerdings von oben nach unten. Auf jeder Ebene werden die zum Attribut 'Klasse' passenden Komponenten ermittelt und ihre Wahrscheinlichkeit bestimmt. Unsichtbare Komponenten kommen nicht in Betracht.

Auf jeder Ebene wird die Wahrscheinlichkeit einer Komponente in mehreren Stufen ermittelt:

  • Ausgegangen wird von einer Wahrscheinlichkeit von 100%, welche durch Abweichungen von den Geometrievorgaben reduziert wird. Daraus wird die Basiswahrscheinlichkeit für das weitere Vorgehen ermittelt.
  • Für die folgenden drei Stufen gibt es nur noch das Kriterium "Treffer" oder kein "Treffer". Ist für eine Stufe kein Wert angegeben, bleibt die Wahrscheinlichkeit unverändert.
  • Als erstes wird die Struktur überprüft (außer bei Fenstern, für die diese Information nicht existiert). Für einen Treffer muss sowohl die Zahl der zuvor ermittelten Komponenten mit der passenden Klasse, als auch der Index der Komponente in dieser Liste, mit den Vorgaben übereinstimmen.
  • Im zweiten Schritt wird das 'Merkmal' und eventuelle 'Weitere Merkmale' überprüft, im dritten und letzten Schritt der mit setName() gesetzte 'Name' der Komponente.
  • Für jeden dieser drei Schritte gibt es einen frei wählbaren Bonus für den Fall eines Treffers oder eine Herabsetzung für den Fall einer Abweichung. Der Bonus bewirkt, dass die Wahrscheinlichkeit auf mehr als diesen Wert angehoben, die Herabsetzung, dass sie auf unter diesen Wert reduziert wird.
  • Die so ermittelte Wahrscheinlichkeit wird mit der Mindestwahrscheinlichkeit verglichen. Ist diese unterschritten, kommt die Komponente nicht als Zielkomponente, oder für die Suche auf der nächsten Ebene der Hierarchie, in Frage.

Für Dialoge gibt es noch einen weiteren Schritt, der die Modalität des Dialogs überprüft. Normalerweise ist ein Dialog entweder modal oder nicht modal, so dass eine Abweichung standardmäßig die Erkennung verhindert. Es kann allerdings vorkommen, dass der selbe Dialog je nach Kontext modal oder nicht modal ist. Wenn Ihr SUT einen solchen Dialog enthält, müssen Sie die "Herabsetzung für Modal" auf einen Wert oberhalb der Mindestwahrscheinlichkeit setzen.

Obwohl in diesem Prozess bereits die Suche nach dem Namen dominiert, können Sie dessen Bedeutung noch vergrößern, indem Sie die Optionen Gewichtung von Namen (Wiedergabe) und Gewichtung von Namen (Aufnahme) auf "Name übertrifft alles" setzen. In diesem Fall vereinfacht QF-Test die Suche nach einer Komponente, sofern sie einen Namen besitzt. Statt, wie oben erklärt, alle Parentcontainer von außen nach innen abzuarbeiten, werden diese übersprungen und im Fenster direkt nach einer Komponente mit passenden Namen und Klasse gesucht. Dadurch erhöht sich die Unabhängigkeit von der Struktur des GUI, die Komponente wird auch dann noch erkannt, wenn Sie eine neue Ebene zwischen Fenster und Komponente einführen oder eine solche entfernen. Als Voraussetzung für diese Methode müssen Sie sicherstellen, dass wenn ein Name vergeben wird, dieser zumindest für die gleichzeitig sichtbaren Komponenten der selben Klasse innerhalb eines Fensters eindeutig ist.

Ist eine derartige Eindeutigkeit nicht gegeben, ist "Hierarchie von Namen" die nächstbeste Einstellung für die beiden Optionen. Sie erfordert, dass zwei gleichnamige Komponenten zumindest unterschiedlich benannte Parentcontainer haben. Diese Einstellung bewahrt den Großteil der Vorteile und der Flexibilität von Namen. Die Wiedererkennung wird damit allerdings scheitern, wenn eine benannte Komponente von Ihrem Parentcontainer in einen anders benannten Parentcontainer verschoben wird.