GH GambleHub

統合のためのモックとスタブ

1)なぜ私達はmidgesおよびプラグを必要とします

決済プロバイダ、KYCサービス、メッセージブローカー、CRMなどとの統合により、テストが遅く、不安定で高価です。モキ/プラグは許可します:
  • 不安定な環境からサービスロジックを分離する
  • 応答とエラーの特定
  • まれなボーダーケース(タイムアウト、429/5xx、矛盾)を再現します。
  • ローカルおよびCIでテストを迅速かつ予測可能に実行します。
💡 原則:より低いテストレベル(単位/部品)、私達が取り替えるより多く;生産現実(Integration/E2E)に近いほどプラグが少なくなります。

2)利用規約と分類

スタブは、インタラクションチェックなしで、固定応答を持つシンプルなスタブです。
モック-呼び出しを待ち、それらを検証するオブジェクト(order/number/arguments)。
Fakeは、実際の動作を持つ簡略化された実装(例えば、In-Memoryリポジトリ)です。
スパイは実際の通話を記録するラッパーです。
サービス仮想化は、スクリプト、ステータス、ネットワーク機能を備えた「仮想」外部サービスです。
録音/再生-実際のトラフィックとその後の再生の記録(フィルタ/エディション付き)。

いつ選択するか:
シチュエーション[ツール]
純粋なビジネスロジック偽物(インメモリ)、ユニットモック
シンプルなケースとのHTTP統合スタブ(WireMock/MockServer/HTTPServer)
プロバイダに顧客契約を確認するCDCモック(協定)
複雑なネットワークシナリオ/条件/エラーサービス仮想化/Hoverfly/MockServer
メッセージ(Kafka/RabbitMQ)Testcontainers+スキーマ対応のプロデューサー/コンシューマースタブ

3)テスト可能性のための建築パターン

Ports&Adapters (Hexagonal):インターフェイスを超えて統合を行う-fake/mockに置き換えるのは簡単です。
腐敗防止レイヤー(ACL): 1つのモジュールが外部モデルをドメインモデルに変換します。
Contract-awareクライアント:OpenAPI/Protobuf生成→マニュアルの矛盾が少ない。
特徴フラグとサンドボックスモード:プロバイダの安定したための安全なキー/エンドポイント。

4) HTTP: ツールと例

4.1 WireMock (スタンドアロン/Java DSL)

JSONスタブ:
json
{
"request": { "method": "POST", "urlPath": "/v1/payouts", "headers": { "Idempotency-Key": { "matches": ".+" } } },
"response": {
"status": 201,
"headers": { "Content-Type": "application/json" },
"jsonBody": { "id": "po_123", "status": "queued" },
"fixedDelayMilliseconds": 80
}
}
Java DSL(ボディチェックとバリエーション付き):
java stubFor(post(urlEqualTo("/v1/payouts"))
.withHeader("Idempotency-Key", matching(".+"))
.withRequestBody(matchingJsonPath("$.amount", equalTo("100. 00")))
.willReturn(aResponse(). withStatus(201). withHeader("Content-Type","application/json")
.withBody("{\"id\":\"po_123\",\"status\":\"queued\"}")));

4.2 MockServer(ダイナミクス/検証)

json
{
"httpRequest": { "method": "GET", "path": "/v1/wallets/w123" },
"httpResponse": { "statusCode": 200, "headers":[{"name":"Content-Type","values":["application/json"]}],
"body": { "id":"w123","currency":"EUR","balance":0 } }
}

4.3ホバーフライ(ミドルウェア、レコード/リプレイ)

プロバイダのサンドボックスに対するトラフィックを記録し、PIIをクリアし、フィクスチャとして修正します。
シミュレーションモードでは、200/4xx/5xx、遅延、および「フレーク」ウィンドウのバリエーションを追加します。

4.4ノード(Nock )/Python (responses )/Go ('httptest')

ノック:
js nock('https://psp. example. com')
.post('/v1/payouts'). reply(201, { id:'po_123', status:'queued' })
.post('/v1/payouts'). reply (409, {code: 'duplicate'}) ;//second call - conflict
Go:
go srv:= httptest. NewServer(http. HandlerFunc(func(w http. ResponseWriter, r http. Request){
if r. Header. Get("Idempotency-Key") == "" { w. WriteHeader(400); return }
w. Header(). Set("Content-Type","application/json")
w. WriteHeader(201); w. Write([]byte(`{"id":"po_123","status":"queued"}`))
}))
defer srv. Close()

5) gRPC/Protobuf

5.1スタブ生成

'。proto'によってサーバーを生成し、制御された応答を持つメソッドを実装します。
メタデータ(ヘッダー)、ステータス('codes。無効な引数'、'コード。DeadlineExceeded')。

Go gRPC fake(スニペット):
go type FakePayouts struct{ pb. UnimplementedPayoutsServer }
func (f FakePayouts) Create(ctx context. Context, in pb. PayoutReq)(pb. PayoutRes,error){
if in. Amount <= 0 { return nil, status. Error(codes. InvalidArgument,"amount>0") }
return &pb. PayoutRes{Id:"po_123", Status:"QUEUED"}, nil
}

5.ネガティブのための2 grpcurl


grpcurl -plaintext -d '{"amount":0}' localhost:50051 payouts. Payouts/Create

6)投稿とストリーム: Kafka/RabbitMQ

6.1スキーマ対応モキ

Schema Registryを使用し、テストでAvro/JSON-Schema/Protobufを検証します。
プロデューサーのテスト:メッセージはスキーマに対応します。消費者テスト:古いバージョンと新しいバージョンを受け入れます。

6.2テストコンテナ(Kafka+Registryの例)

java
KafkaContainer kafka = new KafkaContainer(DockerImageName. parse("confluentinc/cp-kafka:7. 6. 1"));
kafka. start();
//We publish the event and wait for consumption with deduplication by key

6.3ネガティブ

重複、順序の再配置、配達遅延、「毒」メッセージ(デッドレター)。
大きなメッセージ(ほぼ制限)、認識されていないスキーマバージョン。

7)契約対応プラグ

7.1 Pact (CDCモック)

消費者は期待を生成します→pactファイル→プロバイダは、スタンド上で検証します。
Pactスタブサーバーは、クライアント統合テストに期待を果たしています。

7.2 OpenAPI/Protobuf→安定生成

仕様からモックサーバを上げるツール(Prism、 openapi-mock、 grpc-mockを含む)。
仕様に負の例/コードを含める:これも契約です。

8)ネットワークとカオス: 失敗のシミュレーション

遅延とジッタ:固定/分散;締め切りと試行ごとのタイムアウトをチェックします。
タイムアウト/ブレーク:ハーフオープン接続、RST、リセットストリームH2、 503/Retry-After。
パケット損失/重複:gRPC/ストリーム用。
ツール:Toxiproxy、 MockServer(障害注入)、xk6-disruptor、 CIのnetem。

Toxiproxy (CLI)の例:

toxiproxy-cli toxic add psp --type latency --latency 300 --jitter 100

9)データ、秘密、決定論

Redactと合成:修正にPIIはありません。money-小数/厳密な書式設定。
時間固定:偽の時計;「昨日/今日」-コントロール。
Idempotency:同じ'Idempotency-Key'→同じ応答。
ジェネレータ:透明な値を持つデータのファクトリ/ビルダー(例:'test_user_001')。
バージョン管理の修正(タグ)、調停なしで「削除された」回答を保存しないでください。

10) CI/CDおよび環境

Matrix: unit (in-process fakes)→component (local virtualization)→integration (minimum moks、 Testcontainers)。
アーティファクト:pactファイル、OpenAPIスナップショット、iocサーバーログ、ドロップ用PCAP。
並列:ユニークなポート/キー接頭辞;容器の絶縁材。
ゲート:契約の緑(CDCは確認します)、有効な指定(lint)、渡される否定。

11) Antipatterns

実際のサービスにおけるモキの「コピー」欠陥→誤信。契約と定期的な記録/検証で処理します。
すべてのテスト→脆弱性、高価な主流で、全世界の「マクロモック」。薄いポートとACLを作成します。
実際の統合が必要なE2EでのMoki(特にHMAC/mTLSでの決済/Webhook)。
時間/ランダム/ネットワークレースのためのフレーク→偽の時計、決定論的な座席を使用します。
修正/リポジトリの秘密。秘密-秘密保管CIのみを介して。

12) iGaming/Financeの詳細

支払い/引き出し:Mokesは'Idempotency-Key'、 'Retry-After'、 HMAC/mTLS、制裁コードおよび'long'応答をサポートする必要があります。
ボーナスロジック/不正防止:velocity/429シナリオ、ATO/challenge、リスクソリューション「allow/deny/challenge」とTTL。
KYC/AML: KYCレベルによるサンドボックス応答、ネガ(不一致、無効なドキュメント)、アンチリプレイ付きWebhook ('X-Timestamp'ウィンドウ)。
管轄/テナント:必要な「X-Tenant/X-Region」見出し、異なる応答プロファイル。

13)ミニレシピ(チートシート)

支払いを繰り返します:WireMock「シナリオ」-最初の'201'、2番目の'409重複'。
遅いPSP: MockServer 'responseDelay'+クライアントの試行ごとのタイムアウトをチェックします。
Webhooks:ローカルHTTPサーバ+HMAC署名検証;5秒後に再生すると、ダブルは作成されません。
カフカの重複:同じメッセージを二度投稿します。ハンドラーはidempotentでなければなりません。
gRPCステータス:'codes'テストの行列(InvalidArgument、 DeadlineExceeded、 ResourceExhausted)。

14) Prod Readinessチェックリスト

  • ポート/アダプタがハイライトされます。統合はインターフェイスの後ろに隠されています。
  • HTTP/gRPCの場合-ネガ付きのコントラクト対応スタブ(Pact/OpenAPI/Proto)があります。
  • ブローカーの場合-Testcontainers+Registry;/order/largeメッセージテストを複製します。
  • カオス:遅延、タイムアウト、リセット、'Retry-After'で429/503;ネットワークはエミュレートされます(Toxiproxy/netem)。
  • PIIのない据え付け品;偽の時計;idempotencyは鋳造されます。
  • CIマトリックス:unit→component→integration;ログ/契約アーティファクトが保存されます。
  • プロバイダのサンドボックス:キーが分離され、エンドポイントが設定され、runbookがあります。
  • 録音/再生はスケジュール通りに更新され、トレースは編集されます。
  • flakyメトリクスと制御下でのテスト期間;成長を警告します。

15) TL;DR(ドクター)

薄いポートを介して統合を分離し、タスクに適切なツールを使用します。シンプルなケースのスタブ、インタラクションの検証のためのモック、現実的な動作のための偽物、ネットワークおよびまれなエラーのためのサービス仮想化とカオス。moki contract-conscious (Pact/OpenAPI/Proto)を作り、決定論的およびPIIフリーの修正を維持し、遅延/タイムアウト/429/5xxをシミュレートします。CIでは、pyramid: unit→component→integrationをビルドします。release block with red contr。支払い/CCMパスについては、HMAC/mTLS、 idempotence、および負のシナリオを検討してください。

Contact

お問い合わせ

ご質問やサポートが必要な場合はお気軽にご連絡ください。いつでもお手伝いします!

統合を開始

Email は 必須。Telegram または WhatsApp は 任意

お名前 任意
Email 任意
件名 任意
メッセージ 任意
Telegram 任意
@
Telegram を入力いただいた場合、Email に加えてそちらにもご連絡します。
WhatsApp 任意
形式:+国番号と電話番号(例:+81XXXXXXXXX)。

ボタンを押すことで、データ処理に同意したものとみなされます。