Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
カートの信頼性を担保するWireMockを使ったe2eテスト
Search
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
ykagano
August 06, 2026
Technology
790
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
110
2年前に削除したPHPクラスが、 ある日突然決済をエラーにした
ykagano
1
1.3k
決済システムの信頼性を支える技術と運用の実践
ykagano
1
1.3k
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
When Token Pruning is Worse than Random: Understanding Visual Token Information in VLLMs
sansantech
PRO
0
200
紙 to デジタル
ichien178
0
460
AI駆動開発をチームに根付かせる - 「1行も書かない」チームがHarnessを育てた1年 -
kenichirokimura
6
3.5k
指示待ちから変化に応じるClaude Codeへ!~環境からAgentへの帰り道を作る~
gotalab555
8
1.7k
MCPを待つな、パスキーを拡げよう(OAuth/OIDC Numa (Immersion) Workshop 2026)
oidfj
PRO
0
400
Contract One Engineering Unit 紹介資料
sansan33
PRO
0
20k
Windows の互換機能 - 古いプログラムはなぜ動作できるのか
murachiakira
PRO
0
140
Introduction to Sansan Meishi Maker Development Engineer
sansan33
PRO
0
470
Eight Engineering Unit 紹介資料
sansan33
PRO
3
8.3k
ClaudeCodeでセキュリティ監視業務を半自動化_1年の運用でわかったAIに任せる設計の5つのポイント
kintotechdev
3
980
最新技術に積極チャレンジ!EKS共通基盤のこれまでとこれから
daitak
0
270
魔法少女がClaude Codeを監視する / ccportal-deck
noriyukitakei
3
100
Featured
See All Featured
世界の人気アプリ100個を分析して見えたペイウォール設計の心得
akihiro_kokubo
PRO
74
42k
KATA
mclloyd
PRO
35
15k
How to Get Subject Matter Experts Bought In and Actively Contributing to SEO & PR Initiatives.
livdayseo
0
180
Mobile First: as difficult as doing things right
swwweet
225
10k
Abbi's Birthday
coloredviolet
3
9.6k
Imperfection Machines: The Place of Print at Facebook
scottboms
270
14k
The agentic SEO stack - context over prompts
schlessera
0
880
Mind Mapping
helmedeiros
PRO
1
340
Dominate Local Search Results - an insider guide to GBP, reviews, and Local SEO
greggifford
PRO
0
310
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
37
6.6k
Bootstrapping a Software Product
garrettdimon
PRO
306
120k
Prompt Engineering for Job Search
mfonobong
0
420
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