Tango ist eine Beschreibungssprache zur Beschreibung von Software und ihrer Benutzeroberfläche aus Benutzersicht. Beschrieben werden statische Eigenschaften, z. B. dieses Fenster besteht aus folgenden fünf Bedienelementen: … dynamische Eigenschaften, z. B. beim Betätigen dieser Taste geschieht Folgendes: …
Die Tango-Spezifikation enthält nur Informationen über die Reaktionen der Applikation, nicht über deren Implementierung.
Herkunft
Die erste dokumentierte Verwendung war ca. 1989 in einer Abnahmetest-Analyse (ATA) als vorgeschaltetes Dokument zur Erstellung von Testspezifikationen (ATS) und Testprozeduren (ATP) gemäß der Digital-Projektmethodik DPM der Firma Digital Equipment Corporation. Die ATA ist ein stark vernetztes SGML-Dokument aus Listen und Tabellen, mit denen die Zustandsübergänge der Applikation beschrieben werden.
Seit ca. 1994 existiert eine Textversion dieser Beschreibungsmethode, die ohne die Nutzung aufwendiger SGML-Editoren wie VaxDocument und LSE erstellt werden kann. Seit dieser Zeit ist diese Beschreibung unter dem Namen Tango bekannt (Testanalyse-Notation für grafische Oberflächen).
Die Spezifikationssprache war lange Zeit nicht verbindlich dokumentiert, und es fehlen geeignete Werkzeuge, welche die in sich stark vernetzte Spezifikation effizient verwalten könnten. Dies dürften Gründe für die geringe Verbreitung der Beschreibungsmethode sein.
Im Jahre 2005 wurde die Syntax und die Beschreibungsmethodik erstmals vollständig beschrieben. Dabei wurde die Spezifikationssprache in wesentlichen Teilen überarbeitet zur Version Tango 1.5. Gegenüber früheren Versionen ist die Beschreibung deutlich stärker formalisiert.
Anwendung
Die SGML-Version konnte ausschließlich zur Niederschrift von Zustandsübergängen verwendet werden. Der Nutzen lag in der Reduktion der Beschreibungskomplexität durch die Betrachtung von aufeinander aufbauenden funktionalen Ebenen im zu beschreibenden System, ähnlich dem OSI-Schichtenmodell zur Beschreibung von Kommunikationsvorgängen. Die Bedienelemente eines Systems wurden durch Auswertung der Zustandsübergänge ermittelt, wobei die statische Beziehung der Elemente untereinander keine Rolle spielte und deshalb auch nicht direkt beschrieben werden konnte.
Die diversen Textversionen wurden umfangreich genutzt zur Beschreibung von Vorgängen, speziell Anwendungsszenarios und Testabläufe. Diese Tango-Beschreibungen sind generell wenig formalisiert und nutzen im Wesentlichen nur die Möglichkeit, Ursache-Wirkungs-Zusammenhänge sowie die Detaillierung von einzelnen Schritten effizient darzustellen.
Zur Spezifikation von Systemen auf fachlicher Ebene wurden die Textversionen vereinzelt verwendet. Das Fehlen geeigneter Werkzeuge begrenzt den Umfang der Beschreibung, so dass der Detaillierungsgrad reduziert oder nur Teilsysteme beschrieben wurden.
Beispiel
Die Anwendung von Tango 1.5 wird an einem zusammenhängenden Beispiel demonstriert. Im Folgenden wird anhand der ersten Schritte einer Linux-Installation von CD gezeigt, wie dynamische und statische Eigenschaften einer Applikation beschrieben werden.
Dieses Beispiel enthält die meisten der gebräuchlichen Sprachkonstrukte von Tango. Dies ist keine umfassende Einführung, es wird demonstriert, wie eine Tango-Spezifikation prinzipiell zu lesen ist.
Grundlegende Struktur
Eine Tango-Spezifikation beschreibt Aspekte eines Systems sowie deren Zusammenhänge untereinander. Jede Aussage über das System wird als Aspekt bezeichnet. Die Spezifikation besteht aus einer ungeordneten Sammlung von Aspekten in jeweils einem Definitionsblock. Jeder dieser Aspekte kann anschließend durch zusätzliche Aspekte im Definitionsblock beschrieben oder detailliert werden.
Die Beispiel-Spezifikation besteht aus Definitionsblöcken, eingeleitet mit dem Ausrufezeichen !.
Diese Blöcke beschreiben den Installationsvorgang: !+LinuxInstallation …
einige Zustände des PCs !$PC …
und drei Fenster !#WnSpracheWählen … !#WnGrundeinstellungen … !#WnLinuxInstallieren …
Detaillierung durch Einrücken Ein Aspekt in einer Zeile wird genauer beschrieben durch zusätzliche Aspekte in den folgenden Zeilen, die gegenüber dem übergeordneten Aspekt eingerückt sind. Die untergeordneten Aspekte sind normalerweise mit einem Punkt eingeleitet. !#WnSpracheWählen .TxWillkommenBeiYast2 .TxAnleitung …
Beschreibung von Vorgängen Der Ablauf der LinuxInstallation umfasst drei Schritte in der gegebenen Reihenfolge: !+LinuxInstallation => - {CD einlegen, Rechner starten} - {warten bis der erste Bildschirm erscheint} - *WnSpracheWählen.OPEN
Zusätzlich ist beschrieben, dass das Tastaturlayout anfänglich auf „Englisch“ gesetzt ist. .PC.Tastaturlayout := "Englisch"
Dieser Anfangswert ist kein separater Schritt, sondern eine allgemein gültige Information in diesem Ablauf, und deshalb mit einem einführenden Punkt notiert, während die einzelnen Schritte des Ablaufs mit dem Minus-Zeichen markiert sind.
Beschreibung statischer Strukturen Das Fenster WnSpracheWählen besteht aus zwei Textpassagen TxWillkommenBeiYast2 und einer Anleitung TxAnleitung !#WnSpracheWählen .TxWillkommenBeiYast2 .TxAnleitung
dazu einem nicht näher spezifizierten Bedienelement, mit dem eine einzelne Sprache aus einer Liste gewählt werden kann .SsSprache
sowie zwei bedienbare Tasten, mit denen Aktivitäten des Systems ausgelöst werden können .+BtInstallationAbbrechen .+BtWeiter
Mit diesen beiden Aktivatoren beginnt die Beschreibung der dynamischen Eigenschaften. Das Öffnen des Fensters selbst ist ebenfalls ein Vorgang, der als weiterer Aktivator beschrieben wird .+OPEN
Beschreibung dynamischer Eigenschaften Wenn eine Sprache aus der Liste in SsSprache gewählt wird, d. h. der Aktivator einer Sprache in der Liste wird ausgelöst, dann ändert sich die sichtbare Selektion in dieser Liste sowie die Sprache der Textpassagen .SsSprache ...+Sprache => .TxWillkommenBeiYast2.Sprache := {diese Sprache} .TxAnleitung.Sprache := {diese Sprache} .SsSprache.SELEKTION := {diese Sprache}
Mit der Taste BtInstallationAbbrechen kann die Installation abgebrochen werden, dieser Vorgang muss vorsichtshalber bestätigt werden. Erst nach Bestätigung durch den USER wird der Installationsvorgang tatsächlich beendet. Falls der USER dies nicht will, wird die Installation fortgesetzt. .+BtInstallationAbbrechen => ? USER << "Wirklich abbrechen?" = = "Ja, abbrechen" => .{Installation beendet} .*WnSpracheWählen.CLOSE = "Nein, weitermachen" => .NICHTS_TUN
Mit der Taste BtWeiter wird das aktuelle Fenster WnSpracheWählen geschlossen und das nächste Fenster WnGrundeinstellungen geöffnet. .+BtWeiter => .*WnSpracheWählen.CLOSE .*WnGrundeinstellungen.OPEN
Markierung mit Sonderzeichen Die Aspekte der Beschreibung sind nach ihrer jeweiligen Funktion markiert: der Punkt . kennzeichnet einen Eintrag in einer ungeordneten Liste von Elementen oder Handlungen das Minuszeichen - kennzeichnet einen Schritt, der beendet sein muss, bevor der Nächste beginnen kann der Gartenzaun # kennzeichnet ein Fenster der Applikation das Pluszeichen + kennzeichnet einen Aktivator, der betätigt werden kann, um eine Handlung auszulösen das Dollarzeichen $ kennzeichnet einen Status das Paragraphenzeichen § kennzeichnet eine Randbedingung oder Erläuterung mit => wird die Beschreibung einer Handlung eingeleitet das Fragezeichen ? leitet eine Abfrage ein, die möglichen Alternativen sind mit dem Gleichzeichen = markiert Freitext-Beschreibungen sind in geschweifte Klammern {…} gesetzt Werte sind in Doppel-Hochkomma "…" gesetzt Alternative Werte stehen in eckigen Klammern […|…], getrennt durch einen senkrechten Strich ein Kommentar reicht vom einleitenden // bis zum Ende der Zeile ein mehrfach auftretendes Element (eine Liste) wird durch drei führende Punkte eingeleitet.
Eine Liste besteht aus mehreren gleichartigen Elementen. Die Listenelemente werden durch nachfolgende eingerückte Aspekte beschrieben. Im Beispiel können die Listenelemente aus der Zeitzonenliste durch Anklicken ausgewählt werden, dadurch wird die Zeitzone des PC gesetzt: .SsZeitzone ...+Zeitzone => .$PC.Zeitzone := {diese Zeitzone}
Markierung mit Spezialisierungspräfix Ein Aspekt kann durch einen Spezialisierungspräfix markiert sein, so dass seine Funktion leichter erkennbar ist. Diese Spezialisierungspräfixe sind nicht Teil der Tango-Syntax, sie sind frei definierbar und können verwendet werden, um die Beschreibung an das jeweilige Fachgebiet anzupassen.
Die folgenden Präfixe werden genutzt, um den Installationsvorgang der Software im Beispiel zu beschreiben: Fenster werden mit Wn (window) eingeleitet, reiner Anzeigetext mit Tx (text), editierbarer Text mit Et (edit text) und Tasten mit Bt (button). Radiobuttons sind mit Rb markiert. Dabei wird eine Gruppe von Radiobuttons gewöhnlich als ein einziges Element notiert: .RbInstallation : [ "Neuinstallation" | "Update" ] Eine Liste, aus der genau ein Element gewählt werden kann, wird mit Ss (select single) markiert. Hier wird offengelassen, ob dieser Aspekt durch eine Liste, eine Combobox, mehrere Radiobuttons oder in anderer Weise implementiert wird.
Navigation mit Pfaden Ein Pfad identifiziert einen Aspekt, indem der Weg, ausgehend vom obersten Aspekt eines Definitionsblocks bis zum gewünschten Aspekt notiert wird. Dabei wird jeder Schritt durch einen Punkt vom nächsten getrennt. WnSpracheWählen.TxAnleitung
Der Pfad muss nicht am obersten Aspekt eines Definitionsblocks beginnen, er muss lediglich den Aspekt eindeutig identifizieren. Oftmals genügt allein der Name des Aspekts als Pfad.
Vollständiges Beispiel !+LinuxInstallation => .PC.Tastaturlayout := "Englisch" - {CD einlegen, Rechner starten} - {warten bis der erste Bildschirm erscheint} - *WnSpracheWählen.OPEN
!$PC .$Tastaturlayout // aktuelle Tastenbelegung .$Zeitzone
!#WnSpracheWählen .+OPEN => .?{erstmals angezeigt} = = "Ja, erstes Fenster" => .TxWillkommenBeiYast2.Sprache := "Englisch" .TxAnleitung.Sprache := "Englisch" = "Nein, durch Zurück-Knopf geöffnet" => .TxWillkommenBeiYast2.Sprache := {Sprache im letzten Fenster} .TxAnleitung.Sprache := {Sprache im letzten Fenster} .TxWillkommenBeiYast2 .TxAnleitung .SsSprache ...+Sprache => .TxWillkommenBeiYast2.Sprache := {diese Sprache} .TxAnleitung.Sprache := {diese Sprache} .SsSprache.SELEKTION := {diese Sprache} .+BtInstallationAbbrechen => ? USER << "Wirklich abbrechen?" = = "Ja, abbrechen" => .{Installation beendet} .*WnSpracheWählen.CLOSE = "Nein, weitermachen" => .NICHTS_TUN .+BtWeiter => .*WnSpracheWählen.CLOSE .*WnGrundeinstellungen.OPEN
!#WnGrundeinstellungen .+OPEN => .TxAnleitung.Sprache := {Sprache im letzten Fenster} .SsTastaturlayout := PC.Tastaturlayout .SsZeitzone := PC.Zeitzone .TxAnleitung .SsTastaturlayout ...+Tastaturlayout => .$PC.Tastaturlayout := {dieses Tastaturlayout} .SsZeitzone ...+Zeitzone => .$PC.Zeitzone := {diese Zeitzone} .EtTastaturtest .§{nur zum Ausprobieren, ohne Funktion} +BtZurück => .*WnSpracheWählen.OPEN .*WnGrundeinstellungen.CLOSE +BtInstallationAbbrechen => ? USER << "Wirklich abbrechen?" = = "Ja, abbrechen" => .{Installation wird beendet} .*WnGrundeinstellungen.CLOSE = "Nein, weitermachen" => .NICHTS_TUN +BtWeiter => .*WnGrundeinstellungen.CLOSE .*WnLinuxInstallieren.OPEN
!#WnLinuxInstallieren .+OPEN => .TxAnleitung.Sprache := {Sprache im letzten Fenster} .RbInstallation := "Neuinstallation" .TxAnleitung .RbInstallation : [ "Neuinstallation" | "Update" ] .+BtZurück => .*WnGrundeinstellungen.OPEN .*WnLinxInstallieren.CLOSE .+BtInstallationAbbrechen => ? USER << "Wirklich abbrechen?" = = "Ja, abbrechen" => .{Installation wird beendet} .*WnLinuxInstallieren.CLOSE = "Nein, weitermachen" => .NICHTS_TUN +BtWeiter => ...
Abschließende Anmerkungen