Georkestreerde saga's testen
Leer saga's op basis van orkestratie te testen, met unittests voor compensatiepaden, integratietests met gesimuleerde service-uitval en end-to-endverificatie van saga-voltooiing.
Georkestreerde saga's testen is een gratis Communicatiepatronen voor microservices (Saga, Circuit Breaker)-les op CoddyKit. Dit is les 4 van 4. Je kunt de volledige les hieronder gratis lezen en daarna in de browser praktisch oefenen met een ingebouwde code-editor en een AI-begeleider die 24/7 beschikbaar is. Deze les maakt deel uit van het leertraject Communicatiepatronen voor microservices (Saga, Circuit Breaker). Je voortgang wordt gesynchroniseerd op het web en in de CoddyKit-app. De cursus Communicatiepatronen voor microservices (Saga, Circuit Breaker) bevat in totaal 4 lessen.
Waarom saga's testen?
Een orkestratiesaga coördineert meerdere services via een centrale orkestrator. Een fout in de orkestrator kan het systeem in een inconsistente toestand tussen services achterlaten.
Saga's testen is moeilijker dan één functie testen, omdat je zowel het succespad als elk compensatiepad moet controleren.
- Is elke stap in de juiste volgorde uitgevoerd?
- Hebben fouten de juiste compensaties geactiveerd?
- Is de uiteindelijke toestand consistent?
De testpiramide voor saga's
Pas de klassieke testpiramide toe:
- Unittests — de beslislogica van de orkestrator afzonderlijk.
- Integratietests — de orkestrator die met echte of nagebootste services communiceert.
- End-to-endtests — de volledige saga over alle services.
De meeste tests moeten unittests zijn, omdat ze snel en deterministisch zijn.
De orkestrator testen met unittests
De orkestrator is vaak een toestandsmachine. Je kunt de overgangen ervan testen met unittests door gebeurtenissen aan te leveren en de volgende opdracht te controleren.
def next_command(state, event):
if state == 'STARTED' and event == 'PAYMENT_OK':
return 'RESERVE_STOCK'
if state == 'STARTED' and event == 'PAYMENT_FAILED':
return 'ABORT'
return 'NOOP'
print(next_command('STARTED', 'PAYMENT_OK'))
print(next_command('STARTED', 'PAYMENT_FAILED'))Serviceaanroepen nabootsen
Vervang in unittests echte serviceaanroepen door mocks of stubs. Zo kun je precies bepalen wat elke stap retourneert.
Laat de betalingsservice bijvoorbeeld een fout retourneren, zodat je kunt controleren of de orkestrator een compensatieopdracht geeft.
class FakePayment:
def __init__(self, ok):
self.ok = ok
def charge(self, amount):
return 'PAYMENT_OK' if self.ok else 'PAYMENT_FAILED'
print(FakePayment(False).charge(100))Compensatiepaden testen
Het meest risicovolle onderdeel van elke saga is compensatie. Schrijf voor elke voorwaartse stap een test die:
- De stappen tot een gekozen punt uitvoert.
- Een fout forceert.
- Controleert of elke voorgaande stap in omgekeerde volgorde is gecompenseerd.
executed = ['reserve_stock', 'charge_card']
compensations = list(reversed(executed))
print('Compensate in order:', compensations)Integratietests met testcontainers
Integratietests voeren de orkestrator uit tegen echte afhankelijkheden in wegwerpcontainers, zoals databases en message brokers.
Tools zoals Testcontainers starten een echte broker op (bijvoorbeeld Kafka of RabbitMQ), zodat de berichtenstroom precies zoals in productie wordt getest.
Servicefouten simuleren
Om veerkracht te testen, injecteer je fouten: laat een downstreamservice fouten retourneren, een time-out veroorzaken of halverwege een saga crashen.
- HTTP 500 vanuit een stap
- Time-out (geen antwoord)
- Dubbele bezorging van een gebeurtenis
Elk scenario moet het systeem consistent achterlaten.
Time-outs testen
Orchestrators stellen vaak een time-out in voor elke stap. Als een stap niet antwoordt, moet de saga compensatie starten.
import time
def wait_for_step(timeout, elapsed):
if elapsed > timeout:
return 'TIMEOUT -> COMPENSATE'
return 'OK'
print(wait_for_step(5, 7))
print(wait_for_step(5, 3))Consistentie van de eindtoestand controleren
De belangrijkste controle is of het systeem eindigt in een geldige toestand. Na een mislukte saga mag er geen geld worden afgeschreven en mag er geen voorraad zijn gereserveerd.
Vraag elke service op en controleer of de invarianten voor alle services gelden.
Gebeurtenissen opnieuw afspelen in tests
Omdat berichten meer dan één keer kunnen worden bezorgd, speel je dezelfde gebeurtenis in je tests twee keer af en controleer je of de toestand van de saga de tweede keer ongewijzigd blijft. Hiermee controleer je idempotentie op orchestratorniveau.
processed = set()
def handle(event_id):
if event_id in processed:
return 'IGNORED (duplicate)'
processed.add(event_id)
return 'PROCESSED'
print(handle('e1'))
print(handle('e1'))Observeerbaarheid in tests
Voeg controles toe voor uitgegeven logboekregels, metrieken en trace-spans. Een grondig geteste saga moet een duidelijk auditspoor opleveren, zodat je bij een echte fout in productie precies kunt reconstrueren wat er is gebeurd.
Korte controle
Bij welk type test kun je de overgangslogica van de orchestrator het beste snel en deterministisch controleren?
Samenvatting
Je hebt geleerd hoe je georkestreerde saga's test:
- Gebruik de testpiramide: veel unittests en minder integratie- en E2E-tests.
- Mock services om succesvolle en foutpaden af te dwingen.
- Test altijd de volgorde van compensaties en de consistentie van de eindtoestand.
- Speel gebeurtenissen opnieuw af om idempotentie te bevestigen en injecteer time-outs en fouten.
Grondig sagatesten zorgt ervoor dat gedistribueerde transacties betrouwbaar blijven.
Leer Communicatiepatronen voor microservices (Saga, Circuit Breaker) met een AI-tutor — gratis
Schrijf echte code en voer die uit in je browser, krijg direct hulp van een AI-tutor die 24/7 beschikbaar is en ga verder waar je gebleven bent op het web of in de app.
- Cursussen
- 12
- Lessen
- 48
Veelgestelde vragen
Is de les “Georkestreerde saga's testen” gratis?
Ja — de volledige tekst van “Georkestreerde saga's testen” kun je hier gratis op het web lezen. Als je interactief wilt oefenen met een ingebouwde code-editor en een AI-begeleider die 24/7 beschikbaar is, en de rest van de cursus Communicatiepatronen voor microservices (Saga, Circuit Breaker) wilt ontgrendelen, kun je upgraden naar CoddyKit PRO. De cursus Communicatiepatronen voor microservices (Saga, Circuit Breaker) bevat in totaal 4 lessen.
Wat leer ik in “Georkestreerde saga's testen”?
Leer saga's op basis van orkestratie te testen, met unittests voor compensatiepaden, integratietests met gesimuleerde service-uitval en end-to-endverificatie van saga-voltooiing. Je oefent met Communicatiepatronen voor microservices (Saga, Circuit Breaker) door code rechtstreeks in de browser uit te voeren. Een AI-begeleider die 24/7 beschikbaar is beantwoordt je vragen terwijl je de les doorwerkt.
Heb ik ervaring nodig om met Communicatiepatronen voor microservices (Saga, Circuit Breaker) te beginnen?
Ervaring vooraf is niet nodig. Communicatiepatronen voor microservices (Saga, Circuit Breaker) op CoddyKit is opgebouwd voor beginners tot gevorderden, zodat je hier of bij het begin kunt starten en in je eigen tempo kunt leren. Dit is les 4 van 4.
Hoe lang duurt de les “Georkestreerde saga's testen”?
De meeste lessen van CoddyKit duren ongeveer 5–10 minuten. Elke les is kort en interactief, zodat je gestaag vooruitgaat en op het web en in de app precies verdergaat waar je was gebleven.
Kan ik code schrijven en uitvoeren in deze les over Communicatiepatronen voor microservices (Saga, Circuit Breaker)?
Ja. Elke les over Communicatiepatronen voor microservices (Saga, Circuit Breaker) bevat een ingebouwde code-editor, zodat je rechtstreeks in je browser echte code kunt schrijven en uitvoeren en direct feedback van AI krijgt — lokale installatie is niet nodig.
Alle lessen in deze cursus
- Saga-orchestrators ontwerpen
- State-machines voor orchestration
- Implementeren met een workflow-engine
- Georkestreerde saga's testen