Eigenschaften guter Test-IDs
Ausführliche Richtlinien für stabile, sprechende und DRY-konforme Test-IDs.
Heilige Dreifaltigkeit (Orientierung): 👤 Abstrakter Bezeichner · ✨ Konkreter Lokator (Fleischwerdung) · 🛠️ Widget/Adapter (Interaktion)
Test-IDs (z. B. data-testid
, automation-id
, Swing-setName
) sind das Rückgrat der Automatisierung.
Hier sammeln wir die ausführlichen Kriterien, die eine gute Test-ID erfüllen sollte.
1. Eindeutigkeit & Stabilität
Global eindeutig: jede ID existiert applikationsweit nur einmal.
Stabil über Releases: einmal vergeben ⇒ bleibt erhalten.
Deterministisch: ableitbar aus Domäne/Kontext, nicht aus Layout.
Nicht Layout-basiert: keine CSS-Klassen, keine Indexe, keine Reihenfolgen.
2. Sprechend & domänennah
Fachlich statt technisch:
customer.search.submit
stattbtn123
.Sinnvolle Granularität: nicht zu generisch (
button1
), nicht zu detailreich (searchButtonGreenRightTop
).Keine UI-Technik im Namen: „Button“, „Div“, „Xpath“ bleiben in den Adaptern.
3. Namensschema & Konventionen
Namespaces:
<domäne>.<kontext>.<funktion>[.<variante>]
.Beispiel:
customer.search.submit
,invoice.row.{invoiceId}.amount
.
Zeichenmenge:
[a-z0-9_.-]
.Kleinschreibung und Punkt-Notation für Lesbarkeit.
Keine Umlaute, keine Leerzeichen, keine Sonderzeichen.
Länge: kurz genug zum Tippen, lang genug zur Eindeutigkeit (≈ 20–60 Zeichen).
Mehrfachinstanzen: mit stabilem Schlüssel statt Index (
{invoiceId}
stattrow[3]
).
4. Lebenszyklus & Governance
Zentrale Registry: alle IDs in einer Datei (
locator-ids.yaml
).Review-Prozess: Änderungen nur via Pull-Request + Review (Dev + QA).
Deprecation-Policy: alte IDs min. 1 Release als Alias belassen, dann entfernen.
Versionierung: Registry im Git, Änderungen sind nachvollziehbar.
5. Technische Anforderungen
Maschinenlesbar: simpler String, keine Logik.
Performant: Zugriff in O(1), kein DOM-Wildwuchs.
Unsichtbar für Endnutzer: IDs tauchen nicht in der UI auf.
a11y-neutral: darf Accessibility nicht stören; nicht verwechseln mit
aria-*
.
6. Sicherheit & Datenschutz
Keine PII: keine Namen, IBANs, Vorgangsnummern etc.
IDs ≠ Geschäftslogik: dürfen keine Autorisierungs- oder Geschäftsentscheidungen triggern.
Logging: IDs sollen unkritisch geloggt werden können.
7. Internationalisierung
Sprachneutral: IDs bleiben gleich, egal ob die UI deutsch, englisch oder japanisch ist.
Keine Übersetzungen in IDs.
Einheitlich englisch/neutral als Standard.
8. Plattform-Übertragbarkeit
Eine Quelle, viele Targets: abstrakte ID (
customer.search.submit
) wird in Web, Swing oder Mobile konkretisiert.Generator baut pro Plattform die passenden Locator-Ausdrücke.
Beispiel:
# locator-ids.yaml
- id: customer.search.submit
intent: "Suche auslösen"
Web:
[data-testid="customer.search.submit"]
Swing:
component.setName("customer.search.submit");
9. Kompatibilität & Migration
Aliases für Umbenennungen:
current: customer.search.submit aliases: [ customer.search.searchSubmit ]
CI-Check warnt bei Alias-Nutzung → sanfte Migration.
10. Tooling & Qualitätssicherung
Linting: prüft Namensschema, verbietet Duplikate, scannt nach PII.
Doc-Gen: Registry automatisch als HTML/MD-Doku exportieren.
Coverage-Report: ungenutzte IDs finden.
„Red Button“-Check: jeder interaktionsrelevante Control muss eine ID haben. → Build bricht, wenn IDs fehlen.
11. Anti-Patterns (bitte vermeiden)
❌ IDs aus Layout ableiten:
page > div:nth-child(3) .btn.blue
❌ Indexbasierte IDs:
list.item[0].title
❌ Fachdaten als ID:
customer.anna.mueller.submit
❌ Technik-Bezeichner:
btnSubmit, div-123
❌ Sprachabhängige IDs:
kunde.suche.absenden
Zusammenfassung
Eine gute Test-ID ist eindeutig, stabil, sprechend, neutral, zentral gepflegt und generierbar. Sie ist das Verbindungsstück zwischen abstraktem Bezeichner (Vater) und Interaktion (Heiliger Geist) – die Fleischwerdung der Automatisierung. ✨
Zuletzt aktualisiert