Skeleton-Konventionen
Die Naming-, Signatur- und XPath-Style-Regeln, die das Framework auf jeder gescaffoldeten App durchsetzt — damit ein Custom Step, ein Self-Healing-Writeback oder eine Handbearbeitung alle byte-konsistenten Code erzeugen.
← Zurück zur Übersicht · 🇬🇧 English · ← Deinen ersten TestCase schreiben
Was diese Konventionen abdecken
Struktur — Naming, Funktionssignatur, Import-Reihenfolge, i18n-Wrapping — folgt 6 fixen Regeln, automatisch geprüft bei jeder neuen Datei. Semantik — welche Control, welches Label, welches XPath-Fragment — bleibt deine Entscheidung; die Regeln unten schränken nur die Form des Codes ein, nie was er tut.
Die 6 Regeln
| Regel | Art | Was geprüft wird | Schweregrad |
|---|---|---|---|
| R1 — i18n | i18n | Jedes Core.i18n.t('KEY', ...) und jedes descriptionI18n.key: 'KEY' hat einen en-Eintrag im Sibling-.i18n.json-Katalog; jede Locale-Variante hat identische Platzhalter | Fatal |
| R2 — Naming | Steps | Jeder exportierte TS_* in einer Step-Datei matcht TS_<Type>_<Element>_<Action> (z.B. TS_Main_Button_Click) | Fatal |
| R3 — Signatur | Steps | Jeder run-Callback von Core.defineTestStep hat pageLogName: string, _?sectionName: string als seine ersten zwei Parameter (nur TS_Main/TS_Dialog/TS_Message) | Fatal |
| R4 — XPath-Style | Controls | Skeleton-Controls verbieten @id, [@data-testid], [@data-cy] — der Framework-Style ist strukturell (Text/Rolle/Label) | Fatal |
| R5 — Sibling-Katalog | i18n | Jede TS_*.ts mit mindestens einem defineTestStep hat eine Sibling-TS_*.i18n.json | Fatal |
| R6 — Import-Reihenfolge | Steps | Imports erscheinen in kanonischer Reihenfolge: Core → Controls* (alphabetisch) → sonstige | Warning |
Deine Dateien automatisch prüfen lassen
- Pre-Commit-Hook. Nach
npm installinnerhalb vonpm/installiertsimple-git-hookseinen.git/hooks/pre-commit-Hook, der die vom aktuellen Commit betroffenen Skeleton-Dateien validiert. - CI. Ein
Validate Skeleton Conventions-Step läuft bei jedem Pull Request und Push. - CLI, bei Bedarf. Aus
pm/heraus:node node_modules/@meintest/cc-testframework-templates/bin/validate-conventions.js <root>läuft mit dem vollständigen Regelsatz gegen einen Verzeichnisbaum — manuell, oder in deine eigene CI eingebunden. Exit-Codes:0alles sauber,1mindestens eine fatale Verletzung,2nur Warnungen. - Maschinenlesbare Ausgabe. Das Flag
--jsonliefert strukturierte Befunde für ein Test-Management-Tool oder einen anderen externen Consumer statt des menschenlesbaren Text-Reports.
Generierter Code — ein Self-Healing-Writeback, oder ein Step, den der Custom-Steps-Authoring-Agent erzeugt — wird gegen dieselben Regeln geprüft, bevor er überhaupt in deine Source-Datei geschrieben wird, sodass er ab dem Moment seiner Landung konform ist. Siehe Self-Healing Locators und Custom Steps dafür, was jeder dieser Schreibpfade tut.
Was tun bei einer Verletzung
R1 — i18n
// Falsch — Schlüssel 'TS_Main_Login_Click' hat keinen en-Eintrag im Sibling-Katalog
Core.i18n.t('TS_Main_Login_Click', { user: 'alice' });
Fix: den Eintrag zum Sibling-.i18n.json-Katalog hinzufügen:
{
"TS_Main_Login_Click": { "en": "click Login for ${user}", "de": "..." }
}
R2 — Naming
// Falsch
export const clickLoginButton = ...
// Korrekt
export const TS_Main_Button_Click = Core.defineTestStep('MyApp', { ... });
R3 — Signatur
// Falsch — run-Callback ohne pageLogName
Core.defineTestStep('MyApp', {
descriptionI18n: { ... },
run: (label: string) => Controls.click(label),
});
// Korrekt
Core.defineTestStep('MyApp', {
descriptionI18n: { ... },
run: (_pageLogName: string, _sectionName: string, label: string) => Controls.click(label),
});
R4 — XPath-Style
// Falsch — Skeleton-Style ist strukturell, nicht id-basiert
Core.xpath`.//*[@id='login-btn']`
// Korrekt
Core.xpath`.//button[.='${label}']`
R5 — Sibling-Katalog
TS_Main.ts mit mindestens einem defineTestStep, aber ohne daneben liegende TS_Main.i18n.json, schlägt als Fatal fehl. Erstelle die Sibling-Katalog-Datei, auch wenn sie anfangs leer ist ({}).
R6 — Import-Reihenfolge
// Falsch — Controls-Import steht vor Core
import * as ControlsButton from '../1_Controls/Button';
import * as Core from '@Core';
// Korrekt
import * as Core from '@Core';
import * as ControlsButton from '../1_Controls/Button';
Wissen, welche deiner Dateien geprüft werden
R2, R3 und R4 gelten nur, wenn der Root des Validators auf das Skeleton selbst zeigt (packages/templates/templates). Für deine eigenen Apps unter pm/2_Apps/ sind nur R1 und R5 aktiv — R2, R3 und R4 werden mit einer Info-Log-Zeile übersprungen, weil diese Apps gewachsen sind, bevor diese Konventionen existierten. Aktiviere die volle Durchsetzung für deine eigenen Apps mit strictConventions — siehe den nächsten Abschnitt.
Alle 6 Regeln auf deinen eigenen Apps durchsetzen (strictConventions)
Standardmäßig gelten R2 (Naming), R3 (Signatur) und R4 (XPath-Style) nur für das Skeleton selbst, sodass Apps, die gewachsen sind, bevor diese Konventionen existierten, oder die bereits ihren eigenen Naming- oder XPath-Style etabliert haben, unverändert weiter funktionieren.
Aktiviere dieselben Garantien für deine eigenen Apps unter 2_Apps/, wenn du willst, dass ein Self-Healing-Writeback, eine Handbearbeitung oder ein externes Tool nicht mehr über die Zeit von deinem Naming-, Signatur- und XPath-Style abdriften. Drei Wege, es zu aktivieren, geprüft in dieser Reihenfolge — der erste Treffer gewinnt:
- CLI-Flag. Übergib
--strictbeim direkten Aufruf vonvalidate-conventions.js, z.B. aus deiner eigenen Pre-Commit-Konfiguration. - Umgebungs-Variable. Setze
STRICT_CONVENTIONS=true— typischerweise in deiner CI-Konfiguration, sodass jeder Pipeline-Lauf es durchsetzt, ohne eine Projekt-Datei anzufassen. GlobalConfig.ts. Füge in2_Apps/1_Global/GlobalConfig.tshinzu:
// In 2_Apps/1_Global/GlobalConfig.ts
export const strictConventions = true;
Das ist die persistente, im Repo committete Option — einmal gesetzt, setzt jeder Commit und jeder CI-Lauf sie durch, ohne dass anderswo ein Flag oder eine Env-Var nötig ist. Eine neu gescaffoldete App liefert diese Zeile auskommentiert in ihrer GlobalConfig.ts mit; kommentiere sie ein, wenn du bereit bist.
Ist keiner der drei Wege gesetzt, fällt das Framework auf den oben beschriebenen Standard zurück — R2, R3 und R4 bleiben Skeleton-only; R1 und R5 bleiben unabhängig davon überall aktiv.
Was sich ändert, wenn es aktiv ist
R2, R3 und R4 laufen jetzt gegen jede Datei unter 2_Apps/**, nicht nur gegen das Skeleton. In der Praxis fängt das:
- Self-Healing-Writeback-Drift. Ein geheilter Locator kommt aus einem Vision-Aufruf und kann gelegentlich einen
@id- oder[data-testid]-Style-XPath vorschlagen, obwohl der Rest deiner Control dem strukturellen Style folgt. Siehe Self-Healing Locators dafür, wie das mitstrictConventionszusammenspielt. - Handbearbeitungs-Drift. Ein Teammitglied, das einen Step umbenennt oder eine Signatur von Hand anpasst, wird genauso geprüft, wie es eine Skeleton-Datei bereits wird.
Was das nicht fängt
strictConventions läuft zum Commit-Zeitpunkt und in der CI — es validiert Dateien, die bereits auf der Platte existieren. Es fängt keinen vom Authoring-Agent generierten Custom-Step-Code, bevor dieser Code überhaupt in deine Source-Datei geschrieben wird; das ist ein separater, früherer Checkpoint, beschrieben in Wie generierter Code verifiziert wird.
Wohin als Nächstes
- Deinen ersten TestCase schreiben — die Naming-Konvention, die dieser Validator durchsetzt
- Custom Steps — handgeschriebene oder Agent-generierte Steps, die weiterhin R1 und R5 folgen
- Step-Description Localization — ein Deep-Dive in das
.i18n.json-Katalog-Format, das R1 prüft - Self-Healing Locators — wie
strictConventionsvor Writeback-Drift schützt
📧 Fragen? Kontakt: jens.szelag@itsbusiness.ch
itsbusiness AG · Bern · Schweiz