Robot Companion.
Abschnitte

    Robot Companion.

    Deine Testdateien erklären sich längst selbst. Diese Erweiterung macht es sichtbar.

    Eine Erweiterung für VS Code, gebaut für Robot Framework. In deinen .robot-Dateien stehen die Erklärungen längst — in [Documentation]-Blöcken und in ganz gewöhnlichen Kommentaren. Die Erweiterung setzt sie als Fließtext in ein Panel neben dem Editor, das dem Cursor folgt. Und weil ein Test nur zur Hälfte aus Text besteht, liest sie außerdem deine Python-Keyword-Bibliotheken und sagt dir, was ein Keyword wirklich zurückgibt — genau da, wo du es gleich benutzt.

    Die Erweiterung bringt keinen Formatter mit, keine Diagnostics, keinen Language Server. Was du sonst an Robot-Framework-Werkzeugen einsetzt, bleibt unangetastet — sie stellt sich nur daneben.

    Hier steht die Begründung, in der Referenz die Bestandsaufnahme: jede Fähigkeit, jede Grenze und das, was jeder Teil von deinem Projekt verlangt.

    01Die Idee

    Zwei Zeichen machen aus einem Kommentar ein Dokument

    Robot Framework gibt dir [Documentation] — einen Block, ganz oben, weit weg von den Schritten, die er beschreibt. Also landet die eigentliche Erklärung dort, wo Erklärungen immer landen: in Kommentaren, direkt neben der Zeile, um die es geht — wo kein Werkzeug sie darstellt und außerhalb des Editors niemand sie je zu sehen bekommt.

    Robot Companion liest zwei Kommentarmarker. #> macht aus einer Kommentarzeile Dokumentation, #>> hängt eine Ebene darunter. Mehr Syntax gibt es nicht. Alles Weitere — Überschriften, Aufzählungen, nummerierte Listen, Pfeilnotizen für erwartete Ergebnisse — ist gewöhnliches Markdown zwischen diesen Markern. Die Datei bleibt dabei eine völlig normale Robot-Datei: Nimm die Erweiterung weg, und übrig bleiben Kommentare.

    suites/checkout.robotwas du schreibst
    *** Test Cases ***
    Express Checkout Delivers On The Promised Date
        [Documentation]
        ...    Covers the express lane end to end: a
        ...    basket is built, the order is placed with
        ...    express shipping, and then checked.
        ...
        ...    - Express orders must quote a delivery
        ...        date; standard orders need not.
        ...        -> The date shows on the receipt.
        [Tags]    Checkout    Checkout-Express    Smoke
    
        #> ## Prepare the basket
        #> - Start from a clean basket so the totals
        #>   stay predictable.
        ${sku}=       Set Variable    DESK-LAMP-002
        ${basket}=    Add Item To Basket    sku=${sku}
        #>> -> The basket id is reused by later steps.
    
        #> ## Place the order
        #> - Express shipping is the case under test.
        ${order}=    Place Order    basket_id=${basket}
        ...          shipping=EXPRESS
        #>> -> <success>Confirmation returned.</success>
    
        #> ### What we then assert
        #> 1. The payment was at least authorised.
        #> 2. A tracking id exists.
        #> 3. The delivery date is a real date.
        #>> -> <note>Demo fixtures, not real data.</note>
        Should Be Equal    ${order.payment_state}
        ...                AUTHORISED
    die Datei. Immer noch eine ganz normale Robot-Suite.
    Das Panel Documentation Preview mit dem Dateinamen, einer Aktionsleiste
                    zum Falten und Exportieren, einer Liste der drei Test Cases in der Datei, von
                    denen der erste ausgewählt ist, und darunter der gesetzten Dokumentation: ein
                    einleitender Absatz, ein Aufzählungspunkt mit eingerückter Pfeilnotiz, die
                    Überschriften Prepare the basket, Place the order und What we then assert, eine
                    grün hinterlegte Erfolgsnotiz, eine blau hinterlegte Notiz sowie die Abschnitte
                    Variables und Returned Variables, die die lokale Variable sku mit ihrem Wert
                    und die beiden aus Keyword-Aufrufen zugewiesenen Variablen aufführen.
    das Panel. Aus dieser Datei gesetzt, mit dem Cursor synchron.

    Zu diesem Bild. Es zeigt das echte Markup der Documentation Preview: Der Renderer der Erweiterung ist über die Datei links gelaufen, eingefärbt ist das Ergebnis mit den Farbwerten von Dark Modern aus VS Code. Also echte Ausgabe, keine Attrappe — aber eben kein Foto eines laufenden Editorfensters, deshalb fehlt drumherum die Oberfläche von VS Code.

    02Darstellung

    Text, der die Quelle überlebt

    Quellzeilen sind kurz, weil Editoren schmal sind; Sätze sind es nicht. Aufeinanderfolgende Dokumentationskommentare wachsen deshalb wieder zu einer durchlaufenden Zeile zusammen, und eine Fortsetzung, die unter einem Aufzählungspunkt oder einem Pfeil eingerückt steht, bleibt bei diesem Punkt, statt ihn zu zerreißen. Willst du wirklich einen Umbruch, dann setz ein <br>. Für umbrochene Fortsetzungszeilen von [Documentation] gilt dasselbe.

    Jede gesetzte Zeile weiß, woher sie stammt. Klicke im Panel auf einen Absatz, eine Aufzählung, eine Pfeilnotiz oder eine Überschrift, und der Editor springt genau auf die Quellzeile dahinter — auch auf spätere Zeilen in Blöcken, die einen [Documentation]-Kopf und weiter unten Inline-Marker mischen.

    Farbe, die etwas bedeutet

    Im Dokumentationstext kennt die Erweiterung fünf semantische Tags und acht schlichte Farb-Tags. Sie erscheinen im Panel und im druckfertigen Export; einen Markdown-Export überstehen sie unverändert, als genau die Tags, die du geschrieben hast. Alles andere — unbekannte Tags, Attribute, beliebiges HTML — kommt als reiner Text heraus, ausgeführt wird nichts davon.

    Dazu <red>, <orange>, <yellow>, <green>, <blue>, <pink>, <purple>, <gray> und <color value="#0f766e"> für den seltenen Sonderfall.

    03Typen

    Was gibt mir dieses Keyword eigentlich zurück?

    Die Frage, die du hundertmal am Tag stellst, wenn ein Robot-Test eine Python-Bibliothek steuert. Die Antwort steht in den Typannotationen der Bibliothek, drei Dateien weiter. Robot Companion liest die Python-Quellen deines Workspace und legt einen Index an — statisch, nur lesend; importiert oder ausgeführt wird nichts. Danach reicht ein Hover.

    Die Erweiterung sammelt die Bibliotheksmethoden ein, die du mit @keyword dekoriert hast, mit ihren Parameter- und Rückgabeannotationen und ihrem Docstring. Danach geht sie den Rückgabetyp durch: Dataclasses, einfach annotierte Klassen, @property-Member und den Elementtyp in einem list[…] oder einem ähnlichen Container.

    resources/ShopLibrary.pydeine Bibliothek
    @keyword("Place Order")
    def place_order(
        self,
        basket_id: str,
        shipping: ShippingMethod = ShippingMethod.STANDARD,
        gift_wrap: bool = False,
    ) -> OrderConfirmation:
        """Place the prepared basket and return the
        shop's confirmation.
    
        Args:
            basket_id: Identifier of a basket built by
                `Add Item To Basket`.
            shipping: Which shipping method was picked.
    
        Returns:
            The confirmation object.
        """
    indexiert. Als Quelltext gelesen, nie importiert.
    ${order}aufgelöste Zugriffspfade
    ${order.order_id}
    ${order.total_cents}
    ${order.currency}
    ${order.payment_state}
    ${order.ship_to}
    ${order.parcels}
    ${order.total}
    
    # second level
    ${order.ship_to.street}
    ${order.ship_to.postcode}
    ${order.ship_to.city}
    ${order.ship_to.country}
    ${order.parcels[0].tracking_id}
    ${order.parcels[0].method}
    ${order.parcels[0].delivers_on}
    die Antwort. Erste und zweite Ebene des Rückgabewerts, so wie der Resolver sie ausgibt; nur die Trennlinie stammt von uns.

    Achte darauf, was da steht: kein Diagramm eines Typs, sondern genau die Zeichenketten, die du als Nächstes tippen würdest — den Index in die Liste inklusive. Genau das bietet die Seitenansicht Robot Return Explorer für die Variable unter deinem Cursor an, und flacher bekommst du dasselbe beim Hover über jede Variable, die aus einem Keyword-Aufruf stammt.

    Darunter sitzt ein technischer Abschnitt für die Fälle, in denen du nicht die Pfade willst, sondern die Form — der aufgelöste Typgraph, an jedem Knoten mit der Angabe, als was er erkannt wurde:

    technisches DetailStandardtiefe 5
    OrderConfirmation (dataclass)
      .order_id
      .total_cents
      .currency
      .payment_state
      PaymentState (typed class)
      .ship_to
      Address (dataclass)
        .street
        .postcode
        .city
        .country
      .parcels
      Parcel (dataclass)
        .tracking_id
        .method
        ShippingMethod (typed class)
        .delivers_on
      .total

    Aus demselben Index kommen drei Arten von Vorschlägen, und alle drei gibt es nur in Wertpositionen benannter Argumente — hinter argument=, wo ein falscher Tipp dich einen Testlauf kostet:

    Der Hover löst auch ganz schlichte lokale Werte auf: Stell den Cursor auf eine Variable, die weiter oben im selben Test aus Set Variable oder VAR kommt, und du siehst, was drinsteht. Auch den mehrdeutigen Fall: Hat eine Bedingung ihr zwei mögliche Werte gegeben, sagt der Hover genau das, statt sich für einen zu entscheiden.

    Ehrliche Grenzen. Das hier ist statische Analyse von Python-Quelltext, keine Introspektion zur Laufzeit: Aufgelöst wird, was in den Annotationen steht. Keywords ohne @keyword-Dekorator, dynamische Bibliotheken und Rückgaben ohne Annotation bleiben unsichtbar. Und wenn eine Zuordnung mehrdeutig ist, sagt die Keyword-Dokumentationsansicht genau das, statt zu raten.

    04Lange Tests lesen

    Falten entlang des Gedankengangs

    Ein Test Case mit fünfhundert Zeilen ist vollständig aufgeklappt unlesbar und vollständig zugeklappt nutzlos. Weil die Erweiterung ohnehin weiß, welche Zeilen Überschriften sind, welche Dokumentationsschritte und welche die Robot-Schritte darunter, kann sie auf diese Ebenen falten statt auf Klammern: Headlines lässt die Abschnittstitel hinter #> ## stehen, Steps lässt die Dokumentationszeilen stehen, Unfold stellt alles wieder her.

    Das Falten kommt als ganz gewöhnlicher Folding-Range-Provider von VS Code und fügt sich damit in den Editor ein, den du ohnehin hast. Willst du die Ebenen auf den üblichen Tastenkürzeln zum Falten haben, macht ein Befehl die Erweiterung zum Standardprovider für Robot-Dateien.

    Über jedem Dokumentationsblock steht eine CodeLens — Open rendered documentation preview —, die ihn im Panel öffnet. Das Panel führt außerdem eine Liste aller dokumentierten Test Cases und Keywords der Datei; die ist zugleich das Inhaltsverzeichnis, mit einem Sprunglink je Eintrag.

    05Weitergeben

    Die Dokumentation ließ sich immer schon weitergeben

    Irgendwann fragt jemand, was ein Test tut, und dieser Jemand hat VS Code nicht offen. Vier Export-Befehle nehmen den aktuellen Block oder eine Mehrfachauswahl von Blöcken und erzeugen daraus entweder eine Markdown-Datei — abgelegt, wo du willst, und die Farb-Tags bleiben, wie du sie geschrieben hast — oder eine für den Druck gesetzte Seite mit einer Schaltfläche Print / Save as PDF darauf.

    Export as Markdownechte Ausgabe, auf die Breite umbrochen
    # Express Checkout Delivers On The Promised Date
    
    Covers the express lane end to end: a basket is built,
    the order is placed with express shipping, and then
    checked.
    
    - Express orders must quote a delivery date; standard
      orders need not.
        -> The date shows on the receipt.
    ## Prepare the basket
    - Start from a clean basket so the totals stay
      predictable.
      -> The basket id is reused by later steps.
    ## Place the order
    - Express shipping is the case under test.
      -> <success>Confirmation returned.</success>
    ### What we then assert
    1. The payment was at least authorised.
    2. A tracking id exists.
    3. The delivery date is a real date.
      -> <note>Demo fixtures, not real data.</note>
    
    ## Variables
    
    - `${sku}`: DESK-LAMP-002
    markdown. Umbrochene Quellzeilen, wieder zusammengefügt.
    Die druckfertige Exportseite: eine Werkzeugleiste mit der Schaltfläche
                   Print / Save as PDF und dem Hinweis, den Druckdialog zu benutzen und dort Save
                   as PDF zu wählen, dann der Dateipfad, der Titel des Test Cases als Überschrift
                   und dieselbe Dokumentation, für den Druck gesetzt, mit ihren Überschriften,
                   Aufzählungen, Pfeilnotizen, farbigen semantischen Auszeichnungen und den
                   Abschnitten Variables und Returned Variables.
    druck. Derselbe Block, für Papier gesetzt.

    Beide Exporte nehmen die Abschnitte Variables und Returned Variables des Blocks mit: die lokalen Werte, die die Erweiterung aufgelöst hat, und zu jeder zurückgegebenen Variablen das Keyword, aus dem sie stammt. Das exportierte Dokument erklärt damit die Daten des Tests genauso wie seine Schritte.

    06Zurückhaltung

    Was die Erweiterung bewusst nicht tut

    Das Regal mit Robot-Framework-Werkzeugen für VS Code ist gut gefüllt, und die meisten davon wollen den Editor für sich. Diese Erweiterung steuert zwei Webview-Ansichten bei, einen CodeLens-Provider, einen Folding-Range-Provider, einen Hover-Provider und einen einzigen Completion-Provider. Mehr Fläche beansprucht sie nicht.

    Wo sie doch etwas kostet, sagt sie es. Einen Workspace zu indexieren ist echte Arbeit, deshalb liegen der Index und die aufgelösten Rückgabetypen im Cache: im Speicher, auf Wunsch pro Workspace auch auf der Platte. Welche Wurzelverzeichnisse durchsucht werden, stellst du selbst ein, und wenn du ganz sichergehen willst, gibt es Invalidate All Caches.

    07Beiträge

    Alles, was die Erweiterung beiträgt

    BeitragWas es ist
    Documentation Preview Webview in der Seitenleiste. Gesetzte Dokumentation für den Block am Cursor, ein Inhaltsverzeichnis der Datei, zeilengenaue Sprünge in den Quelltext, Aktionen zum Falten und Exportieren.
    Robot Return Explorer Webview in der Seitenleiste. Für das Keyword unter dem Cursor: die aufgelöste Rückgabestruktur, der Argumentkontext und der indexierte Docstring des @keyword in Python, mit Sprunglinks auf die Definition.
    Hover Lokale Werte aus Set Variable / VAR, Enum-Member hinter einem benannten Argument und die Struktur des Rückgabewerts eines Keywords.
    Completion Nur in Wertpositionen benannter Argumente: Enum-Member, typgleiche lokale Variablen und ${var.}-Rückgabe-Member.
    CodeLens Eine Lens je Dokumentationsblock, die ihn in der Vorschau öffnet.
    Folding Bereiche, die die Dokumentation kennen, dazu die Befehle fold-to-headlines / fold-to-steps / unfold.
    12 Befehle Fokussieren, aktuellen Block öffnen, vier Exporte, vier Falt-Befehle, Ausgabe anzeigen, Caches verwerfen.
    35 Einstellungen Jeder Hover, jede Completion und die CodeLens lassen sich einzeln abschalten; Tiefen, Grenzen, Index-Wurzeln, Ausschlüsse, Cache-Größe und Log-Level sind einstellbar.

    Jeder davon ist in der Referenz beschrieben, mit seinen echten Grenzen und den Voraussetzungen, von denen er abhängt — einschließlich der Teile dieser Erweiterung, die stillschweigend nichts tun, solange deine Python-Keywords nicht eine bestimmte Form haben. Die Einstellungstabelle im README und der Marketplace-Eintrag führen dieselbe Liste mit allen Standardwerten.

    08Installation

    Öffne eine .robot-Datei

    Die Erweiterung liegt im Visual Studio Code Marketplace, unter der Kennung StochasticEntropy.robot-markdown-companion. Suche in der Extensions-Ansicht nach Robot Companion — oder nimm eine Zeile:

    aus dem Marketplaceder veröffentlichte Build
    # in VS Code's Quick Open bar — Ctrl/Cmd + P
    ext install StochasticEntropy.robot-markdown-companion
    
    # or from a shell, with the code CLI on your PATH
    code --install-extension StochasticEntropy.robot-markdown-companion

    Wenn du sie lieber selbst baust, statt einem Eintrag im Marketplace zu vertrauen: Das Repository packt sein eigenes .vsix. Das package-Skript ist dasselbe, aus dem auch der veröffentlichte Build entsteht; es legt robot-markdown-companion-<version>.vsix im Klon ab.

    aus dem QuelltextNode 20+, VS Code 1.85+
    git clone https://github.com/StochasticEntropy/robot-companion
    cd robot-companion
    npm install
    npm run package
    code --install-extension robot-markdown-companion-*.vsix

    So oder so — das ist die ganze Einrichtung. Die Erweiterung aktiviert sich bei Robot-Dateien, indexiert den Workspace im Hintergrund, und die Panels erscheinen unter ihrem Symbol in der Activity Bar. Konfigurieren musst du vorher nichts; die 35 Einstellungen sind für später, wenn du weißt, was du ändern willst.

    Das funktioniert auf jeder .robot- oder .resource-Datei, ganz gleich, ob eine andere Erweiterung die Sprach-ID von Robot Framework für sich beansprucht hat — die Provider greifen ebenso über das Dateimuster wie über die Sprache.

    09Anderswo

    Der Eintrag, der Quelltext, der Posteingang

    Nichts auf dieser Seite ist die maßgebliche Fassung von irgendetwas. Diese hier sind es.