Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Speaker Deck
PRO
Sign in
Sign up for free
微妙な違いも見逃すな!ビジュアルリグレッションテスト! / phpcon2020
blue_goheimochi
December 12, 2020
Technology
5
740
微妙な違いも見逃すな!ビジュアルリグレッションテスト! / phpcon2020
PHP Conference Japan 2020の登壇資料です。
https://phpcon.php.gr.jp/2020/
blue_goheimochi
December 12, 2020
Tweet
Share
More Decks by blue_goheimochi
See All by blue_goheimochi
依存ライブラリの定期的な更新のためにRenovateを導入・運用する / phperkaigi2022
blue_goheimochi
3
370
ぼっちからはじめるレガシーカルチャー改善ガイド 〜はじめの一歩編〜 / phperkaigi2020
blue_goheimochi
4
620
6年かけてこうなった!我々の開発環境の変遷と現在 / phpconokinawa2019
blue_goheimochi
1
760
Take Off The Colored Glasses / phperkaigi2019
blue_goheimochi
2
3k
レガシーなPHPアプリケーションのリプレイスプロジェクトにおける取り組み / phpconsen2019
blue_goheimochi
1
870
Other Decks in Technology
See All in Technology
ふりかえりの技術 / retrospectives
soudai
3
170
ECS Fargate+Mackerelにおける監視費用を削減するまでの話
nulabinc
PRO
1
460
今 SLI/SLO の監視をするなら Sloth が良さそうという話
shotakitazawa
1
280
セキュアなTerraformの使い方 ~ 機密情報をコードに含めず環境構築するにはどうしたらいいの?
harukasakihara
9
1.5k
CloudWatchアラームによるサービス継続のための監視入門 / Introduction to Monitoring for Service Continuity with CloudWatch Alarms
inomasosan
1
420
GCCP Creator @ COSCUP 2022
line_developers_tw
PRO
0
1.4k
データ分析のためのAWS Well-Architected -Data Analytics Lens-
maru1981
0
230
Learning to Solve Hard Minimal Problems
takmin
1
420
Sysdig Secure/Falcoの活用術! ~Kubernetes基盤の脅威モデリングとランタイムセキュリティの強化~
owlinux1000
0
240
大声で伝えたい!定時に帰る方法
sbtechnight
0
240
テスト自動化を最速で軌道に乗せるために
nozomiito
0
140
Amazon Comprehendで始める感情分析
46ta
0
190
Featured
See All Featured
10 Git Anti Patterns You Should be Aware of
lemiorhan
638
52k
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
226
15k
Scaling GitHub
holman
451
140k
Building Better People: How to give real-time feedback that sticks.
wjessup
344
17k
Designing for Performance
lara
597
64k
Bash Introduction
62gerente
598
210k
What's new in Ruby 2.0
geeforr
335
30k
Fantastic passwords and where to find them - at NoRuKo
philnash
27
1.6k
Rails Girls Zürich Keynote
gr2m
87
12k
GraphQLとの向き合い方2022年版
quramy
16
8.5k
A designer walks into a library…
pauljervisheath
196
16k
The MySQL Ecosystem @ GitHub 2015
samlambert
239
11k
Transcript
微妙な違いも⾒逃すな! ビジュアルリグレッションテスト! PHP Conference Japan 2020 2020.12.12 Yuta Ohashi
blue_goheimochi ⼤橋 佑太 株式会社オウケイウェイヴ PHP(Laravel), JavaScript(Vue.js/Nuxt.js), ランニング, サッカー, フットサル, 浜松まつり,
ポケモンカードゲーム, さわやかのげんこつハンバーグ おおはし ゆうた
3 ⽬次 • ビジュアルリグレッションテストとは? • Atomic Designで考えるUIコンポーネント設計 • UIコンポーネントのカタログ化 •
テストのためのツール • CI環境を含めたテストの全体像 • よかったこと&改善できそうなこと • やってみて感じた導⼊障壁 • まとめ
ビジュアルリグレッションテストとは?
5 ビジュアルリグレッションテストとは? • 「⾒た⽬」の変更を検出するためのテスト • 対象はページ全体やUIコンポーネント • 今回はUIコンポーネントの事例をお話しします • 変更前と変更後のスクリーンショットを⽐較して差分を確認する
ことで、意図しない崩れを検知できる
6 ビジュアルリグレッションテストとは? どこが変わっているでしょうか? Before After
7 ビジュアルリグレッションテストとは? 微妙な違いも⾒逃さなかった! Before After リンクテキストの⾊変更 & アンダーライン追加
8 Before After ビジュアルリグレッションテストとは? 微妙な違いも⾒逃さなかった! リンクテキストの⾊変更 & アンダーライン追加
Atomic Designで考えるUIコンポーネント設計
10 Atomic Designで考えるUIコンポーネント設計 Atomic Designとは?
11 Atomic Designで考えるUIコンポーネント設計 Atomic Designとは?
12 Atomic Designで考えるUIコンポーネント設計 Atomic Designとは? • Bread Frostさんが考案した、デザインシステム • UIの構造を5段階で表しているのが特徴
• Atoms(原⼦) が集まってMolecule(分⼦) に、Moleculesが集まって Organism(有機体) に、Organismsが集まって‧‧‧‧Pageができる • Webページの要素を分解して、⼩さい部品の組み合わせ(UIコンポーネン ト)と考える • Vue.jsやReactなどのコンポーネントシステムとも相性が良い
UIコンポーネントのカタログ化
14 UIコンポーネントのカタログ化 Storybook
15 UIコンポーネントのカタログ化 Storybook • コンポーネントをカタログのような形で管理‧閲覧できように するためのツール • 定義ファイルを⽤意することで、コンポーネント1つ1つが Webブラウザから閲覧可能になる •
Vue.js、React、Angularなど主要なフレームワークに対応
テストのためのツール
17 テストのためのツール • Storycap • reg-suit
18 テストのためのツール Storycap
19 テストのためのツール Storycap • Storybookをクロールしてスクリーンショットを撮ってくれる ツール • 指定したディレクトリに、取得結果を出⼒してくれる
20 テストのためのツール reg-suit
21 テストのためのツール reg-suit • 画像の⽐較をしてくれるツール • Storycapで取得したスクリーンショットを変更前‧変更後のもので⽐ 較する • 差分の結果をHTMLで⽣成してくれる
22 テストのためのツール Storycapでコンポーネントのスクリーンショットを取得 Before After
23 Before After テストのためのツール reg-suitでBeforeとAfterのスクリーンショットを⽐較 リンクテキストの⾊変更 & アンダーライン追加
CI環境を含めたテストの全体像
25 CI環境を含めたテストの全体像 AWS • CodeBuild (AWS CodeBuild) • Storybookのビルド、Storycapでのキャプチャ取得、reg-suitで⽐較、などなど⼀ 連の操作‧指⽰をする
• S3 (Amazon Simple Storage Service) • ビルドしたStorybook、reg-suitでの⽐較結果を保存する • ECR (Amazon Elastic Container Service) • Storycapでスクリーンショットを取得するために、Chromiumをインストールした コンテナイメージを事前にpushする
26 CI環境を含めたテストの全体像 前提 • CI環境 • AWS • CodeBuild •
S3 • ECR • リポジトリ • Github Enterprise
27 CI環境を含めたテストの全体像 1. プルリクエスト作成をトリガーにテストが開始される • CodeBuildを呼び出しテストを開始 2. Storybookをビルド 3. Storycapでスクリーンショットを取得
4. reg-suitで前の結果と今回の結果を⽐較する • 前の結果=プルリクエスト対象ブランチがマージされた際に作成されたスク リーンショット 5. テスト結果をプルリクエストにコメントする
28 CI環境を含めたテストの全体像 CodeBuild Github Enterprise 作業内容をGithub EnterpriseにPushする。 git push ECR
S3 Storybook⽤Bucket Chromiumが⼊ったコンテナイメージ 前回のStorybookのスクリーンショット
29 CI環境を含めたテストの全体像 CodeBuild Github Enterprise プルリクエストを作成する。 pull request ECR S3
Storybook⽤Bucket Chromiumが⼊ったコンテナイメージ 前回のStorybookのスクリーンショット
30 CI環境を含めたテストの全体像 CodeBuild Github Enterprise Github EnterpriseからのWebhookを経由して、CodeBuildが実⾏される。 この際、buildspeck.ymlに記述されている内容を実⾏する。 Notify(Webhook) ECR
S3 Storybook⽤Bucket Chromiumが⼊ったコンテナイメージ 前回のStorybookのスクリーンショット
31 CI環境を含めたテストの全体像 CodeBuild Github Enterprise ECRに登録してある、ビジュアルリグレッションテスト⽤のコンテナイメージ(Chromiumなどの必要ツー ルが⼊っている)をdocker pullする ECR S3
Storybook⽤Bucket Chromiumが⼊ったコンテナイメージ 前回のStorybookのスクリーンショット docker pull
32 CI環境を含めたテストの全体像 CodeBuild Github Enterprise Storybookをビルドする(npm run storybook-build)。コンテナはボリュームマウントして実⾏する形にし ているので、ビルド成果物はコンテナの外に出⼒される。 build
Storybook ECR S3 Storybook⽤Bucket Chromiumが⼊ったコンテナイメージ 前回のStorybookのスクリーンショット
33 CI環境を含めたテストの全体像 CodeBuild Github Enterprise StorycapがChromiumを利⽤し、Storybook全体をクローリングしつつ各UIコンポーネントのスクリーン ショットを1つ1つ取得する。 Crawl Take screenshots
ECR S3 Storybook⽤Bucket Chromiumが⼊ったコンテナイメージ 前回のStorybookのスクリーンショット
34 CI環境を含めたテストの全体像 CodeBuild Github Enterprise S3から⽐較対象となる前回のStorybookのスクリーンショットをダウンロードする。 Download prev screenshots ECR
S3 Storybook⽤Bucket Chromiumが⼊ったコンテナイメージ 前回のStorybookのスクリーンショット
35 CI環境を含めたテストの全体像 CodeBuild Github Enterprise reg-suitで、今回のStorybookのスクリーンショットと前回のStorybookのスクリーンショットの差分を取 り、HTMLレポートを⽣成する。 ECR S3 Storybook⽤Bucket
Chromiumが⼊ったコンテナイメージ 前回のStorybookのスクリーンショット run reg-suit
36 CI環境を含めたテストの全体像 CodeBuild Github Enterprise Storybook、スクリーンショット、reg-suitのHTMLレポートはアーティファクト(CodeBuildの成果物)とし て、S3にアップロードする。 ECR S3 Storybook⽤Bucket
Chromiumが⼊ったコンテナイメージ 前回のStorybookのスクリーンショット 今回のStorybookのビルド成果物 今回のStorybookのスクリーンショット 今回のreg-suitのHTMLレポート Upload artifacts
37 CI環境を含めたテストの全体像 CodeBuild Github Enterprise 結果をプルリクエストにコメントする。 ECR S3 Storybook⽤Bucket Chromiumが⼊ったコンテナイメージ
前回のStorybookのスクリーンショット 今回のStorybookのビルド成果物 今回のStorybookのスクリーンショット 今回のreg-suitのHTMLレポート Comment to pull request
38 CI環境を含めたテストの全体像 1. プルリクエスト作成をトリガーにテストが開始される • CodeBuildを呼び出しテストを開始 2. Storybookをビルド 3. Storycapでスクリーンショットを取得
4. reg-suitで前の結果と今回の結果を⽐較する • 前の結果=プルリクエスト対象ブランチがマージされた際に作成されたスク リーンショット 5. テスト結果をプルリクエストにコメントする
39 CI環境を含めたテストの全体像 テストが完了するとこんなコメントがプルリクエストにつきます
40 CI環境を含めたテストの全体像 テストが完了するとこんなコメントがプルリクエストにつきます S3にアップロードされた StorybookのURL
41 CI環境を含めたテストの全体像 テストが完了するとこんなコメントがプルリクエストにつきます S3にアップロードされた StorybookのURL S3にアップロードされた reg-suitのレポートのURL
42 CI環境を含めたテストの全体像 テストが完了するとこんなコメントがプルリクエストにつきます 変更されたコンポーネント 追加されたコンポーネント 削除されたコンポーネント 変更がなかったコンポーネント が分かる! S3にアップロードされた StorybookのURL
S3にアップロードされた reg-suitのレポートのURL
よかったこと&改善できそうなこと
44 よかったこと&改善できそうなこと よかったこと • レビューがとてもしやすくなった • CSSのリファクタリングがしやすくなった • 意図しない崩れが起きづらくなった
45 よかったこと&改善できそうなこと よかったこと 変更されたコンポーネント 追加されたコンポーネント 削除されたコンポーネント 変更がなかったコンポーネント が分かる! S3にアップロードされた StorybookのURL
S3にアップロードされた reg-suitのレポートのURL
46 よかったこと&改善できそうなこと よかったこと • レビューがとてもしやすくなった • 対象プルリクエストの修正でコンポーネントを壊していないか?が確 認できる(⼿元でStorybookを⽴ち上げて確認しなくてもよい) • レビューする側としてもとても安⼼感がある
• 追加‧変更‧削除されたコンポーネントがそれぞれわかるので、コー ドレビューの補助にもなっている
47 よかったこと&改善できそうなこと よかったこと • CSSのリファクタリングがしやすくなった • デザイナーから上がってきた声 • ビジュアルリグレッションテストで差分がでなければ正しくリファク タリングができたというのが分かる
• ⼤胆に修正することができた • ⽬視での確認を減らすことができた
48 よかったこと&改善できそうなこと よかったこと • 意図しない崩れが起きづらくなった • 「ビジュアルリグレッションテスト」と話してきたが実はあまりデグレが発⽣して いない • 全体にかかるようなCSSを修正した場合(line-heightを⼀括で変えるなど)にたまにあるくらい
• コンポーネント単位で作成するようになったことにより、変更がコンポーネントの 中で閉じるようになったためだと考えている • コンポーネントを組み合わせてページを構成した際に、marginの設定もれなどで 要素がくっついてしまうというようなことはあるので、ページ全体に対してのテス トもうまくできるように考えていきたい
49 よかったこと&改善できそうなこと 改善できそうなこと • 不安定なコンポーネントを減らす • テストの実⾏時間を短くする • UIコンポーネント設計が難しい
50 よかったこと&改善できそうなこと 改善できそうなこと • 不安定なコンポーネントを減らす • ⾮同期読み込みがあるようなコンポーネントはStorycapのスクリーン ショット取得のタイミングによって変更してないのに差分が出てきて しまうことがある •
⽇付に依存しているコンポーネント
51 よかったこと&改善できそうなこと 改善できそうなこと • テストの実⾏時間を短くする • 1回のテストに10分前後かかってしまっている • Dockerコンテナ経由でのビルドをしないようにする •
テストの並列実⾏ • 開発フローの⾒直し
52 よかったこと&改善できそうなこと 改善できそうなこと • UIコンポーネント設計が難しい • 基本的にはAtomic Designに則ってコンポーネント設計をしている • 最⼩単位のAtomは分かりやすい
• これはMolecule?これはOrganism?と複数のコンポーネントを組み合わせ たものをどこに配置するかよく相談している • 5つの段階だと少ない‧‧‧ • 試験的にOrganismのコンポーネントをページ別に分けて運⽤してみたりしている がまだまだ改善の余地がありそう
やってみて感じた導⼊障壁
54 やってみて感じた導⼊障壁 • フロントエンド‧バックエンドの開発の分離 • デザイナーとの共創
55 やってみて感じた導⼊障壁 フロントエンド‧バックエンド開発の分離 • 組織が分かれている必要はないかもしれないが、コード上でフロントエ ンドとバックエンドが分かれている必要はありそう • 既存のプロダクトにシュッといれられるかというとつらそう‧‧‧ • 今回の事例では、アプリケーションのリプレイスを進めているプロダク
トだったということは導⼊障壁をかなり下げていると思われる • フロントエンドはNuxt.js、バックエンドはLaravelという技術選定から⾏えた • この辺りの開発体制を調整するのにすごく⼒を割いた
56 やってみて感じた導⼊障壁 デザイナーとの共創 • フロントエンドチームができることにより、デザイナーとより 協⼒(1つのチームとして機能すること)が必要 • Atomic Designなどの知識共有、⽂化の共有 •
同じリポジトリを利⽤しての開発 • 開発側としてもよりUIやデザインといった領域を知る必要がある • サンプルリポジトリを作ったり、トレーニング、情報共有などを⾏った
まとめ
58 まとめ • ビジュアルリグレッションテストは「⾒た⽬」をテストする • 今回はUIコンポーネントのテストを紹介 • Atomic Designを取り⼊れUIコンポーネント設計を⾏い、StorybookでUI コンポーネントカタログを作成
• Storycap、reg-suit、CodeBuild、S3、ECRを使ってテスト環境を構築 • レビューがとてもしやすくなった! • 意図しない変更を検知しプルリクエスト上で確認できる • 意図した変更(追加‧変更‧削除)も分かるのでコードレビューの補助となる • ただし、導⼊障壁はやや⾼いと感じている
微妙な違いも⾒逃さなかった! ビジュアルリグレッションテスト!