オーケストレーション型Sagaのテスト
オーケストレーション型Sagaのテスト方法を学びます。補償処理のユニットテスト、サービス障害をシミュレートする統合テスト、Saga完了を検証するエンドツーエンドテストを扱います。
「オーケストレーション型Sagaのテスト」はCoddyKit上の無料Microservices Communication Patterns (Saga, Circuit Breaker)レッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはMicroservices Communication Patterns (Saga, Circuit Breaker)学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Microservices Communication Patterns (Saga, Circuit Breaker)コースには全4レッスンが含まれています。
このレッスンの一部はまだ翻訳されておらず、英語で表示されています。
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.
AI チューターと学ぶ Microservices Communication Patterns (Saga, Circuit Breaker) — 無料
ブラウザでリアルコードを書いて実行し、24/7 の AI チューターから瞬時にサポートを受け、ウェブまたはアプリで続きから学習できます。
- コース
- 12
- レッスン
- 48
よくある質問
「オーケストレーション型Sagaのテスト」レッスンは無料ですか?
はい。「オーケストレーション型Sagaのテスト」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Microservices Communication Patterns (Saga, Circuit Breaker)コースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Microservices Communication Patterns (Saga, Circuit Breaker)コースには全4レッスンが含まれています。
「オーケストレーション型Sagaのテスト」で何を学びますか?
オーケストレーション型Sagaのテスト方法を学びます。補償処理のユニットテスト、サービス障害をシミュレートする統合テスト、Saga完了を検証するエンドツーエンドテストを扱います。 ブラウザで直接実行するハンズオンコードでMicroservices Communication Patterns (Saga, Circuit Breaker)を演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Microservices Communication Patterns (Saga, Circuit Breaker)を始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのMicroservices Communication Patterns (Saga, Circuit Breaker)は初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。
「オーケストレーション型Sagaのテスト」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このMicroservices Communication Patterns (Saga, Circuit Breaker)レッスンでコードを書いて実行できますか?
はい。すべてのMicroservices Communication Patterns (Saga, Circuit Breaker)レッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- Sagaオーケストレーターの設計
- オーケストレーションのステートマシン
- ワークフローエンジンによる実装
- オーケストレーション型Sagaのテスト