reg-suit_CircleCIで_Visual_Regression_Test環境の構築.pdf
by
toshiokun
Link
Embed
Share
Beginning
This slide
Copy link URL
Copy link URL
Copy iframe embed code
Copy iframe embed code
Copy javascript embed code
Copy javascript embed code
Share
Tweet
Share
Tweet
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に画像を公開するためセキュリティリスクがある