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
フロントエンドテストを書きやすくするために工夫したこと
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
Hayato Yokoyama
June 11, 2024
Programming
100
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
フロントエンドテストを書きやすくするために工夫したこと
Hayato Yokoyama
June 11, 2024
Transcript
28 slides
フロントエンドテストを 書きやすくするために工夫したこと 2024/06/11 横山 隼 UV Study Lightning Talks #50
自己紹介 • ディップ株式会社 • 2022年新卒入社 • フロントエンドエンジニア • X: @hayatoyokoyama_
• GitHub: @hayato-yokoyama 横山 隼
フロントエンドのテストは書いていますか?
現在、会社の開発チームでは、ページ単位で行う E2Eテストと、 コンポーネント単位で行うユニットテスト の2種類のテストを行っています。 ページ ページ (page.tsx) E2Eテスト コンポーネント ユニットテスト
コンポーネント ユニットテスト コンポーネント ユニットテスト コンポーネント ユニットテスト コンポーネント ユニットテスト コンポーネント ユニットテスト コンポーネント ユニットテスト コンポーネント ユニットテスト コンポーネント ユニットテスト
現在、会社の開発チームでは、ページ単位で行う E2Eテストと、 コンポーネント単位で行うユニットテスト の2種類のテストを行っています。 ページ ページ (page.tsx) E2Eテスト コンポーネント ユニットテスト
コンポーネント ユニットテスト コンポーネント ユニットテスト コンポーネント ユニットテスト コンポーネント ユニットテスト コンポーネント ユニットテスト コンポーネント ユニットテスト コンポーネント ユニットテスト コンポーネント ユニットテスト ここのテストを 書きやすくした話
ユニットテストはコンポーネントとセットで テンプレートから作成する
実現するにあたって Hygen というライブラリを使用しました https://www.hygen.io/
とりあえず見てみよう
None
どのディレクトリに配置するか
使い分けたい camelCase/PascalCase/… もカスタマイズ可能
コンポーネント、テスト、Storybookなどは、 コンポーネント名を与えたら、中身以外の枠組みは共通化できる import { render, screen } from "@testing-library/react"; import
Button from "./button"; describe("Buttonコンポーネント", () => { test("ラベルが正しくレンダリングされること ", () => { render(<Button label="Click Me" onClick={() => {}} />); expect(screen.getByText("Click Me")).toBeInTheDocument(); }); }); type ButtonProps = { label: string; onClick: () => void; type?: "button" | "submit" | "reset"; disabled?: boolean; }; const Button = ({ label, onClick, disabled, type }: ButtonProps) => { return ( <button type={type} onClick={onClick} disabled={disabled}> {label} </button> ); }; export default Button; コンポーネント テスト
コンポーネント、テスト、Storybookなどは、 コンポーネント名を与えたら、中身以外の枠組みは共通化できる import { render, screen } from "@testing-library/react"; import
Button from "./button"; describe("Buttonコンポーネント", () => { test("ラベルが正しくレンダリングされること ", () => { render(<Button label="Click Me" onClick={() => {}} />); expect(screen.getByText("Click Me")).toBeInTheDocument(); }); }); type ButtonProps = { label: string; onClick: () => void; type?: "button" | "submit" | "reset"; disabled?: boolean; }; const Button = ({ label, onClick, disabled, type }: ButtonProps) => { return ( <button type={type} onClick={onClick} disabled={disabled}> {label} </button> ); }; export default Button; コンポーネント テスト
コードを自動生成させることで … • 時間を節約 、コードスタイルの統一化 • 自動的にテストコードも生成させることで、 テストの書き忘れを防ぐ ことができる •
最初からテストを書き始められる状態 なので、心理的なハードルが低い
ちなみに、テンプレート化できるものなら、 言語・フレームワーク、用途を問わず、何でも使用できる
導入方法
導入手順 1. Hygenをインストール 2. プロンプトの設定 3. テンプレートの生成 4. Hygenコマンドの登録
1. Hygenをインストール npm install --save-dev hygen
2. プロンプトの設定 module.exports = [ { type: "input", name: "name",
message: "コンポーネント名を入力してください ", }, { type: "confirm", name: "haveStorybook", message: "Storybookファイルを追加しますか?", default: false, }, ];
3. テンプレートの生成 --- to: app/components/<%= name %>/<%= name %>.test.tsx unless_exists:
true --- import { render, screen } from "@testing-library/react"; import <%= name %> from "./<%= name %>"; test("<%= name %>コンポーネントのテキストがレンダリングされること ", () => { render(<<%= name %> text="テキスト" />); expect(screen.getByText("テキスト")); });
4. Hygenコマンド登録 "scripts": { "dev": "next dev", "build": "next build",
"start": "next start", "test": "jest", "add-component": "hygen component new" // 追加 },
以上
気をつけたほうがいいこと
気をつけたほうがいいこと • 「テンプレートからコンポーネントを作る」というルールを 意識的に徹底する必要がある (仕組みで強制できない) • 冗長なテスト、不要なテストが出来やすくなる
まとめ
まとめ • テンプレート生成ツールを使う ことで、テストがかなり書きやすくなった • 「テンプレートからコンポーネントを作成する」というルールを チームで意識的に徹底する 必要がある
参考リンク・その他 参考リンク • hygen で生成 - 対話形式の Component 雛形 -
テンプレート生成に関する Hygenの代替ライブラリ • Plop • Yeoman …
ありがとうございました!!!!
More Decks by Hayato Yokoyama
See All by Hayato Yokoyama
「型ガードしたのにnullable」から卒業する
hayato_yokoyama
0
160
「バイトル」のTypeScriptリニューアル — 積み上がったレガシーとパフォーマンスに挑む現在地
hayato_yokoyama
0
170
AIが特別じゃなくなった時代に、作ることを楽しもう
hayato_yokoyama
0
43
AIのためのテスト戦略 〜TDDが難しいフロントエンド開発でのアプローチ〜
hayato_yokoyama
0
340
実はすごいスピードで進化しているCSS
hayato_yokoyama
0
270
Next.js AppRouter × GraphQL 〜 夢見た理想と現実の課題 〜
hayato_yokoyama
0
190
Other Decks in Programming
See All in Programming
Railsのためのパスキー実践入門 〜マルチテナントSaaSでの意思決定〜
utakaha
4
4.3k
Modernizing iOS Apps
seyfoyun
0
150
Performance Optimization With LLMs
xleitix
0
260
Rails初心者がパスキーを実装してみて大変だったこと
ktombow
0
190
Engineering Biometric UX Across Android Versions | DroidKnights 2026
ryunen344
1
200
當我們開始不讀 Code - AI Agent 時代,Code Review 與 Clean Code 還剩下什麼?
jame2408
1
370
Crash Auto Pipelines
veronikapj
1
410
React Native経験者が Flutterを30⽇間触って驚いたこと
3saito
0
180
クラウドエージェントは、 何がそんなに便利なのか / what makes cloud agents so useful
rkaga
5
860
Python Lambdaにおけるテストしやすい設計とAI支援の活用 / Designing Testable Python Lambda Functions with AI
kitano_yuichi
1
330
DroidKnights 2026 Android A2UI Jetpack Compose 기반의 안전한 AI UI 렌더링 - 박제창
itsmedreamwalker
1
230
Coding with AI: How to trust the storyteller (AWS Community Day Adria, Ljubljana 2026)
slobodan
0
140
Featured
See All Featured
The Cult of Friendly URLs
andyhume
79
7.1k
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
133
20k
HU Berlin: Industrial-Strength Natural Language Processing with spaCy and Prodigy
inesmontani
PRO
0
800
Lessons Learnt from Crawling 1000+ Websites
charlesmeaden
PRO
1
1.7k
Reflections from 52 weeks, 52 projects
jeffersonlam
356
22k
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
508
140k
How to Talk to Developers About Accessibility
jct
2
620
Public Speaking Without Barfing On Your Shoes - THAT 2023
reverentgeek
1
660
brightonSEO & MeasureFest 2025 - Winning Strategies for Black Friday CRO & PPC - Christian Goodrich
cargoodrich
3
900
The Invisible Side of Design
smashingmag
301
52k
Impact Scores and Hybrid Strategies: The future of link building
tamaranovitovic
0
480
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
16
2.2k