WebhookとAsync Workflowのテスト:SaaSテストの最難関

Yunhao Jiao
WebhookとAsync Workflowのテスト:SaaSテストの最難関カバー

WebhookはモダンなSaaSの配管です。Stripeは決済イベントを送信します。GitHubはプッシュイベントを送信します。Slackはメッセージイベントを送信します。アプリケーションはそれらをバックグラウンドで処理し、ユーザーの操作なしに状態を更新します。

Webhookのテストは難しいことで知られています。イベントは外部サービスから届きます。非同期で到着します。順序が前後したり、重複したり、サイレントに失敗したりすることがあります。従来のE2Eテストフレームワークはこれに対応するよう設計されていませんでした。

Webhookテストが難しい理由

UIトリガーがない。ほとんどのE2Eテストはユーザーアクションから始まります:ボタンをクリックする、フォームに入力する。WebhookはバックグラウンドでUEします。Stripeの決済イベントをトリガーするクリックするボタンはありません。

非同期処理。Webhookが届き、ハンドラーがそれを処理し、その結果は少し後にデータベースやUIに反映されます。テストはフレーキーにならずにこのタイミングのギャップを処理する必要があります。

外部依存関係。Webhookは、Stripe、GitHub、またはその他のサービスから送信されます。テスト時には、実際のサービスのテストモードイベントか、Webhookシミュレーターが必要です。

冪等性の要件。Webhookプロバイダーは、同じイベントを重複して送信することがあります。ハンドラーは、重複レコードを作成せずに正しく処理できなければなりません。

Webhookテストの実践的なアプローチ

アプローチ1:ハンドラーを直接テストする。サンプルペイロードを使ってWebhookハンドラーを呼び出すユニットテストを作成します。これによりハンドラーのロジックを検証できますが、統合上の問題(署名検証、HTTPパース、データベース書き込みなど)は見逃す可能性があります。

アプローチ2:アプリケーションを通じてテストする。Webhookを発生させるアクション(例:Stripeのテスト決済を完了する)をトリガーし、アプリケーションの状態が正しく更新されたことを確認します。これは包括的な方法ですが、外部サービスのテストモードが必要です。

アプローチ3:観測可能な結果をテストする。Webhookハンドラー自体をテストするのではなく、Webhookが発火した後に成立すべき状態をテストします。決済Webhookがサブスクリプションをアクティベートするはずであれなければなら、決済フロー完了後にユーザーが有料機能にアクセスできることをテストします。

TestSpriteはデフォルトでアプローチ3を採用しています。バックグラウンドプロセスの影響を含む完全なユーザーフローをテストします。決済フロー後にはサブスクリプションのアクティベーションを検証し、フォーム送信後にはメール配信の結果を検証します。非同期処理は、観測可能なアウトカムを通じてテストされます。

Webhookを多用するSaaSアプリケーションにとって、このアプローチは本当に重要なバグを検出します。アクティベートされないサブスクリプション、送信されない通知、同期されないデータなどです。

TestSpriteを無料で試す →