Slide 1

Slide 1 text

とうとうJestを導入してみた話 React LT会 〜最近学び始めた方から業務でバリバリ使っている方まで〜 1

Slide 2

Slide 2 text

WHO AM I 2 小澤 力也(おざわ りきや)@rikipedia_uw ● 株式会社ウィルゲート ● エンジニア・広報 ● 技術:JavaScript(TS)・React(8ヶ月) ● React LT会にずっと参加したかった

Slide 3

Slide 3 text

想定聴者 ● React中級者 ● React環境にテストを導入したいひと 3

Slide 4

Slide 4 text

Jestを導入したアプリケーション ● 新規開発中のSPA ○ React+Redux+TypeScript 4

Slide 5

Slide 5 text

Jestを導入したアプリケーション 5

Slide 6

Slide 6 text

Jestとは? 6 Jest(ジェスト) ● Facebook謹製JavaScriptのユニットテ ストツール ● オールインワンなテストフレームワーク ○ テストランナー ○ アサーション ○ テストモック・テストダブル ○ スナップショットテスト

Slide 7

Slide 7 text

Jestを導入した背景 ● 開発当初は体制や納期の問題でテストに手を出せなかった ○ シナリオテストやふるまいテストはやってた 7

Slide 8

Slide 8 text

Jestを導入した背景 ● 開発当初は体制や納期の問題でテストに手を出せなかった ○ シナリオテストやふるまいテストはやってた →落ち着いてきたのでテスト導入に至った 8

Slide 9

Slide 9 text

テストを導入する目的 ● バグの混入を防ぐ・検知する ● テスタブルなコードを意識して書ける ● 一貫性のあるテスト観点になる ● 品質を担保しつつ、テスターは別のテストを実施することができ る ● テストカバレッジにより定量的に品質を測定できる 9

Slide 10

Slide 10 text

テストを導入する目的 ● バグの混入を防ぐ・検知する ● テスタブルなコードを意識して書ける ● 一貫性のあるテスト観点になる ● 品質を担保しつつ、テスターは別のテストを実施することができ る ● テストカバレッジにより定量的に品質を測定できる 10 ↑メリットを活かすためのテストコードを書く

Slide 11

Slide 11 text

テスト対象 ● Function Component ○ 純粋関数 11

Slide 12

Slide 12 text

テスト対象 ● Function Component ○ 純粋関数 12 Container Component(Redux接続部)やRedux Storeの テストは次の機会

Slide 13

Slide 13 text

テスト手法 ● スナップショットテスト ○ UIが予期せず変更されていないか確かめるテスト手法 13

Slide 14

Slide 14 text

React×Jestにおけるスナップショットテスト ● コンポーネントの出力結果をファイルに保存 ● 1回目ならファイル作成 ● 2回目以降は前回との差分を見てOKなら通過 14

Slide 15

Slide 15 text

スナップショットテストの書き方 import React from 'react'; import Link from '../Link.react'; import renderer from 'react-test-renderer'; it('renders correctly', () => { const tree = renderer .create(Facebook) .toJSON(); expect(tree).toMatchSnapshot(); }); 15 Jest公式ページより:https://jestjs.io/docs/ja/snapshot-testing import React from 'react' import Link from '../Link.react' import renderer from 'react-test-renderer' it('renders correctly', () => { const tree = renderer .create(Facebook) .toJSON() expect(tree).toMatchSnapshot() }) component.test.tsx

Slide 16

Slide 16 text

スナップショットテストの書き方 import React from 'react'; import Link from '../Link.react'; import renderer from 'react-test-renderer'; it('renders correctly', () => { const tree = renderer .create(Facebook) .toJSON(); expect(tree).toMatchSnapshot(); }); 16 Jest公式ページより:https://jestjs.io/docs/ja/snapshot-testing 必要なライブラリなどを import import React from 'react' import Link from '../Link.react' import renderer from 'react-test-renderer' it('renders correctly', () => { const tree = renderer .create(Facebook) .toJSON() expect(tree).toMatchSnapshot() }) component.test.tsx

Slide 17

Slide 17 text

スナップショットテストの書き方 import React from 'react'; import Link from '../Link.react'; import renderer from 'react-test-renderer'; it('renders correctly', () => { const tree = renderer .create(Facebook) .toJSON(); expect(tree).toMatchSnapshot(); }); 17 Jest公式ページより:https://jestjs.io/docs/ja/snapshot-testing Reactコンポーネントを生成し、 Json形式に変換 import React from 'react' import Link from '../Link.react' import renderer from 'react-test-renderer' it('renders correctly', () => { const tree = renderer .create(Facebook) .toJSON() expect(tree).toMatchSnapshot() }) component.test.tsx

Slide 18

Slide 18 text

スナップショットテストの書き方 import React from 'react' import Link from '../Link.react' import renderer from 'react-test-renderer' it('renders correctly', () => { const tree = renderer .create(Facebook) .toJSON() expect(tree).toMatchSnapshot() }) 18 Jest公式ページより:https://jestjs.io/docs/ja/snapshot-testing 1回目:スナップショットファイル生成 2回目以降:前回のファイルと比較して OKなら通過 component.test.tsx

Slide 19

Slide 19 text

スナップショットテストファイル exports[`renders correctly 1`] = ` Facebook ` 19 Jest公式ページより:https://jestjs.io/docs/ja/snapshot-testing __snapshots__/component.test.tsx.snap

Slide 20

Slide 20 text

スナップショットテストファイル exports[`renders correctly 1`] = ` Facebook ` 20 Jest公式ページより:https://jestjs.io/docs/ja/snapshot-testing __snapshots__/component.test.tsx.snap 手動での書き換えは怒られる

Slide 21

Slide 21 text

スナップショットテストを導入してみて ● テスタブルなコードを意識するとロジックとUIが自然に分離す る ● ロジックの実装に集中できるようになった ● 実装が変わったときに差分が出るからバグの検知が楽になっ た 21

Slide 22

Slide 22 text

スナップショットテストで気をつけたいこと ● 期待する出力が明確になってから行う ○ 間違ったテストになってしまうため ● React Hooksも一部対応しているが完璧ではない 22

Slide 23

Slide 23 text

  以上 23

Slide 24

Slide 24 text

懇親会で話したいこと ● webpack周りの設定どうしてる? ● Class Componentのこれからについて 24

Slide 25

Slide 25 text

Follow Me! 25 https://twitter.com/rikipedia_uw