Upgrade to Pro — share decks privately, control downloads, hide ads and more …

カートの信頼性を担保するWireMockを使ったe2eテスト

Avatar for ykagano ykagano
August 06, 2026

 カートの信頼性を担保するWireMockを使ったe2eテスト

2026/8/6 PHPカンファレンス2026 リジェクトコン&アフターイベント 発表資料

Avatar for ykagano

ykagano

August 06, 2026

More Decks by ykagano

Other Decks in Technology

Transcript

  1. 自己紹介 氏名:加賀野 祐(ykagano) 所属:BASE株式会社 BASE Department Product Division 役割:シニアエンジニア(バックエンド) 趣味:お酒、旅行、キャンプ

    ykagano 2024年8月にBASE株式会社に入社 その前は以下の開発を経験してきました - 2009年〜:NET CASH - 2012年〜:WebMoney - 2017年〜:Yahoo!ウォレット、PayPay © 2012-2026 BASE, Inc. 2
  2. Playwrightでのe2eテスト test('通常商品をクーポンを適用してのクレジットカード決済で購入する @important @normal', async ({page,}) => { // 通常商品をカートに追加する

    await addNormalItemToCart(page) _ // 基本の情報を入力をする await inputPersonalInfo(page) _ // クーポンを適用する await applyCoupon(page, 'CAMPAIGN_20PERCENT_OFF') _ // クレジットカード決済を選択して情報を入力し確認画面へ await chooseCreditCardPayment(page) _ // 確認ページで各種金額を確認する await assertAmounts(page, { totalAmount: 80, subTotalAmount: 100, shippingAmount: 0, couponAmount: 20, }) _ // 注文完了をする await completeOrder(page) _ // 購入完了ページに遷移したかを確認する await assertOrderCompleted(page) }) © 2012-2026 BASE, Inc. 左のコードはクレジットカード 決済のシナリオ例 @important @normal などをタグ付けすることで e2eの実行対象を グループ化してます $ yarn test --grep @important 5
  3. 広範なe2eテストシナリオ BASEでは商品種別と決済手段が多岐に渡るため、そのパターン分のテストが必要 商品種別 決済手段 全件(53件)実行で @normal(17件)実行で 通常商品 クレジットカード決済 定期便商品 あと払い

    4分程度 2分程度 テイクアウト商品 Amazon Pay オプション付き商品 PayPal 予約商品 PayPay 抽選商品 銀行振込 デジタルコンテンツ キャリア決済 コミュニティ限定商品 コンビニ決済 © 2012-2026 BASE, Inc. 6
  4. 外部サービスに接続した e2eテスト • 2023年から運用してきました • 当初はGHAで動いてましたが、速度とコストの兼ね合いから昨年Circle CIに移行 Playwright e2e (CircleCI)

    決済手段を一通り 実施するシナリオ VPN接続 開発環境 (カート) 3シャード並列で 同時実行 © 2012-2026 BASE, Inc. インターネット 外部サービス サンドボックス リリース前に実行 3分以内に完了が目標値 7
  5. 全部を自前実装はしない → WireMock ❌ 全部アプリで自前実装 ⭕ WireMock を採用 ・外部APIの本数分、実装と保守が必要 ・HTTP

    APIのモックサーバーOSS(Java製) ・AIで実装・保守コストは下がっているが、レ ビューが必要な状態はなるべく減らしたい ・スタブ定義(JSON)を書くだけで応答を再現 ・自前コードを持たない = レビュー対象を増 やさない 副産物:モック環境は負荷テストにも流用できる © 2012-2026 BASE, Inc. 11
  6. Before 外部決済サービス ステージング環境 実SDK・画面読込 フロントエンド あと払い PayPal / Amazon Pay

    / PayPay 実API呼び出し バックエンド 銀行振込 コンビニ キャリア決済 © 2012-2026 BASE, Inc. 12 12
  7. システム構成: WireMock + PHPモックアプリ スタブ登録 リクエストログ確認 wiremock-hub スタブ管理GUI(自作OSS) nginx Playwright

    e2e (CircleCI) リクエスト スタブ同期 WireMock 外部APIレスポンス (スタブ定義) プロキシ(後述) PHPアプリ(php-fpm + Slim) AES暗号化・JWS署名 ・モック用画面 © 2012-2026 BASE, Inc. 16
  8. WireMockはプロキシにもなれる 同じパスにアクセスする場合、通常nginxの設定でWireMockとPHPアプリのルーティン グが必要ですが、WireMockはスタブ単位でプロキシにもなれるため、WireMockで全て 受けた上で、PHPアプリがレスポンスを返す形にできます nginx /payment/ はスタブが応答 php-fpmはhttpを返せないため、 /payment/* はPHPアプリにプロキシ

    実際にはnginxが間に入っている WireMock 外部APIレスポンス (スタブ定義) PHPアプリ(php-fpm + Slim) AES暗号化・JWS署名・モック用画面 nginx.confの追加設定不要。wiremockにスタブ・モックの設定が集約できる © 2012-2026 BASE, Inc. 17
  9. WireMockをプロキシにする設定 { "mappings": [{ "name": "Payment Proxy to PHP app",

    "priority": 10, "request": { "urlPathPattern": "/payment(/.*)?" }, "response": { "transformers": ["response-template"], "proxyBaseUrl": " {{#if (systemValue type='ENVIRONMENT' key='WIREMOCK_SLIM_PROXY_BASE_URL')}} {{systemValue type='ENVIRONMENT' key='WIREMOCK_SLIM_PROXY_BASE_URL'}} {{else}} http://localhost:8081 {{/if}} " } }] } © 2012-2026 BASE, Inc. 18