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
110
「バイトル」の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
dRuby over BLE
makicamel
2
380
軽量Java基盤の設計 DIコンテナに頼らない、長期保守と1秒起動の実現 JJUG CCC 2026 Spring
macha64
0
550
Make SRE Operations Easier with Azure SRE Agent
kkamegawa
0
7.2k
OSもどきOS
arkw
0
580
コンテキストの使い捨てをやめる — ビジネスルール駆動開発と miko —
ioki
0
210
Signal Forms: Details & Live Coding @enterJS 2026 in Mannheim
manfredsteyer
PRO
0
160
The NotImplementedError Problem in Ruby
koic
1
870
「AIで開発し、AIを届ける」をEvalでつなぐ 〜AIネイティブに始めるプロダクト開発の実践〜 / Connecting "Develop with AI, deliver AI" with Eval
rkaga
4
5.3k
そのテスト、説明できますか?~LWテスト戦略FW~のご紹介
nakahara
0
150
ユニットテストの先へ:テスト技法で要求・仕様を整理するJava開発実践 / Beyond_Unit_Testing_Practical_Java_Development_Techniques_for_Organizing_Requirements_and_Specifications
shimashima35
0
410
エージェンティックRAGにAWSで入門しよう!
har1101
8
1.7k
Datadog × OpenTelemetry 入門と実践のあいだ
kn_to_maxpno
1
160
Featured
See All Featured
Unsuck your backbone
ammeep
672
58k
How to Think Like a Performance Engineer
csswizardry
28
2.7k
StorybookのUI Testing Handbookを読んだ
zakiyama
31
6.8k
What's in a price? How to price your products and services
michaelherold
247
13k
Future Trends and Review - Lecture 12 - Web Technologies (1019888BNR)
signer
PRO
0
3.6k
What Being in a Rock Band Can Teach Us About Real World SEO
427marketing
0
260
Building a Scalable Design System with Sketch
lauravandoore
463
34k
Collaborative Software Design: How to facilitate domain modelling decisions
baasie
1
250
Paper Plane
katiecoart
PRO
1
52k
Google's AI Overviews - The New Search
badams
0
1k
A brief & incomplete history of UX Design for the World Wide Web: 1989–2019
jct
2
400
BBQ
matthewcrist
89
10k
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 …
ありがとうございました!!!!