
Andrew Hanna

Andrew Hanna

Damit Apex-Tests parallel ohne sporadische Fehlschläge laufen, muss jeder Test seine eigenen Daten anlegen, darf nie in Datensätze schreiben, die außerhalb des Tests existieren, und sollte eindeutige Werte für Felder wie Benutzernamen erzeugen. Verbleibende Flaky Tests diagnostizieren Sie, indem Sie die Klasse einzeln erneut ausführen: Läuft sie allein durch und scheitert nur parallel, haben Sie ein Isolationsproblem, keinen Bug. Paralleles Testen org-weit abzuschalten verdeckt das Symptom und verlangsamt jeden Lauf.
Standardmäßig führt Salesforce asynchrone Testklassen gleichzeitig aus, sodass zwei Tests im selben Moment um dieselbe Ressource konkurrieren können. Die Fehler lassen sich auf drei Ursachen zurückführen:
UNABLE_TO_LOCK_ROW zurückgibt, und dieses Limit ist nicht änderbar, wie
Xappex erklärt. Übergeordnete Datensätze werden stillschweigend gesperrt, wenn
Master-Detail-Kinder aktualisiert werden, Roll-up-Summaries neu berechnet werden und
während der Freigabeverarbeitung.
[email protected] einfügen, mit DUPLICATE_USERNAME, ein
Muster, das
Salesforce Central beschreibt.
@isTest(SeeAllData=true) liest und schreibt echte Datensätze, die
andere Tests zur selben Zeit berühren können.
Keines dieser Probleme tritt auf, wenn eine Klasse allein läuft, deshalb wirkt die Suite so zufällig.
UNABLE_TO_LOCK_ROW,
DUPLICATE_USERNAME und andere Duplicate-Value-Fehler auf Testdaten
deuten auf Nebenläufigkeit hin.
--synchronous führt die Testmethoden einer einzelnen Apex-Klasse
synchron aus, laut der
Dokumentation von plugin-apex.
@TestSetup oder eine Data Factory und verzichten Sie auf
SeeAllData=true. Tests, die ihre eigenen Daten bauen, konkurrieren
nicht um Org-Datensätze.
@isTest(isParallel=true) ein, um Klassen zu markieren, die ohne die
standardmäßigen Nebenläufigkeitslimits parallel laufen können, wie
FishOfPrey beschreibt. Setzen Sie
es nur bei Klassen, die in parallelen Läufen wiederholt bestehen.
Nur als Notlösung. Die Einstellung finden Sie unter Setup, Apex Test Execution, Options. Sie führt asynchrone Tests nacheinander aus. Das beseitigt Nebenläufigkeits-Flakes, aber in Orgs mit vielen Testklassen kann ein vollständiger Lauf deutlich länger dauern. Manche Tools hängen am selben Schalter: Die Dokumentation von Gearset weist darauf hin, dass seine Test Monitors die Tooling API nutzen und Tests daher parallel ausführen, sofern Sie die Einstellung nicht aktivieren.
Betrachten Sie das Häkchen als Schuldenmarker. Aktivieren Sie es, um ein Release freizugeben, beheben Sie dann die verantwortlichen Klassen und deaktivieren Sie es wieder.
sf apex run test --test-level RunLocalTests liefert denselben
parallelen Lauf, den auch Ihre Produktions-Deployments sehen.
--result-format junit --output-dir, damit Ihre Pipeline Fehler pro
Klasse über die Zeit verfolgt, und --code-coverage, damit die Abdeckung
sichtbar bleibt.
Blinde Wiederholungen sind verlockend, machen aber aus echten Defekten grüne Builds. Dieselbe Disziplin gilt beim Toolwechsel, wie in Salesforce-DevOps-Tools wechseln, ohne die Pipeline zu brechen und in unserem Leitfaden zur Migration von Gearset zu Serpent ohne Ausfallzeit beschrieben.
Point-and-Click-Releases treffen auf dieselben Fehler, denn die Tests laufen beim Deployment trotzdem. Unsere Click-Deploy-Checkliste zeigt, was Sie zuerst prüfen sollten, und weitere Anleitungen finden Sie in den SF Guides.
Tekunda ist das Salesforce-Beratungs- und Produktunternehmen, das Serpent entwickelt, eine Salesforce-DevOps-Plattform mit GitHub-basierter Versionskontrolle und automatisierten Deployment-Pipelines. Wenn Flaky Tests Ihre Releases ausbremsen, vergleichen Sie die Pläne auf unserer Preisseite.
Führt Salesforce Apex-Tests standardmäßig parallel aus?
Ja, asynchrone Testläufe führen Klassen gleichzeitig aus, außer Disable Parallel Apex Testing ist im Setup aktiviert.
Was verursacht UNABLE_TO_LOCK_ROW in Apex-Tests?
Zwei Transaktionen wollen denselben Datensatz, oft einen übergeordneten, der durch ein Master-Detail-Update, eine Roll-up-Summary oder eine Freigabe-Neuberechnung gesperrt ist. Die wartende Transaktion scheitert nach 10 Sekunden.
Sollte ich Flaky Apex-Tests automatisch wiederholen?
Einmal, synchron, und nur bei Nebenläufigkeitsfehlern. Protokollieren Sie jeden Flake und beheben Sie die Klasse, statt sich auf Wiederholungen zu verlassen.
Reicht isParallel=true, um Flaky Tests zu beheben?
Nein. Es kennzeichnet eine Klasse nur als parallelfähig. Der Test muss weiterhin seine eigenen Daten anlegen und eindeutige Werte verwenden.
Unverbindlich.