Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
カートの信頼性を担保するWireMockを使ったe2eテスト
Search
ykagano
August 06, 2026
Technology
900
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
カートの信頼性を担保するWireMockを使ったe2eテスト
2026/8/6 PHPカンファレンス2026 リジェクトコン&アフターイベント 発表資料
ykagano
August 06, 2026
More Decks by ykagano
See All by ykagano
人気商品が「ちゃんと買える」をつくる ー ECの負荷改善
ykagano
1
260
2年前に削除したPHPクラスが、 ある日突然決済をエラーにした
ykagano
1
1.4k
決済システムの信頼性を支える技術と運用の実践
ykagano
1
1.4k
Copilot Agentを普段使いしてわかった、バックエンド開発で使えるTips
ykagano
1
2.4k
プレイングマネージャーになったときの話
ykagano
2
1.5k
WEBエンジニアが知っておきたい決済の仕組み
ykagano
3
3.9k
プロジェクトにおけるリーダブルコードの考え方
ykagano
2
2.2k
GWにスマートスピーカーアプリを作ってみた
ykagano
1
1.3k
開発効率を上げるSwaggerの話
ykagano
0
1.5k
Other Decks in Technology
See All in Technology
山手線を徒歩で一周してわかった、 位置情報アプリは「足」が最強のデバッガー
hinakko
0
180
What the customer really needed
kawaguti
PRO
3
220
Antigravity SDK for the Java Developer
glaforge
0
170
フルカイテン株式会社 エンジニア向け採用資料
fullkaiten
0
12k
すぐできる衛星通信対応 あとは山奥に行くだけ
tatetate55
0
140
サーバーレスをどこまで使う? WebRTC対戦ゲームで選んだVPSとの共存設計
kaidouji85
0
300
AIエージェントを最高のパートナーに育てる方法|評価と判断軸を育てる5つのステップ
koichiaoki
1
160
ユーザー価値を届け続けるためにウォンテッドリーが大切にしている文化
kotaminato
0
190
事業課題から技術的負債に向き合う
sansantech
PRO
2
2.2k
CLIライブラリ開発を支える技術
htnabe
0
140
AIエージェントの一手は 誰も見ていない - Falco拡張OSS「Prempti」とeBPFで サーバーレス実行基盤を二層防御する
keitah
0
460
AgentCore Runtime上にAgentic Coding基盤を構築・展開する際の設計ポイントと限界点 / Design considerations and limitations when building an agentic coding platform on AgentCore Runtime
har1101
5
630
Featured
See All Featured
Facilitating Awesome Meetings
lara
57
7.1k
The Curse of the Amulet
leimatthew05
3
15k
First, design no harm
axbom
PRO
2
1.3k
From Legacy to Launchpad: Building Startup-Ready Communities
dugsong
0
340
Why Your Marketing Sucks and What You Can Do About It - Sophie Logan
marketingsoph
0
410
Marketing Yourself as an Engineer | Alaka | Gurzu
gurzu
0
300
Claude Code どこまでも/ Claude Code Everywhere
nwiizo
67
58k
GraphQLの誤解/rethinking-graphql
sonatard
75
12k
Exploring anti-patterns in Rails
aemeredith
4
510
Agile Actions for Facilitating Distributed Teams - ADO2019
mkilby
0
280
ReactJS: Keep Simple. Everything can be a component!
pedronauck
666
130k
Mind Mapping
helmedeiros
1
370
Transcript
カートの信頼性を担保する WireMockを使った e2eテスト @ykagano 2026/8/6 PHPカンファレンス2026 リジェクトコン&アフターイベント © 2012-2026 BASE,
Inc. 1
自己紹介 氏名:加賀野 祐(ykagano) 所属:BASE株式会社 BASE Department Product Division 役割:シニアエンジニア(バックエンド) 趣味:お酒、旅行、キャンプ
ykagano 2024年8月にBASE株式会社に入社 その前は以下の開発を経験してきました - 2009年〜:NET CASH - 2012年〜:WebMoney - 2017年〜:Yahoo!ウォレット、PayPay © 2012-2026 BASE, Inc. 2
アジェンダ • 外部サービスに接続したe2eテストと、その保守コスト • 外部環境をモック化する • 足りない部分はPHPで書く • 2段構えの運用 ©
2012-2026 BASE, Inc. 3
外部サービスに接続した e2eテストと、その保守コスト © 2012-2023 BASE, Inc. 4
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
広範なe2eテストシナリオ BASEでは商品種別と決済手段が多岐に渡るため、そのパターン分のテストが必要 商品種別 決済手段 全件(53件)実行で @normal(17件)実行で 通常商品 クレジットカード決済 定期便商品 あと払い
4分程度 2分程度 テイクアウト商品 Amazon Pay オプション付き商品 PayPal 予約商品 PayPay 抽選商品 銀行振込 デジタルコンテンツ キャリア決済 コミュニティ限定商品 コンビニ決済 © 2012-2026 BASE, Inc. 6
外部サービスに接続した e2eテスト • 2023年から運用してきました • 当初はGHAで動いてましたが、速度とコストの兼ね合いから昨年Circle CIに移行 Playwright e2e (CircleCI)
決済手段を一通り 実施するシナリオ VPN接続 開発環境 (カート) 3シャード並列で 同時実行 © 2012-2026 BASE, Inc. インターネット 外部サービス サンドボックス リリース前に実行 3分以内に完了が目標値 7
しかし、保守コストはそれなりに重い • 外部環境のURL変更に、都度追従 • 外部環境のUI変更で、Playwrightが要素を見失う • 外部環境の応答が遅く、テストがflakyに • 一定回数実行すると、リセットが必要な環境も •
「安定化できませんか?」→「テスト環境なので」 © 2012-2026 BASE, Inc. 8
外部環境をモック化する © 2012-2023 BASE, Inc. 9
e2eの安定化に取り組み始める • 安定しない外部環境をモック化すればいいのではないか • これまではモック化しても保守コストを考えると割に合わなかった • 既存をモックに置き換えるという答えのあるものを作るのはAIが得意な領域 • AIがモックを作り保守する前提で設計する •
ブラックボックスにはせず、人間が理解できるシンプルな設計を目指す © 2012-2026 BASE, Inc. 10
全部を自前実装はしない → WireMock ❌ 全部アプリで自前実装 ⭕ WireMock を採用 ・外部APIの本数分、実装と保守が必要 ・HTTP
APIのモックサーバーOSS(Java製) ・AIで実装・保守コストは下がっているが、レ ビューが必要な状態はなるべく減らしたい ・スタブ定義(JSON)を書くだけで応答を再現 ・自前コードを持たない = レビュー対象を増 やさない 副産物:モック環境は負荷テストにも流用できる © 2012-2026 BASE, Inc. 11
Before 外部決済サービス ステージング環境 実SDK・画面読込 フロントエンド あと払い PayPal / Amazon Pay
/ PayPay 実API呼び出し バックエンド 銀行振込 コンビニ キャリア決済 © 2012-2026 BASE, Inc. 12 12
After 外部決済モック ステージング環境 モックSDK・画面読込 モックSDK配信 フロントエンド モックAPI呼び出し フロント画面 バックエンド WireMock
© 2012-2026 BASE, Inc. 13 13
WireMockでは代替できないものがあった • AES暗号化/復号 • JWS署名の生成・検証 • これらの機能と連携したモック用の決済画面 • WireMockでもJava拡張を書けば技術的には可能 •
ただ、PHPチームがJava拡張を保守し続けるのは割に合わない © 2012-2026 BASE, Inc. 14
足りない部分は PHPで書く © 2012-2023 BASE, Inc. 15
システム構成: WireMock + PHPモックアプリ スタブ登録 リクエストログ確認 wiremock-hub スタブ管理GUI(自作OSS) nginx Playwright
e2e (CircleCI) リクエスト スタブ同期 WireMock 外部APIレスポンス (スタブ定義) プロキシ(後述) PHPアプリ(php-fpm + Slim) AES暗号化・JWS署名 ・モック用画面 © 2012-2026 BASE, Inc. 16
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
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
WireMock Hubの紹介 ・WireMock のスタブとインスタンスを一元管理する自作OSS(Apache 2.0) ・プロジェクト単位でスタブ群をまるごと差し替え ・スタブはSQLiteで管理し、Admin REST API 経由で
WireMock に同期 https://github.com/ykagano/wiremock-hub © 2012-2026 BASE, Inc. 19
WireMockを可視化・スタブ同期する OSS © 2012-2026 BASE, Inc. 20
WireMockを可視化・スタブ同期する OSS © 2012-2026 BASE, Inc. 21
WireMockを可視化・スタブ同期する OSS © 2012-2026 BASE, Inc. ※例としてwiremock-hub自身のAPIを登録 22
2段構えの運用 © 2012-2023 BASE, Inc. 23
モック環境の e2eは、安定して速い • 外部起因のflakyから解放される • ドメイン変更・UI変更への追従が不要に • サンドボックスの応答待ちがない • 外部接続しないため、実行回数・並列数の制約もない
© 2012-2026 BASE, Inc. 24
モックで毎回、実接続で毎朝チェック モック (リリース前に毎回) 実接続(別環境で毎朝・自動) ・リリース前に毎回実行 ・別環境で毎朝、自動実行 ・接続先がモックのため、速くて確実 ・本物の外部サンドボックスに接続 ・自分たちのコードの品質を検証する ・外部の仕様変更・環境の変化を検知する
速さと安定性はモックで取り、外部との整合は毎朝の実接続で取る © 2012-2026 BASE, Inc. 25
まとめ • e2eテストの速さと安定性は、外部依存の切り離しで決まる • WireMockで大半をモック化。表現できない機能・画面はPHPで書く • モックで毎回、実接続でも毎朝、2段構えでカートの信頼性を担保する © 2012-2026 BASE,
Inc. 26
以上です BASE社の採用情報: https://binc.jp/jobs ご清聴ありがとうございました!! © 2012-2026 BASE, Inc. 27