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
フロントエンドテストを書きやすくするために工夫したこと
Search
Hayato Yokoyama
June 11, 2024
Programming
89
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
フロントエンドテストを書きやすくするために工夫したこと
Hayato Yokoyama
June 11, 2024
More Decks by Hayato Yokoyama
See All by Hayato Yokoyama
「型ガードしたのにnullable」から卒業する
hayato_yokoyama
0
100
「バイトル」のTypeScriptリニューアル — 積み上がったレガシーとパフォーマンスに挑む現在地
hayato_yokoyama
0
26
AIが特別じゃなくなった時代に、作ることを楽しもう
hayato_yokoyama
0
27
AIのためのテスト戦略 〜TDDが難しいフロントエンド開発でのアプローチ〜
hayato_yokoyama
0
250
実はすごいスピードで進化しているCSS
hayato_yokoyama
0
240
Next.js AppRouter × GraphQL 〜 夢見た理想と現実の課題 〜
hayato_yokoyama
0
170
Other Decks in Programming
See All in Programming
Performance Engineering for Everyone
elenatanasoiu
0
190
Skillsは効率化、Agentsは"自分の拡張"——Builder時代のエージェント編成(CC Night 2026)
wemra
1
140
AIとASP.NET Coreで雑Webアプリを作った話
mayuki
0
670
Language Server 使ってる? 〜VSCode と Zed の場合〜 / Are you using a Language Server? ~For VS Code and Zed~
handlename
0
800
「なぜそう決めたのか」を残し続ける仕組み ― Notion AI カスタムエージェント × Slack連携による設計判断の自動記録 - NIKKEI Tech Talk #47
niftycorp
PRO
0
210
エージェンティックRAGにAWSで入門しよう!
har1101
8
1.7k
IBM Bobを活用したレガシーアプリの最新化
oniak3ibm
PRO
1
200
作って学ぶ、 JSX (TSX) ランタイムの基本
syumai
7
1.7k
Signal Forms: Details & Live Coding @enterJS 2026 in Mannheim
manfredsteyer
PRO
0
160
Semantic Version 単位で戦略を柔軟に変えて、パッケージアップデートを自動化する
daitasu
1
280
Dataformのリポジトリを立ち上げるときにまずやること / dataform-day0-2026
snhryt
0
170
New "Type" system on PicoRuby
pocke
1
990
Featured
See All Featured
The #1 spot is gone: here's how to win anyway
tamaranovitovic
2
1.1k
Lightning talk: Run Django tests with GitHub Actions
sabderemane
0
200
Claude Code のすすめ
schroneko
67
230k
Building Applications with DynamoDB
mza
96
7.1k
Everyday Curiosity
cassininazir
0
230
Context Engineering - Making Every Token Count
addyosmani
9
970
Speed Design
sergeychernyshev
33
1.9k
Color Theory Basics | Prateek | Gurzu
gurzu
0
370
Between Models and Reality
mayunak
4
340
Producing Creativity
orderedlist
PRO
348
40k
Building a Modern Day E-commerce SEO Strategy
aleyda
45
9.1k
Agile that works and the tools we love
rasmusluckow
331
21k
Transcript
フロントエンドテストを 書きやすくするために工夫したこと 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 …
ありがとうございました!!!!