Tester les sagas orchestrées
Apprenez à tester les sagas fondées sur l’orchestration, en couvrant les tests unitaires des parcours de compensation, les tests d’intégration avec des pannes de services simulées et la vérification de bout en bout de l’achèvement de la saga.
Tester les sagas orchestrées est une leçon Microservices Communication Patterns (Saga, Circuit Breaker) gratuite sur CoddyKit. Ceci est la leçon 4 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage Microservices Communication Patterns (Saga, Circuit Breaker), et ta progression se synchronise sur le web et l'application CoddyKit. Le cours Microservices Communication Patterns (Saga, Circuit Breaker) comprend 4 leçons au total.
Certaines parties de cette leçon n'ont pas encore été traduites et s'affichent en anglais.
Why Test Sagas?
An orchestration saga coordinates multiple services through a central orchestrator. A bug in the orchestrator can leave the system in an inconsistent state across services.
Testing sagas is harder than testing a single function because you must verify both the happy path and every compensation path.
- Did each step execute in order?
- Did failures trigger the right compensations?
- Is the final state consistent?
The Testing Pyramid for Sagas
Apply the classic testing pyramid:
- Unit tests — the orchestrator's decision logic in isolation.
- Integration tests — the orchestrator talking to real or stubbed services.
- End-to-end tests — the full saga across all services.
Most tests should be unit tests because they are fast and deterministic.
Unit Testing the Orchestrator
The orchestrator is often a state machine. You can unit test its transitions by feeding events and asserting the next command.
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'))Mocking Service Calls
In unit tests, replace real service calls with mocks or stubs. This lets you control exactly what each step returns.
For example, force the payment service to return a failure so you can assert the orchestrator issues a compensation command.
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))Testing Compensation Paths
The riskiest part of any saga is compensation. For each forward step, write a test that:
- Executes steps up to a chosen point.
- Forces a failure.
- Asserts that every prior step was compensated in reverse order.
executed = ['reserve_stock', 'charge_card']
compensations = list(reversed(executed))
print('Compensate in order:', compensations)Integration Tests with Test Containers
Integration tests run the orchestrator against real dependencies in disposable containers (databases, message brokers).
Tools like Testcontainers spin up a real broker (e.g. Kafka or RabbitMQ) so message flow is exercised exactly as in production.
Simulating Service Failures
To test resilience, inject failures: make a downstream service return errors, time out, or crash mid-saga.
- HTTP 500 from a step
- Timeout (no response)
- Duplicate event delivery
Each scenario should leave the system consistent.
Testing Timeouts
Orchestrators often set a timeout for each step. If a step does not respond, the saga should trigger compensation.
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))Asserting Final State Consistency
The most important assertion is that the system ends in a valid state. After a failed saga, no money should be charged and no stock reserved.
Query each service and verify the invariants hold across them.
Replaying Events in Tests
Because messages can be delivered more than once, replay the same event twice in your tests and assert the saga state is unchanged the second time. This verifies idempotency at the orchestrator level.
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'))Observability in Tests
Add assertions on emitted logs, metrics, and trace spans. A well-tested saga should produce a clear audit trail so that, when a real failure happens in production, you can reconstruct exactly what occurred.
Quick Check
Which test type is the best place to verify the orchestrator's transition logic quickly and deterministically?
Recap
You learned how to test orchestrated sagas:
- Use the testing pyramid: many unit tests, fewer integration and E2E tests.
- Mock services to force happy and failure paths.
- Always test compensation order and final state consistency.
- Replay events to confirm idempotency, and inject timeouts and failures.
Thorough saga testing is what keeps distributed transactions trustworthy.
Apprends Microservices Communication Patterns (Saga, Circuit Breaker) avec un tuteur IA — gratuit
Écris et exécute du vrai code dans ton navigateur, obtiens de l'aide instantanée d'un tuteur IA disponible 24h/24, et reprends là où tu t'es arrêté sur le web ou dans l'app.
- Cours
- 12
- Leçons
- 48
Questions Fréquemment Posées
La leçon « Tester les sagas orchestrées » est-elle gratuite ?
Oui — le texte complet de « Tester les sagas orchestrées » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours Microservices Communication Patterns (Saga, Circuit Breaker), passe à CoddyKit PRO. Le cours Microservices Communication Patterns (Saga, Circuit Breaker) comprend 4 leçons au total.
Qu'est-ce que j'apprendrai dans « Tester les sagas orchestrées » ?
Apprenez à tester les sagas fondées sur l’orchestration, en couvrant les tests unitaires des parcours de compensation, les tests d’intégration avec des pannes de services simulées et la vérification… Tu pratiques Microservices Communication Patterns (Saga, Circuit Breaker) avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.
Dois-je avoir de l'expérience pour commencer Microservices Communication Patterns (Saga, Circuit Breaker) ?
Aucune expérience préalable n'est requise. Microservices Communication Patterns (Saga, Circuit Breaker) sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 4 sur 4.
Combien de temps prend la leçon « Tester les sagas orchestrées » ?
La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.
Peux-tu écrire et exécuter du code dans cette leçon Microservices Communication Patterns (Saga, Circuit Breaker) ?
Oui. Chaque leçon Microservices Communication Patterns (Saga, Circuit Breaker) inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.
Toutes les leçons de ce cours
- Conception d’orchestrateurs de sagas
- Machines à états pour l’orchestration
- Mise en œuvre avec un moteur de flux de travail
- Tester les sagas orchestrées