Slide 1

Slide 1 text

reg-suit+CircleCIで Visual Regression Test環境の構築 谷口 俊博

Slide 2

Slide 2 text

フリーランス フロントエンドエンジニア React/NextJSが現在の主戦場 Rails/React Native/Swift/Ionic(AngularJS)など を経験してきました Twitter: @toshiokun0322 Zenn: https://zenn.dev/toshiokun github: https://github.com/toshiokun 自己紹介 谷口 俊博

Slide 3

Slide 3 text

https://zenn.dev/toshiokun/articles/3d7087b84ba1d9 Zennに投稿したこちらの記事の内容 を話します

Slide 4

Slide 4 text

アジェンダ reg-suitという画像差分検出ツールがとてもよい フロントエンドのリグレッションテストは難しいよ Jestのsnapshotを導入した際の散々な結果 reg-suitとCircleCIでVRT環境を構築する スタリングのリグレッションをせねばと思ったある日のこと

Slide 5

Slide 5 text

ある日のこと

Slide 6

Slide 6 text

デザイナーから依頼されたレ イアウト修正の対応が終わっ たし、本番に反映するぞー

Slide 7

Slide 7 text

リリース前 カタカタターン!! ※画像はイメージです

Slide 8

Slide 8 text

リリース後 うげ!CSS当たってな いじゃん!! ※画像はイメージです

Slide 9

Slide 9 text

突然の スタイル崩壊!!

Slide 10

Slide 10 text

CSSの変更の影響範囲読めねー な、、、 フロントエンドでもリグレッションテスト 必要だな

Slide 11

Slide 11 text

しかし

Slide 12

Slide 12 text

フロントエンドの リグレッションテストは難 しいよ

Slide 13

Slide 13 text

なぜか?

Slide 14

Slide 14 text

①UIはアプリケーションの中で一番変更されやすい →リグレッションテスト自体のメンテナンスコストが高くつく ②HTMLやCSSの修正によるリグレッションは、ロジック面ではなくビジュアル面 でのリグレッションになる →最終的には人間の目による確認が必要になる なぜフロントエンドのリグレッションテス トは難しい?

Slide 15

Slide 15 text

UIは一番変更されやすい ソフトウェア設計の第一のルールは、その理由がテスト容易性 だろうと何だろうと、常に同じである。それは、変化しやすいも のに依存しないだ。GUIは変化しやすい。GUIを使用してシス テムを操作するテストスイートは脆弱である。したがって、GUI を使用しなくてもビジネスルールのテストができるように、シス テムとテストを設計しなければいけない。 Robert C.Martin,角 征典,高木 正弘. Clean Architecture  達人に学ぶソフトウェアの構造と設計 (Japanese Edition)

Slide 16

Slide 16 text

Jestのsnapshotを導入し た際の散々な結果

Slide 17

Slide 17 text

components ├── __tests__ │ ├── fuga.spec.tsx │ ├── hoge.spec.tsx │ └── piyo.spec.tsx ├── fuga.tsx ├── hoge.tsx └── piyo.tsx ディレクトリ構成

Slide 18

Slide 18 text

package.json

Slide 19

Slide 19 text

jestの設定

Slide 20

Slide 20 text

コンポーネント

Slide 21

Slide 21 text

Snapshotテストの設定

Slide 22

Slide 22 text

スナップショットの取得

Slide 23

Slide 23 text

スナップショットとの差分確認

Slide 24

Slide 24 text

。。。

Slide 25

Slide 25 text

アップデート実行

Slide 26

Slide 26 text

①JestのSnapshotはHTMLしか保存しないため、CSSによるスタイリングは保 存されない ②テスト失敗時の差分はほとんど`git diff`で確認している内容と同じようなもの しか確認できない ③結果、差分確認をしてそのままスナップショットをアップデートするだけで、「想 定しないコンポーネントのレイアウト崩れの検知」という目的が全く達成されない Jestのsnapshotを導入した際の散々 な結果

Slide 27

Slide 27 text

そんな中出会ったツール が

Slide 28

Slide 28 text

reg-suit https://github.com/reg- viz/reg-suit

Slide 29

Slide 29 text

正確に言うとreg-suitは画像の差分比較ができるツール ①指定のフォルダに配置されている画像ファイルをS3(またはGoogle Cloud Storage)に格納する ②PullRequestを作成すると、merge先のブランチの画像とmerge元のブランチ の画像の差分を比較することができる reg-suitの特徴

Slide 30

Slide 30 text

①画像差分を比較するレポートが視覚的にわかりやすい ②スクリーンショットを撮影するツールは何でもいい ③画像を上げる先はS3、Google Cloud Storageどちらも選択できる ④githubやslackに差分比較結果を通知するプラグインがある reg-suit採用のメリット

Slide 31

Slide 31 text

リグレッションテスト用のツールreg-suit (reg-suitの仕組み)

Slide 32

Slide 32 text

リグレッションテスト用のツールreg-suit (出力レポートイメージ)

Slide 33

Slide 33 text

リグレッションテスト用のツールreg-suit (出力レポートイメージ)

Slide 34

Slide 34 text

リグレッションテスト用のツールreg-suit (出力レポートイメージ)

Slide 35

Slide 35 text

リグレッションテスト用のツールreg-suit (出力レポートイメージ)

Slide 36

Slide 36 text

リグレッションテスト用のツールreg-suit (出力レポートイメージ)

Slide 37

Slide 37 text

リグレッションテスト用のツールreg-suit (出力レポートイメージ)

Slide 38

Slide 38 text

reg-suit+storycap+Circ leCIによるVRT環境構築

Slide 39

Slide 39 text

①アップロード先のS3の準備をする ②コンポーネントのスクリーンショットを取る ③reg-suitの初期設定をする ④CircleCI上で、スクリーンショットを取りreg-suitによるS3アップロード&画像 比較を実行できるようにする ⑤PRの作成 VRT環境構築の大まかな手順

Slide 40

Slide 40 text

パブリックアクセスの設定に気をつける ①アップロード先のS3の準備をする

Slide 41

Slide 41 text

該当のS3バケットにアクセスできるユーザーを作成する ①アップロード先のS3の準備をする

Slide 42

Slide 42 text

今回はStorybookで定義したコンポーネントを撮影するstorycapというツールを 使用 (※reg-suitと同じ開発者によるライブラリ) https://github.com/reg-viz/storycap ②コンポーネントのスクリーショットを撮る

Slide 43

Slide 43 text

storycapとpuppeteerのインストール > yarn add storycap puppeteer ※puppeteerをインストールするのは、puppeteerを使用してスクリーンショットを撮影するため ②コンポーネントのスクリーショットを撮る

Slide 44

Slide 44 text

package.json "scripts": { "storybook": "start-storybook -p 6006 -c .storybook", "screenshot": "storycap -C puppeteer --serverCmd \"start-storybook -p 6006\" http://localhost:6006 --serverTimeout 60000", }, ②コンポーネントのスクリーショットを撮る

Slide 45

Slide 45 text

storybookの設定 ②コンポーネントのスクリーショットを撮る

Slide 46

Slide 46 text

storybookの設定 ②コンポーネントのスクリーショットを撮る

Slide 47

Slide 47 text

storybookの設定 ②コンポーネントのスクリーショットを撮る

Slide 48

Slide 48 text

yarn screenshotを叩いた結果 ※Storybookで定義したコンポーネントが画像として__screenshots__配下に出力される ②コンポーネントのスクリーショットを撮る

Slide 49

Slide 49 text

> yarn add reg-suit > yarn reg-suit init --use-yarn # --use-yarnはpluginをインストールする際にyarnの使用を指定するオプショ ン …(pluginや設定の選択が表示されるが省略) ③reg-suitの初期設定を行う

Slide 50

Slide 50 text

reg-suitのインストールと初期設定 > yarn add reg-suit > yarn reg-suit init --use-yarn # --use-yarnはpluginをインストールする際にyarnの使用を指定するオプショ ン …(pluginや設定の選択が表示されるが省略) ③reg-suitの初期設定を行う

Slide 51

Slide 51 text

package.jsonのscriptsの定義 "scripts": { "regression": "reg-suit run", }, ③reg-suitの初期設定を行う

Slide 52

Slide 52 text

④CircleCI上で、スクリーンショットを取りreg-suitによるS3アップロード&画像比較を実 行できるようにする .circleci/config.ymlにyarn screenshotとyarn regressionを実行するjobを定 義する

Slide 53

Slide 53 text

④CircleCI上で、スクリーンショットを取りreg-suitによるS3アップロード&画像比較を実 行できるようにする S3にアクセスできるようにするために、環境変数設定を忘れない

Slide 54

Slide 54 text

スタイルの修正をしてPRを作成 ⑤PRの作成

Slide 55

Slide 55 text

CircleCIのジョブが完了すると下記のようなコメントが自動で投稿される ⑤PRの作成

Slide 56

Slide 56 text

reg-suitのメリット/デメリット 【メリット】 ビジュアルの差分を画像ベースで検出するリグレッションテストのため、スタイリ ングの実装方法を変えた場合はテストが通る ex) CSS modules -> CSS in JS(styled-components)への変更など 【デメリット】 パブリックアクセスができるS3に画像を公開するためセキュリティリスクがある