TQL - Schritt für Schritt
Beschäftigt man sich ein wenig mehr mit Tricentis Tosca, stößt man relativ bald auf die TQL, die Tosca Query Language. Dieser Artikel beschreibt, wie Sie die TQL neben der Suche auch mit virtuellen Ordnern und beim Reporting verwenden können.
Ein schneller Einstieg
Die TQL-Suche funktioniert kontextabhängig. Das bedeutet, dass der Ausgangspunkt der Suche relevant ist. Eine Suche ausgehend vom Projektwurzelelement erzeugt andere Ergebnisse als eine Suche vom obersten Modulordner.
Die TQL ist tief in Tosca verankert. Auch der normale - einfache - Suchdialog basiert auf dieser.
Um zu sehen, was das bedeutet, suchen wir im Suchdialog zweimal den Begriff Insurant über die einfache Suche (Simple Search). Einmal ausgehend vom Projektwurzelelement und noch einmal vom obersten Modulordner aus.
TQL Such-Dialog
Das Ergebnis der einfachen Suche ausgehend vom Projektwurzelelement liefert in unserem Beispiel rund 80 Einträge (je nachdem wie oft die Ausführungslisten gestartet wurden). Ausgehend vom Modulordner sind es 4 Einträge (2 Module und 2 Bilddateien).
In den Einstellungen der Suche können Sie die Suche noch nach Testschritten einschränken, indem Sie TestSteps als Objekttyp auswählen. In dem Such-Dialog können Sie auch von der einfachen Suche zur TQL-Suche umschalten. Die Suche sieht dann so aus:
=>SUBPARTS:TestStep[(Name=?"Insurant")]
Jede Abfrage beginnt mit dem arrowOperator (Pfeiloperator) => oder ->. Wobei der Doppelpfeil => bedeutet, dass die Operation rekursiv ausgeführt wird und der einfache Pfeil ->, dass die einfache Operation ausgeführt wird. Der Ausdruck ->SUBPARTS liefert die Unterelemente, wohingegen =>SUBPARTS auch die Unterelemente der Unterelemente und die tieferen Hierarchien liefert.
Aufbau der TQL-Suche
In unserer Beispielabfrage suchen wir mit SUBPARTS alle Kindelemente. Mit SUPERPARTS würden wir Elternelemente suchen. Durch den Zusatz :TestStep schränken wir unsere Suche ein. Eine weitere Einschränkung erfolgt durch den logischen Ausdruck in den eckigen Klammern. In diesem Beispiel wird nach Testschritten, deren Name den Wert Insurant enthalten, gesucht.
Beide Einschränkungen sind optional. Wir könnten also auch alle TestSteps suchen (indem wir die Namenseinschränkung weglassen), nur nach Elementen mit dem Wert Insurant im Namen suchen oder alle Zusätze weglassen und alle Kindelemente suchen.
Beispiele mit Erklärungen
Im folgenden finden Sie Beispiele, die im Alltag einen Nutzen darstellen können. Diese bauen auf einem Tosca Basiswissen auf.
Testfälle, die keiner Ausführungsliste zugeordnet sind
Irgendwann im Laufe eines jeden Projektes kommt der Zeitunkt, wo man sich die Frage stellt, ob man nun alle gebauten Testfälle Ausführungslisten zugeordnet hat. Folgende Abfrage liefert die Antwort auf diese Frage:
=>SUBPARTS:TestCase[COUNT("ExecutionEntries")==0]
Wenn wir das nun zerlegen, suchen wir alle untergeordneten Unterelemente vom Typ TestCase. Weiters wollen wir nur die Elemente, die keiner Ausführungsliste zugeordnet sind: Das sind alle Elemente, die keinen Ausführungseintrag besitzen. Das führt zum Ausdruck der Bedingung mit [COUNT("ExecutionEntries")==0].
Unter anderen Bedingungen - wie zum Beispiel im Umgang mit Requirement Management - könnte es auch von Interesse sein, alle Testfälle zu finden, die genau einmal zugeordnet sind oder die öfter als einmal zugeordnet sind.
Von einem Element zum nächsten
Alle Testfalllinks, die keinem Testfall zugeordnet sind, sind im Requirement Management sehr interessant. An Hand dieses Beispieles können wir sehen, wie wir von einem Element zum nächsten springen können:
=>SUBPARTS:Requirement->TestCaseLink[COUNT("TestedBy")==0]
Zuerst werden alle Requirements erfasst und dann alle zugehörigen TestCaseLinks ermittelt. Zuletzt werden diese noch gefiltert indem wir nachsehen welche noch kein TestedBy tragen. Wir können also mittels des Befehls ->SUBPARTS:Requirement->TestCaseLink die TestCaseLinks suchen, die zu den Requirements gehören.
Als praktischer Helfer existiert hier die Autovervollständigung bei der Eingabe.
Verknüpfung von mehreren Abfragen
Meistens genügt bei einer genaueren Suche keine einzelne Bedingung. Will man komplexere Suchen durchführen, gerät man mit der Verwendung von Elementen sehr rasch an die Grenzen von einfacher TQL. Deswegen erlaubt die TQL zusätzlich auch Mengenoperationen. Zur Verfügung stehen hier UNION, COMPLEMENT und INTERSECTION.
Die Funktionen für die Mengenoperationen
Arbeitet man mit den Mengenoperatoren, ist mitunter auch ein absoluter Standpunkt notwendig. Für diesen Zweck kann man die Funktion PROJECT benutzen. PROJECT liefert das Projektwurzelelement unabhängig vom Startpunkt.
Der folgende Ausdruck liefert eine Liste aller Module, die in Ausführungslisten benutzt werden.
|
->PROJECT=>SUBPARTS:ExecutionList->SUBPARTS:ExecutionEntry->TestCase->SUBPARTS:TestStep->Module |
Es wird ausgehend von den Ausführungslisten über Ausführungslisteneinträge, Testfälle und Testschritte gesucht.
Meist wollen Sie aber wissen, welche Module, die Sie nicht mehr benutzen und eventuell zum Löschen vormerken können. Das bedeutet, aber auch, dass Sie alle Module benötigen, die nicht im Ergebnis der letzten Abfrage aufscheinen. Also die Komplementärmenge.
->COMPLEMENT(->PROJECT=>SUBPARTS:Module,->PROJECT=>SUBPARTS:ExecutionList->SUBPARTS:ExecutionEntry->TestCase->SUBPARTS:TestStep->Module)
Als Beispiel haben wir hier noch die Suche nach verwaisten Testfällen gewählt, also nach Testfällen, die keinem Requirement zugeordnet sind.
->COMPLEMENT(->PROJECT=>SUBPARTS:TestCase,->PROJECT->AllOwnedSubItems:TCFolder[PossibleContent =? "Requirement"]=>SUBPARTS:Requirement->TestCaseLink->TestedBy)
Betrachtet man die einzelnen Bestandteile, ergibt sich folgendes Bild der hier beschriebenen mit COMPLEMENT abgebildeten Komplementärmenge. Der erste String ->PROJECT=>SUBPARTS:TestCase beschreibt die Menge aller Testfälle im Projekt. Der zweite String ist länger und es ist von Vorteil, diesen aufzuteilen:
Der erste Teil dieses langen Strings sucht mit ->PROJECT->AllOwnedSubItems:TCFolder[PossibleContent =? "Requirement"] alle Ordner unterhalb der Projektwurzel, die Requirement-Ordner sind. Der weitere Teil =>SUBPARTS:Requirement->TestCaseLink->TestedBy erfasst zuerst alle Unterelemente, die ein Requirement sind. Von dort werden die Objekte TestCaseLink erfasst und dann mit TestedBy alle zugeordneten Testfälle.
Die Komplementärmenge der Testfälle, die durch ein TestedBy mit einem Requirement verlinkt sind, zu allen Testfällen ist die Menge aller verwaisten Testfälle.
TQL in virtuellen Ordnern und Reports
Die Leistungsfähigkeit der TQL wird in Tricentis Tosca für verschiedene Funktionen genutzt. TQL Abfragen können beispielsweise in virtuellen Ordnern gespeichert werden. Dazu wird an der gewünschten Stelle im Projektbaum ein virtueller Ordner erstellt. Im Reiter Eigenschaften wird unter Query, die gewünschte TQL-Abfrage eingetragen.
TQL-Abfrage in virtuellem Ordner speichern
Das Ergebnis eben dieser TQL-Abfrage wird als Inhalt des virtuellen Ordners dargestellt.
Virtueller Folder - Ansicht
Das hat mehrere Vorteile. Neben einer übersichtlichen Darstellung von regelmäßig benötigten Abfragen, ist es damit beispielsweise auch möglich, diese Abfragen als Reports auszugeben. Die angezeigten Objekte können direkt im virtuellen Ordner bearbeitet werden. Der virtuelle Ordner selber stellt aber nur eine Sicht auf die Objekte dar. Bei der Erstellung eines virtuellen Ordners ist darauf zu achten, dass die Abfrage relativ zur Position des virtuellen Ordners abgesetzt wird.
Für die Ausgabe eines virtuellen Ordners als Report, kann über das Kontexmenü des virtuellen Ordners mit Create Report from virtual folder ein Report erstellt werden.
Der Report wird im Ordner Reporting unter GeneratedReports angelegt.
Aus virtuellem Ordner erstellter Report
Checkliste für TQL
|
Ist der Ausgangspunkt richtig gewählt? |
|
Werden die Pfeiloperatoren richtig benutzt? Suche ich in den richtigen Ebenen? |
|
Wenn Sie einmal stecken bleiben: Es gibt in 90% der Fälle mehr als einen Lösungsweg. Denken Sie beispielsweise nicht nur an SUBPARTS, denken Sie auch SUPERPARTS. |
Benötigen Sie Hilfe ,
|
Sonderzeichen werden von Tosca für bestimmte Funktionen verwendet. Soll ein Sonderzeichen als Wert verwendet werden, muss der umgekehrten Schrägstrich (Backslash) als Escape-Zeichen verwendet werden. (Beispiel: [Name == "a\\b"] wenn der Name a\b ist). |
Weiterführende Themen in der Online Hilfe sind:
Kleine Beispiele für den Alltag (sehen Sie diese als Inspiration)
sowie alle Bereiche in den folgenden Kapiteln: Verwendung von TQL in Virtuellen Ordnern, im Testdatenmanagement, oder Reporting.
|
Sie haben Beispiele aus der Praxis und würden Sie gerne teilen? Auch Änderungswünsche und Verbesserungsvorschläge nehmen wir gerne entgegen. Benutzen Sie die Feedbackfunktion und nehmen Sie mit uns Kontakt auf. |