Anmeldeformular
Formular ausfüllen, absenden. Die Mailadresse erzeugt der Lauf selbst; eine feste wäre beim zweiten Durchgang längst vergeben.
gibt weiter {{mailadresse}}
Vor jeder Lieferung derselbe Weg: Setup anlegen oder ein bestehendes nehmen, anmelden, Mail dorthin schicken, im nächsten System nachsehen. In Penguflow klickt man diesen Weg einmal zusammen und startet ihn danach per Knopfdruck, so oft man will.
Formular ausfüllen, absenden. Die Mailadresse erzeugt der Lauf selbst; eine feste wäre beim zweiten Durchgang längst vergeben.
gibt weiter {{mailadresse}}
Ab hier ein anderes System. Die Mail braucht ein paar Sekunden, also wird gewartet, bis sie da ist. Aus ihr kommt der Bestätigungslink.
gibt weiter {{bestaetigungslink}}
Link öffnen, anmelden. Geht das durch, hat der Vorgang drei Systeme hinter sich.
Ende der Kette
Es ist derselbe Ablauf, nur der Anlass ist jedes Mal ein anderer. Gemeint sind Teams, für die ein eigenes Testautomatisierungsteam nicht in Frage kommt: ein paar Systeme, ein Dutzend Lieferungen im Jahr — und davor jedes Mal jemand, der von Hand durchklickt.
Gegen die eigene Maschine, mit den eigenen Zugangsdaten. Einmal zusammengeklickt, läuft er auf Knopfdruck — auch beim vierten Mal an diesem Vormittag.
Gegen eine Umgebung, die bestehen bleibt, und immer wieder statt einmal vor der Abnahme. Eine Verschiebung in der Landschaft fällt damit auf, solange sie noch billig zu beheben ist.
Portal, ERP-Maske, Archiv: drei Anmeldungen, ein Vorgang, ein Protokoll. Was zwischen den Systemen passiert, deckt keine der einzelnen Testsuiten ab. Dort sitzen die Fehler, die niemandem gehören.
Den Ablauf einmal zusammenklicken, bei jeder Lieferung wieder fahren. Zeiten, Werte und Wiederholungen stehen danach im Protokoll und gehen so in die Abnahme.
Was im Ticket steht — Kundennummer, Artikel, Menge — geht als Eingabe in den Prozess, und der stellt den Fall selbst wieder her, quer über alle Systeme. Mit anderen Werten noch einmal. Von Hand klickt das jedes Mal jemand nach, und beim dritten Durchgang weiß niemand mehr, was im ersten drinstand.
Zertifikat erneuert, Schnittstelle umgestellt, Release eingespielt: einmal durch die Landschaft fahren und sehen, ob der Vorgang noch durchkommt. Meist weiß das sonst erst der erste Anrufer am Morgen.
Dazu kommt der Fall, an den zuletzt jemand denkt: eine Ablösung. Denselben Ablauf gegen Alt- und Neusystem fahren und die beiden Protokolle nebeneinanderlegen — das ist der ehrlichste Vergleich, den man bekommen kann.
Der Entwickler fährt gegen die eigene Maschine, der Product Owner gegen Staging, der Key User gegen die Abnahme. Verschieden sind dabei eine Adresse, ein Benutzer, ein Passwort — nicht der Ablauf. Eine Umgebung ist genau das: ein benannter Satz Startwerte, der beim Start in den Lauf gelegt wird.
Eine Umgebung lässt sich als privat anlegen. Die liegt dann in einem eigenen Ordner, der sich selbst aus der Versionsverwaltung heraushält — nicht als Bitte an den Nutzer, sondern als Tatsache. Dorthin gehört auch, was vor der Seite steht: Basic, ein Proxy, ein Client-Zertifikat. Und auf einem Rechner in der Domäne steht gar kein Passwort im Testfall — der Browser meldet sich mit dem Ticket an, das der angemeldete Benutzer ohnehin hat.
Ein Lauf in der Pipeline fängt bei null an: leere Datenbank, Migrationen durch, ein paar Datensätze gesät, und was hinter der ersten Systemgrenze liegt, ist ohnehin ein Mock. Zwölf Minuten später ist alles wieder weg. Für die Anwendung selbst ist das genau richtig, und niemand sollte damit aufhören.
Nur ist das nicht die Lage, in der ein Geschäftsprozess stattfindet. Dort steht ein ERP mit vierhunderttausend Buchungen, ein Postfach mit Historie, ein Austauschordner, in dem noch die Dateien von gestern liegen. Nichts davon lässt sich zurücksetzen. Die Hälfte gehört einer anderen Abteilung. Und alles davon ist morgen noch da.
| Merkmal | Im Pipeline-Lauf | In der Landschaft |
|---|---|---|
| Datenbestand | leer, dann gesät | gewachsen, fremd, nicht abzählbar |
| Nachbarsysteme | gemockt oder abgeschaltet | echt, und am Prozess beteiligt |
| Zurücksetzen | vor jedem Lauf | nie |
| Fremde Last | keine | Nachtimport, Fachabteilung, Schnittstellen |
| Ausgelöst durch | einen Commit | die Uhr — die Systeme ändern sich auch ohne Zutun |
Das ist der Preis dafür, dass nichts gemockt wird: Steht eines der beteiligten Systeme, steht der Lauf. Penguflow kann nichts vortäuschen, was gerade nicht da ist. Im Protokoll steht dann, welches System nicht geantwortet hat.
Tricentis Tosca, Worksoft Certify, UFT One und Leapwork fahren Prozesse über Web, SAP, Mainframe, Postfach und Datenbank — seit Jahren. Wer sie hat, braucht uns nicht. Nur: Keiner der vier veröffentlicht einen Preis, und keinen davon probiert man vor dem Vertriebsgespräch aus. Playwright und Cypress hat dagegen fast jeder — und die fahren einen Browser, das war es. Was dazwischen fehlt, ist der Grund für Penguflow.
Penguflow läuft als Anwendung auf dem Rechner, an dem Ihre Systeme hängen. Testprozesse, Protokolle, Bildschirmfotos, Mitschnitte und die Zugangsdaten der geprüften Systeme bleiben dort. Nach außen geht die Anmeldung und die Aktualisierung — kein Bildschirminhalt, keine Testdaten, nichts zur Auswertung. Werkzeuge, die Elemente über Bilderkennung finden, schicken dafür Bildmaterial an ihren Anbieter.
Unit-Tests, Komponententests, der schnelle E2E-Lauf beim Commit: alles behalten. Penguflow ist die Schicht darüber — die Frage, ob der Vorgang durch fünf Systeme kommt, stellt sich erst, wenn jedes davon für sich schon in Ordnung ist.
Das ist keine schlechte Angewohnheit, sondern die Definition. Der eine Teil gilt dem Neuen, der andere heißt Regression und gilt dem Rest. Beide gehören zusammen, weil nicht das Feature ausgeliefert wird, sondern der Stand: Der Nachweis, dass das Neue geht, ist ohne den Nachweis, dass das Alte noch geht, keiner.
Unten fällt das niemandem auf. Hunderte Unit-Tests laufen bei jedem Speichern durch, der nächste kostet Millisekunden. Nach oben kippt die Rechnung: Dort zahlt man nicht die Prüfung, sondern das, was vor ihr steht — Umgebung hochfahren, anmelden, Daten anlegen, warten, bis das Nachbarsystem so weit ist. Und zwar je Lauf, nicht je Prüfung.
| Prüfung | Was sie über den Vorgang sagt | Was eine Wiederholung kostet |
|---|---|---|
| Unit-Test | nichts — er kennt eine Funktion | Millisekunden |
| Test einer Anwendung | ob sie für sich in Ordnung ist | Sekunden, in der Pipeline |
| E2E über eine Oberfläche | einen Ausschnitt, bis zur ersten Systemgrenze | Minuten — und unter Last wird er rot |
| Der Vorgang über fünf Systeme | alles, worauf es ankommt | in der Praxis: ein Mensch, ein Vormittag |
Die letzte Zeile lässt sich automatisieren, und die Werkzeuge dafür gibt es. Bezahlt wird sie trotzdem meistens in Personenzeit — weil sie erst ab einer Größe angeboten wird, ab der ein eigenes Testautomatisierungsteam danebensteht. Zwanzig Vorgänge sind zwanzigmal so viel Arbeit wie einer, vor jeder Lieferung, und das ist die einzige Zeile, von der schnellere Rechner nichts abziehen. Sie sagt am meisten und wird am seltensten wiederholt — gestrichen wird zuerst, worauf es ankommt.
Ein Pflichtfeld mehr im Anmeldeformular ist im System eine Zeile. Für die Tests ist es jeder Ablauf, der sich anmeldet, und das sind fast alle. Steht das Anmelden als Kopie in jedem davon, sind es zwanzig Stellen zum Nachziehen. Deshalb ruft hier ein Prozess einen anderen auf: „Anmelden" gibt es einmal.
Was fachlich richtig ist, weiß der Fachbereich. Hinschreiben konnte es bisher nur, wer Skripte schreibt — und damit wartet die eine Seite auf die andere. Ein Ablauf, der als Satz dasteht, lässt sich von der Seite ändern, die den Fall kennt.
Nach Risiko auswählen, priorisieren, den Rest streichen. Das funktioniert, und es kostet jedes Mal dasselbe: Man weiß hinterher weniger. Die andere Richtung ist, die Wiederholung billig zu machen, statt sie zu kürzen.
Das ist die eigentliche Arbeit beim Testen gegen Bestand. Ein Ablauf, der auf leerem Stand funktioniert, läuft genau einmal: Beim nächsten Durchgang ist die Adresse vergeben, die Nummer existiert, die Datei liegt schon im Ordner. Wiederholbarkeit heißt hier deshalb etwas anderes als in der Pipeline — nicht „vorher alles zurücksetzen", sondern „sich auf nichts verlassen, was der Lauf nicht selbst erzeugt hat".
Das ist keine Einstellung, die man anschaltet. Es sind drei Gewohnheiten, und für jede davon gibt es ein Feld im Formular.
Startwerte gehören zum Testprozess: eine frische Mailadresse, ein Kennzeichen im Bestelltext. Damit stolpert der 200. Lauf nicht über das, was der 199. hinterlassen hat — und man erkennt hinterher, welche Daten aus einem Test stammen.
„Die oberste Zeile in der Liste" ist morgen eine andere Bestellung. Deshalb merkt sich der Lauf die Nummer, die er erzeugt hat, und sucht später genau die — auch noch drei Systeme weiter, wo sie unter anderem Namen auftaucht.
In einer echten Landschaft ist man nicht allein: nachts der Import, tagsüber die Fachabteilung. Ein Schritt wartet deshalb, bis er durchgeht, statt eine feste Pause einzubauen. Im Protokoll steht danach, wie oft es gebraucht hat — und das ist die Zahl, an der man Ärger kommen sieht.
Weil die Systeme bleiben, hängen sie auch aneinander. Und darin liegt der Grund, warum man sie nicht einzeln prüfen und die Ergebnisse hinterher zusammenzählen kann: Die zweite Station lässt sich weder überspringen noch vorbereiten. Den Bestätigungslink gibt es nur, weil das Formular abgeschickt wurde. Die Bestellnummer entsteht im Portal und wird im ERP gebraucht.
Genau an dieser Stelle hört das Werkzeug auf, das im Team schon liegt: Playwright, Cypress und Selenium fahren einen Browser, und das war es. Für alles dahinter schreibt jemand ein Skript, das den Rest von Hand nachbaut und das nach einem halben Jahr niemand außer seinem Autor mehr anfasst. Wer die Kette zerschneidet, testet ab da nur noch Attrappen.
Daher der Name. Pinguine laufen in einer Kette hintereinander her — einer hinter dem anderen, und keiner überholt. Genauso läuft ein Geschäftsprozess durch seine Systeme.
Ins nächste System kommt man über einen Knopf im vorigen: absenden, freigeben, buchen. Einfach die Adresse von B aufzurufen bringt nichts — dort steht dann noch gar nichts.
Man kann das ERP nicht „in die Lage nach der Bestellung" versetzen und dort anfangen. Diese Lage entsteht ausschließlich dadurch, dass im Portal wirklich bestellt wurde — mit allem, was dazwischen schiefgehen kann.
Fünf Systeme, die jedes für sich in Ordnung sind, ergeben noch keinen Vorgang, der durchkommt. Was zwischen ihnen passiert, sieht man nur an einem durchgehenden Lauf — und der schreibt ein Protokoll, das die Übergänge mitzählt.
Eine Bestellung geht im Portal ein, löst eine Mail aus, landet über einen Austauschordner im ERP, erzeugt dort eine Buchung, und irgendwann taucht ein Beleg im Archiv auf. Fünf Systeme, fünf Zugangsarten — und eine Bestellnummer, die durch alle hindurchgeht.
eingang/{{bestellnummer}}.json warten.
geplant
Die Marken an den Stationen zeigen, was heute schon geht: Ausgeliefert ist der Web-Treiber. Für die übrigen Stationen steht die Architektur, der Treiber selbst noch nicht. Der Stand weiter unten führt es auf.
0.6s ▶ Bestellportal 0.8s Fülle Feld "Artikel" mit "Dachziegel rot" 1.1s Klicke button "Bestellung aufgeben" 1.4s Test-Id "bestellnummer": "B-B477B577" 1.4s bestellnummer = B-B477B577 1.4s ✓ Bestellportal 1.4s ▶ Eingangsbestätigung ← Systemgrenze 1.5s noch nicht so weit: keine Mail an kunde@example.org. 3.1s ✓ Eingangsbestätigung (5 Versuche, 1.7 s) 3.1s ▶ Austauschordner ← Systemgrenze 3.1s noch nicht so weit: eingang/B-B477B577.json ist nicht da. 6.2s ✓ Austauschordner (7 Versuche, 3.1 s) 6.2s ▶ ERP-Buchung ← Systemgrenze 6.9s ✓ Buchung zu B-B477B577 gefunden
Genau diese Wiederholungen sind der Unterschied zwischen einem Test, der durchläuft, und einem, der unter Last rot wird. Sie stehen im Protokoll, statt in einer festen Pause versteckt zu sein — und eine Station, die gestern einen Versuch brauchte und heute sechs, ist ein Befund, auch wenn sie grün ist.
Ein Prozess ist ein System oder ein Anwendungsfall, den man gekapselt testen will. „Bestätigungsmail abholen" ist technisch dreierlei — warten, öffnen, Link herauslesen — aber gedacht ist es eines. Wer nur Schritte aneinanderreiht, schreibt Abläufe, die niemand liest, und wiederholt dieselben fünf Klicks in jedem davon.
Tiefe entsteht dadurch, dass ein Prozess einen anderen aufruft. Es gibt keine dritte Ebene und keine vierte — „Bestellprozess" enthält „Anmelden" enthält „Formular ausfüllen", und es gab nie einen Grund, bei drei aufzuhören.
| Begriff | Was es ist |
|---|---|
| Prozess | Ein benannter Ablauf, streng nacheinander — Verzweigungen gibt es nicht. Seine erste Zeile ruft eine Seite auf oder einen anderen Prozess; in seinen Eingaben steht, was er von außen braucht. Für sich startbar und von anderen aufrufbar. |
| Schritt | Eine Aktion auf einem Element. Darf sich Werte merken — und das ist es, was über die Systemgrenze getragen wird. |
| Aufruf | Ein Prozess ruft einen anderen. Hier steht auch, wie oft: eine feste Zahl oder einmal je Eintrag einer Liste von vorher. |
| Bag | Was ein Prozess liefert: alles, was er sich gemerkt hat, samt den Ergebnissen seiner Aufrufe. Der Aufrufer legt es unter dem Namen ab, den er selbst vergeben hat. |
Es gibt kein Schleifenkonstrukt. Wer fünf Konten anlegen will, ruft „Konto anlegen" fünfmal auf — Wiederholung ist keine Zeile im Ablauf, sondern eine Zahl an einer Kante, wie eine Menge in einer Stückliste. Der gerufene Prozess merkt davon nichts: Er bekommt seine Werte und tut sein Ding.
Und es gibt keine Verzweigung. Ein Prozess läuft von oben nach unten durch, ohne „wenn … dann". Das ist eine Entscheidung und keine fehlende Zeile: Ein Ablauf mit zwei Ausgängen liest sich beim dritten „wenn" nicht mehr wie ein Satz, und ein Testfall, der je nach Datenlage etwas anderes tut, prüft an manchen Tagen etwas, das niemand nachgesehen hat. Wer zwei Fälle hat, baut zwei Prozesse und ruft den passenden auf. Der Preis, damit er genannt ist: „wenn der Kunde schon existiert, überspringe das Anlegen" geht so nicht — dafür sorgt man dafür, dass er es nicht tut, und legt sich seinen eigenen an.
Der Name eines Prozesses darf Eingaben enthalten. Bestellung aufgeben: {{artikel}} × {{menge}}
steht im Ablauf dann als Bestellung aufgeben: Dachziegel rot × 250 — die Kette liest sich wie
ein Satz und nicht wie eine Aufrufliste.
Niemand baut einen Ablauf aus dem Kopf zusammen. Man macht ihn einmal von Hand — so wie sonst auch — und Penguflow schreibt mit. Die Arbeit danach ist eine einzige Runde, und die entscheidet, ob der Ablauf beim zweiten Mal noch funktioniert.
Die erste Zeile ruft die Seite auf, bei der es losgeht. Das eingebaute Browserfenster öffnet genau diese Adresse — dieselbe, gegen die später gelaufen wird.
Bedienen wie immer: klicken, tippen, absenden. Mitgeschrieben wird, was getan wurde. Wechselt der Vorgang das System, fängt dort automatisch ein neuer Prozess an — die Aufnahme teilt den Ablauf an genau den Systemgrenzen.
Für jeden getippten Wert entscheiden, woher er kommt. Ohne diese Runde bekommt man einen Ablauf, der genau einmal funktioniert: mit den Daten von damals.
Ab jetzt läuft der Ablauf auf Knopfdruck, gegen die Umgebung, die man auswählt. Das Protokoll zeigt jeden Schritt, jeden gemerkten Wert und jede Wiederholung.
Sie stehen fest auf „Parameter" und lassen sich nicht auf einen festen Wert stellen. Was hier einzutragen wäre, stünde im Klartext in einer Datei im Arbeitsbereich. Der Wert kommt aus einer privaten Umgebung, die auf dem Rechner bleibt.
Was einmal ausgewählt wurde, steht im Ablauf und wird beim nächsten Lauf nicht neu gedeutet. Findet ein Schritt sein Element nicht, wird er rot — er sucht sich kein ähnliches. Selbstheilung spart Pflege und kostet genau die Aussage, um die es bei einer Abnahme geht: Wo ein Modell zur Laufzeit entscheidet, was gemeint war, beweist ein grüner Lauf nicht mehr, dass das Aufgeschriebene passiert ist.
Und bevor der erste Klick fällt, wird gerechnet: Ein Schritt, der einen Wert benutzt, den keine frühere Station abgelegt hat, ist kaputt. Beim Laufen fiele das erst auf, wenn schon drei Systeme angefasst sind.
FEHLER steps[0].action.path {{bestellnummer}} ist hier noch nicht belegt — keine frühere Station legt den Wert ab.
Ein Vorgang über mehrere Systeme lässt sich an keinen Commit hängen. Die Systeme gehören nicht dem Repository — sie ändern sich, weil jemand eine Schnittstelle umgestellt, ein Zertifikat erneuert oder ein Wartungsfenster genutzt hat. Der Anlass ist deshalb die Uhr und nicht der Commit: jede Nacht, vor der Abnahme, nach dem Wartungsfenster.
Gestartet wird heute von Hand. Zeitplan, Verlauf und Bescheid geben, wenn ein Lauf kippt, stehen im Stand unter „Als Nächstes“ — bis dahin drückt jemand den Knopf.
Ein roter Lauf heißt dann nicht „dein letzter Commit war falsch", sondern „in der Landschaft stimmt etwas nicht" — und meistens weiß das sonst noch niemand.
Dazu muss der Läufer dort stehen, wo die Systeme stehen. An einen Austauschordner hinter der Firmen-Firewall, an eine Datenbank ohne Zugang von außen, an ein internes Portal ohne Route aus dem Netz kommt ein Server im Rechenzentrum nie heran. Deshalb gibt es Penguflow auch als native Anwendung. Das ist kein Zugeständnis an Offline-Nutzer: ohne sie fehlt die halbe Kette.
Möglich ist das, weil es einen Server gibt, und zwar als Bibliothek statt als Programm.
createApp(deps) liefert die fertige API; wer sie startet, ist eine andere Frage. Der
Unterschied zwischen Webdienst und nativer Anwendung sind drei Schnittstellen für die Ablage.
Darüber ist alles identisch — dieselben Routen, dieselbe Ausführung, dasselbe Studio.
Studio (Web-UI) ──HTTP──▶ Server ──▶ Runner ──▶ Treiber ──▶ die Kette Webdienst: Server im Container Nativ: Server + Runner + UI in einem Electron-Prozess
Das Studio spricht ausschließlich per fetch gegen dieselbe Herkunft — im Browser wie in Electron. Keine Electron-Brücke, kein window.electron. Damit gibt es auch nichts, was in einer der beiden Welten anders funktioniert.
Ein Firefox-Kennstring macht aus Chromium keinen Firefox. Wer Firefox testen will, wählt Firefox — und dazu Fenstergröße, Bildpunktdichte und Berührungseingabe, denn „iPhone" in einem 1280 Pixel breiten Fenster ist ein Layout, das kein Mensch je zu sehen bekommt.
Penguflow ist in Arbeit, und eine Marketingseite ohne diesen Abschnitt wäre unglaubwürdig. Wie weit die Kette reicht, entscheiden die Treiber: Modell, Ausführung und Studio tragen sie bereits über beliebig viele Stationen, ausgeliefert ist bisher die Station Weboberfläche. Die übrigen kommen als Nächstes — dafür ist die Architektur gebaut. Eine Station steht nicht in dieser Reihe, und sie steht unter der Liste.
Eine Windows-Anwendung — SAP GUI, ein ERP-Client, ein Fachverfahren mit eigener Oberfläche — liegt außerhalb dessen, was heute geht. Nicht in Teilen und nicht mit Einschränkungen: Es gibt keinen Treiber dafür. Wer einen solchen Schritt im Vorgang hat, macht genau diesen weiterhin von Hand.
Der Weg dahin ist bekannt und führt über die Bedienhilfen von Windows — dieselbe Schnittstelle, die ein Screenreader benutzt. Dort stehen Knopf, Feld und Beschriftung mit Namen und Rolle, statt als Bildpunkte auf einem Bildschirmfoto; ein Ablauf, der auf Koordinaten klickt, bricht bei der nächsten Auflösung. Dazu gehören ein Läufer, der auf dem Rechner mit der Anwendung steht, und ein eigenes Verfahren zum Aufzeichnen: In eine Webseite sieht Penguflow beim Mitschreiben hinein, in eine fremde Anwendung nicht.
Das ist Arbeit für eine zweite Hauptfassung und nicht für das nächste Vierteljahr. Bis dahin steht es hier, damit es niemand im Gespräch herausfinden muss.