Lock in $30 Savings on PRO—Offer Ends Soon! ⏳
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
堅牢なフロントエンドテスト基盤を構築するために行った取り組み
Search
Shogo Fukami
November 30, 2025
Programming
1
190
堅牢なフロントエンドテスト基盤を構築するために行った取り組み
Shogo Fukami
November 30, 2025
Tweet
Share
More Decks by Shogo Fukami
See All by Shogo Fukami
駆け出しSREが半年で作り上げた仕組みと学びのまとめ
shogo4131
0
3
フロントエンド UIコンポーネント Shadcn/uiの良さを伝えたい!
shogo4131
0
240
本業 + 副業2社で働くエンジニアの時間術
shogo4131
0
230
スタートアップで学ぶフルリモート開発の進め方
shogo4131
0
560
フリーランスエンジニア辞めてみた!
shogo4131
0
620
Jotaiをプロジェクトに導入してみた
shogo4131
0
78
激戦区東京でフリーランスとして生き残った方法3選
shogo4131
0
43
MUIは不要? React次世代コンポーネントライブラリ Mantine!!!
shogo4131
0
170
Other Decks in Programming
See All in Programming
競馬で学ぶ機械学習の基本と実践 / Machine Learning with Horse Racing
shoheimitani
14
14k
俺流レスポンシブコーディング 2025
tak_dcxi
0
850
React Native New Architecture 移行実践報告
taminif
1
120
Reactive Thinking with Signals and the new Resource API
manfredsteyer
PRO
0
130
dotfiles 式年遷宮 令和最新版
masawada
1
170
Promise.tryで実現する新しいエラーハンドリング New error handling with Promise try
bicstone
3
1.7k
MAP, Jigsaw, Code Golf 振り返り会 by 関東Kaggler会|Jigsaw 15th Solution
hasibirok0
0
160
TVerのWeb内製化 - 開発スピードと品質を両立させるまでの道のり
techtver
PRO
3
1.3k
S3 VectorsとStrands Agentsを利用したAgentic RAGシステムの構築
tosuri13
4
220
関数実行の裏側では何が起きているのか?
minop1205
1
270
2025 컴포즈 마법사
jisungbin
0
160
Rails Girls Sapporo 2ndの裏側―準備の日々から見えた、私が得たもの / SAPPORO ENGINEER BASE #11
lemonade_37
2
200
Featured
See All Featured
How to Think Like a Performance Engineer
csswizardry
28
2.3k
The MySQL Ecosystem @ GitHub 2015
samlambert
251
13k
jQuery: Nuts, Bolts and Bling
dougneiner
65
8k
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
PRO
196
67k
Making Projects Easy
brettharned
120
6.5k
Thoughts on Productivity
jonyablonski
73
4.9k
Music & Morning Musume
bryan
46
7k
Git: the NoSQL Database
bkeepers
PRO
432
66k
Practical Orchestrator
shlominoach
190
11k
Why You Should Never Use an ORM
jnunemaker
PRO
60
9.6k
Context Engineering - Making Every Token Count
addyosmani
9
440
Keith and Marios Guide to Fast Websites
keithpitt
413
23k
Transcript
2025.11.30 Shogo Fukami 堅牢なフロントエンドテスト基盤を構築する ために⾏った取り組み フロントエンドカンファレンス関西 2025
⾃⼰紹介 略歴 複数の⼤⼿メガベンチャー、スタートアップを経て 昨年10⽉にカナリーへジョイン 直近はフロントエンドエンジニアの業務を兼務しな がらSRE周りの業務も並⾏して実施 深美 翔悟 / Shogo
Fukami 株式会社カナリー 『CANARY』テクニカルリードエンジニア 直近の出来事 温泉サウナが趣味で週2回ぐらいは⾏って息抜きをしています フロントエンドエンジニアの業務とSRE周りの業務を並⾏して実施 つぶやき 本⽇は東京から参加させていただきました 関⻄出⾝で関⻄弁を交えながら話していきたい
None
BtoC/BtoB両軸でプロダクトを展開 *アプリ評価: iOSおよびGooglePlayにおける主要部屋探しアプリのユーザー評価(2022年11⽉data.ai社調査)。 ‧BtoC 不動産マーケットプレイス「カナリー」 ‧アプリ版 累計DL数 500万 (Web版もあります!) ‧カテゴリ内ユーザー評価No.1(App
Store ★4.8)* ‧TVCMも全国で放映 ‧BtoB 不動産仲会社向けSaaS「カナリークラウ ド」 ‧累計利⽤者数 200万⼈を突破 ‧後発ながら、全国の地⽅⼤⼿企業様を軸に急成 ⻑
アジェンダ 1.なぜフロントエンドテストを書くべきなのか 2.テスト基盤策定 3.テストガイドライン策定 4.AIを使⽤したテスト実装 5.まとめ 実際の取り組みと⼯夫したポイントを交えてお話します!
みなさん!! フロントエンドのテスト書いてますか?
背景 / 課題 テストはあったもののユニットテスト (実装より)が多く、重要な ところがカバーできていなかった どこに何をテスト実装すればいいかわからない 実装していたら別のコンポーネントが消えてた 8割くらい発⽣しているバグはテストでカバーできるもの etc..
なぜフロントエンドテストを 書くべきなのか
アプリケーションの"⼊り⼝"であり 売上に直結するため
アプリケーションの"⼊り⼝"であり売上に直結 フロントエンドはアプリケーションの⼊り⼝ UI崩れ/ボタン不具合 = 離脱‧機会損失 toC: ユーザー離脱‧売上減少 toB: 繁忙期に利⽤不能 →
数百万円の損失も フロントエンドの不具合はビジネスに直結するため テストは書かなければならない!
テスト基盤の策定
何をテストすればいいのか?
テストの対象を絞る
テストの対象を絞る 全部テストするのは⾮現実的 画⾯数が多い メンテコストが爆増 費⽤対効果が悪い テストは "選択と集中" が必須 すべてを守ることはできない "どこが壊れると最も困るか"
を明確にする必要がある テストは"すべて"ではなく"重要な部分"に集中すべき
テスト対象はどのようにして絞るのか?
テスト対象はプロダクトから逆算する
テスト対象はプロダクトから逆算する テスト対象の選定はプロダクトを理解することから始まる テストの⽬的は "アプリが動いていること" ではない プロダクト価値が毀損されないこと 売上につながる導線はどこか? どこが壊れると致命的なのか? ユーザーは何に価値を感じるのか?
CANARYのビジネスモデル
CANARYのビジネスモデル エンドユーザー 物件を探している⼈ 物件検索 問い合わせ送信 CANARY BtoC不動産マーケットプレイス 仲介会社 物件を紹介する不動産会社 成果報酬(fee)
CANARYはユーザーがお問い合わせに成功した仲介会社から成果報酬を得る
プロダクトで最も重要な 導線をテストする
ビジネスで最も重要な導線をテストする ビジネス価値に直結する最重要導線 トップ 検索 物件詳細 お問い合わせ 完了 テスト戦略:この⼀連の導線の画⾯を確実に守る 抽出した導線を中⼼にテストを集中させる!
テストガイドラインの策定
なぜテストガイドラインが必要なのか?
なぜテストガイドラインが必要なのか?(理由) これからは「AIにテストを書かせ、⼈がレビュー」する時代 スタイルがバラバラになると、 可読性低下 メンテナンスコスト増⼤ 共通のガイドラインがないと、テストが脆くなる ⼈とAIの両⽅が理解できる共通フォーマットが必要
なぜテストガイドラインが必要なのか?(⽬指す状態) 誰が書いても同じ品質 壊れにくく保守しやすいテスト テストの書き⽅を統⼀することで、⼈間とAIが協調できる環境を整える
ガイドライン策定(全体像)
ガイドライン策定プロセス(全体像) ガイドラインは2つの柱で構成:テストの層とスタイルを明確に定義 ① Testing Trophy(レイヤー) テストを"どの層に書くか" ② BDD / GWT(スタイル)
テストを"どう書くか" 「どの層に」「どう書くか」を定義する
Testing Trophy のおさらい(どの層に書く?) Testing Trophy(Kent C. Dodds) なぜ Integration 中⼼?
E2E:少なく Integration:厚く Unit:必要なものに最⼩限 複数コンポーネントが組み合わさって初めて動く UI が多い E2Eより軽くて安定 Unitよりユーザー体験に近い 参考⽂献:The Testing Trophy and Testing Classifications フロントエンドでは、Integration テストが最も費⽤対効果が⾼い
CANARYにおけるインテグレーションテスト 構成:package-by-feature(機能単位でのパッケージ構成) 実装区分:pages = 画⾯、components = 構成要素 テスト⽅針:画⾯単位でのテスト = ユーザー体験に近い
重点:pagesを中⼼にインテグレーションテストを記述 構造例: features/ └ search/ ├─ pages/ └─ components/
補⾜:ユニットテストが必要なケース 複雑なビジネスロジックをもつ Custom Hooks 外部ライブラリを含んだユーティリティ関数 依存関係が多い処理やパフォーマンス重視のロジック UIと切り離して保守性を上げる
テストをどう書くか?
BDDスタイルでテストを書く
BDDとは(どう書くか) BDD(Behavior Driven Development)とは、「このアプリはどう振る舞うべき か?」を⾃然⾔語で記述し、仕様‧テスト‧ドキュメントを⼀体化する⼿法 ソフトウェア開発において「システムの振る舞い」に焦点を当てた開発⼿法です。従来 のテスト駆動開発(TDD)を発展させた⼿法として、2003年に Daniel Terhorst-North ⽒によって提唱されました。
参考⽂献:Dan North "Introducing BDD"
BDDのポイント 実装に依存しない 内部実装が変わってもテストが壊れにくい ユーザー操作そのままのシナリオ 読みやすく意図が伝わる で記述 振る舞いに焦点を当てることで、 意図が明確で⻑期的に保守しやすいテストを実現 Good 👍
ex) ユーザーはお問い合わせ項⽬を⼊⼒してお問い合わせ確認ページへ遷移できる
どうテストを構造化する?
GWT(Given-When-Then)で構造化
GWT(Given-When-Then)とは (どう書く?) Given-When-Then パターンは、BDD(振る舞い)駆動開発の⼀部として開発さ れた、テストを構造的に表す⼿法。 Daniel Terhorst-North と Chris Matts
によって開発された構造化アプローチです。 参考⽂献:Martin Fowler: Given-When-Then
GWT(Given-When-Then)のポイント Given(前提条件) テストが開始する時点での初期状態を明確に定義します。 例)フォームが初期表⽰されている、ユーザーがログイン済み、特定のデータが存在する
GWT(Given-When-Then)のポイント When(操作) テスト対象のユーザーアクションを明確に定義します。 例)ボタンをクリック、フォームに⼊⼒、画⾯をスクロール、要素をドラッグ
GWT(Given-When-Then)のポイント Then(期待結果) 操作の結果として期待される状態を明確に定義します。 例)画⾯が遷移する、エラーメッセージが表⽰される、データが更新される
AIを使⽤したテスト実装
前提
前提 ‒ Try AI Budget 制度 制度のポイント 開発本部の正社員40名を対象に 1⼈あたり⽉額$200まで会社負担で AIツールを⾃由に試せる制度
「AIをためらわず試す⽂化」をつくることを ⽬的としています。 利⽤できるAIツール例 GitHub Copilot Claude Code ChatGPT, Codex Cursor Devin AQUA Voice そのほか新しいツールも随時追加中! 「試して学ぶ環境を保証することで、組織全体のAI活⽤を加速」
今回使⽤するAIとモデル AI: Claude Code(Opus 4.1) 選んだ理由: チームメンバーの9割が使⽤ サブエージェントを使える
どうAIにテストを書かせたいか?
テストケースの⼊⼒で AIにテストを書かせたい
検証するページ 例:物件を路線‧駅から探すページ ユーザーは東京駅を選択して検索結果ページ へ遷移できる ユーザーは東京駅を選択して検索条件追加 ページへ遷移できる ユーザーは東海道新幹線を選択して検索結果 ページへ遷移できる ユーザーは複数都道府県の路線で他県の 駅⼀覧が折りたたまれている駅をクリッ
クして検索結果画⾯へ遷移する このテストケースをそのままプロンプトに⼊⼒する!
プロンプト
None
期待しているコード
出⼒結果
describeがネストしている... セクション取るだけにgetAllByTextを使用 している... 駅の要素はgetByRoleで取得できそうな のにcheckboxを全て取得して東京駅を 検索している.... チェックボックスがあるかないかなど実 装のテストを書いている.... 期待していたテストコードとは程遠い
そうだ カスタムサブエージェント、 使おう。
Claude Codeのカスタムサブエージェントとは 特定のタスクや役割に特化して動作する、⼩さな独⽴したAIエージェントのこと コンテキストが⼤きくなるにつれて、LLMは迷ったり焦点を失ったりする可能性 が⾼くなるため、メインとは別のコンテキスト‧設定‧権限を持ち、専⾨的な処 理を担当することで、作業を分担し効率化できる。 ⇨ 要は、メインで使⽤しているコンテキストが肥⼤化するのを解決してLLMが ⽣成するコードの品質をあげましょうという話。 /agents
コマンドで作成可 能。
テスト専⾨のカスタムサブエージェントを作成 細かい内容やベストプラクティスを記載したテスト専⾨職を作った
Plan modeで調査した内容を サブエージェントに投げてテストを実装
None
出⼒結果
良くなった点 前提‧操作‧期待が明確に分離されている 実装のテストではなく、振る舞いにフォーカ スしたテストが⽣成されている 要素の取得がRoleの取得になっている
まとめ(AI × ガイドライン) ほとんど修正不要なレベルで理想のコードが⽣成されるようになってきた ドキュメントの適宜チューニングで⽣成品質を⾼める努⼒は必要 プロダクトに最適な良いガイドラインの策定が不可⽋ 技術⼒の偏りがあっても均質なコード品質を担保できる AIを使いこなす鍵は、⼈間による 「ガイドラインの設計」と「ドキュメントの継続的な改善」が必要 AIでテスト実装するにしても⼈間が最初の段階でいつくかテストを書く必要はありそう
まとめ
まとめ テストは“全部書く”必要はない ビジネスモデルから “最重要導線” を特定する テストガイドラインで「どの層に」「どう書くか」を定義する AIにコードを書かせることで均質なコード品質を担保しよう
ご清聴ありがとうございました!