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
How To Improve UI Quality And Performance
Search
CyberAgent
PRO
November 21, 2023
Technology
0
62
How To Improve UI Quality And Performance
CyberAgent
PRO
November 21, 2023
Tweet
Share
More Decks by CyberAgent
See All by CyberAgent
FastlyとfalcoでNode.jsレスなWebサーバーの構築: IPTV版ABEMAアプリのインフラ刷新
cyberagentdevelopers
PRO
1
33
Amebaチョイス立ち上げの裏側 ~ 依存システムとの闘い ~
cyberagentdevelopers
PRO
1
30
マイグレーションコード自作して File-Based Routing に自動移行!! ~250 ページの歴史的経緯を添えて~
cyberagentdevelopers
PRO
1
19
コードメトリクス計測による課題可視化と品質確保
cyberagentdevelopers
PRO
1
37
サイバーエージェントにおけるインナーソーシングの取り組み
cyberagentdevelopers
PRO
3
1.1k
ABEMAにおけるLLMを用いたコンテンツベース推薦システム導入と効果検証
cyberagentdevelopers
PRO
6
3k
クリエイティブ制作領域の データ活用を0から推進した話
cyberagentdevelopers
PRO
3
850
opt-in camera:カメラによる行動計測におけるオプトインの仕組みの実現
cyberagentdevelopers
PRO
3
820
競輪選手の体力を視覚化するための物体認識とデータサイエンスの融合
cyberagentdevelopers
PRO
3
1.2k
Other Decks in Technology
See All in Technology
EitherT_with_Future
aoiroaoino
2
1.2k
Segment Anything Model 2
tenten0727
3
660
自社サービスのための独自リリース版Redmine「RedMica」の取り組み
vividtone
0
1.3k
OCI で始める!! Red Hat OpenShift / Get Started OpenShift on OCI
oracle4engineer
PRO
1
160
PdMはどのように全てのスピードを上げられるか ~ 非連続進化のための具体的な取り組み ~
sansantech
PRO
4
1.1k
Oracle Autonomous Database:サービス概要のご紹介
oracle4engineer
PRO
1
7k
持続可能なソフトウェア開発を支える『GitHub CI/CD実践ガイド』
tmknom
4
680
SAVEPOINT α版
savepoint
0
670
アプリをリリースできる状態に保ったまま 段階的にリファクタリングするための 戦略と戦術 / Strategies and tactics for incremental refactoring
yanzm
6
1k
Creative UIs with Compose: DroidKaigi 2024
chrishorner
1
310
Oracle Base Database Service:サービス概要のご紹介
oracle4engineer
PRO
0
13k
やってやろうじゃないかメカアジャイル! / Let's do it, mechanical agile!
psj59129
1
530
Featured
See All Featured
Designing Experiences People Love
moore
138
23k
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
190
16k
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
248
20k
Building Better People: How to give real-time feedback that sticks.
wjessup
359
18k
Making the Leap to Tech Lead
cromwellryan
128
8.8k
It's Worth the Effort
3n
182
27k
Designing the Hi-DPI Web
ddemaree
278
34k
BBQ
matthewcrist
83
9.1k
StorybookのUI Testing Handbookを読んだ
zakiyama
26
5.1k
Building a Modern Day E-commerce SEO Strategy
aleyda
36
6.8k
Being A Developer After 40
akosma
84
590k
Principles of Awesome APIs and How to Build Them.
keavy
125
16k
Transcript
How To Improve UI Quality And Performance CA.flutter 11/14 naruogram
自己紹介 名前: なるお(naruogram) 技術: Flutter, Swift X: @naruogram 所属: Amebaマンガ
経歴: CA24卒内定者
目次 - 第一章: Visual Regression Test 導入へ - 第二章: VRT運用について考える
- 第三章: integration testでパフォーマンス計測
UIの品質とは
UIの品質とは そのサービスがユーザーにとってどれだけ使いやすく、 理解しやすく、効率的であるか (ChatGPT調べ)
UIの品質チェックリスト(自分調べ) - 異なるデバイスでもUIが崩れないか - 異なる状況においてUIが崩れないか - 異なる状況において操作を阻害しないか - 端末の文字サイズによってUIが崩れないか -
エラーハンドリングができているか - アクセシビリティ準拠されているか - その他諸々
手動で確認するのは時間がかかりすぎて辛い😡
テストを使って自動化しよう🥺
第一章: Visual Regression Test 導入へ
第一章: Visual Regression Test 導入へ VRT(Visual Regression Test)とは UIの変更を自動的に検出するテスト手法の一つです。 これにより、新
しいコードの導入や変更がグラフィカルユーザーインターフェースに与 える影響を迅速にキャッチすることができます。 つまりUIの見た目やUIの差分変更を可視化することができる🔥
第一章: Visual Regression Test 導入へ 使用技術 flutter Package: playbook-ui Test
Tool: reg-suit CI: GitHub Actions(linux) Storage: Google Cloud Storage(AWS等でも可)
第一章: Visual Regression Test 導入へ 導入手順 1. playbookを使ってstoryを書く(各ページ等) 2. widgetTestを書く
3. GitHubへPushしてCIを回す 4. reg-suitにて差分比較ができる
第一章: Visual Regression Test 導入へ 1. playbookを使ってstoryを書く(各ページ等)
第一章: Visual Regression Test 導入へ 2. WidgetTestを書く ※ここで端末などを指定できる
第一章: Visual Regression Test 導入へ 3. GitHubActionsでCIを回す ビルドできる状態でreg-suitを走らせる
第一章: Visual Regression Test 導入へ 4. 差分検証 PRにVRTの結果が送られる
第一章: Visual Regression Test 導入へ 4. 差分検証 意図しない変更やUI崩れを確認できる 崩れていた場合は修正できるので 品質を保つ運用ができる
第一章: まとめ - 導入自体はコストが低い - 新規アプリの場合は、最初から導入していると運用が楽 - 既存プロダクトの場合は、重要な部分のみ導入でも効果あり
第二章: VRT運用について考える
UIの品質チェックリスト - 異なるデバイスでもUIが崩れないか - 異なる状況においてUIが崩れないか - 異なる状況において操作を阻害しないか - 端末の文字サイズによってUIが崩れないか -
エラーハンドリングができているか - アクセシビリティ準拠されているか
UIの品質チェックリスト - 異なるデバイスでもUIが崩れないか - 異なる状況においてUIが崩れないか - 異なる状況において操作を阻害しないか - 端末の文字サイズによってUIが崩れないか -
エラーハンドリングができているか - アクセシビリティ準拠されているか VRTで網羅できる部分を考える
UIの品質チェックリスト - 異なるデバイスでもUIが崩れないか - 異なる状況においてUIが崩れないか(一部) - 異なる状況において操作を阻害しないか - 端末の文字サイズによってUIが崩れないか -
エラーハンドリングができているか(一部) - アクセシビリティ準拠されているか(一部)
2-1: 異なるデバイスでもUIが崩れないか
1. 異なるデバイスでもUIが崩れないか Case1: 例えばiOS14以上に対応するアプリを作ったとする iOS14はiPhoneSE(第2世代)がサポートしている。 その場合、サイズの小さい iPhoneSEのサイズにも対応する必要があ る。
1. 異なるデバイスでもUIが崩れないか Case1: 例えばiOS14まで対応するアプリを作ったとする。 iPhone11 iPhoneSE(第二世代)
1. 異なるデバイスでもUIが崩れないか 問題: デバイスによるUI崩れが発生する 解決策: VRTテストにおいてテストする端末を増やす iOS iPhoneSE iPhone11 iPadProMini6
iPadPro6 Android pixel4 lavieT8 xperiaZTablet チームでは下記の端末に対応
1. 異なるデバイスでもUIが崩れないか 選定理由 各OSでの、通常サイズ、タブレットサイズにて 一番大きい端末、小さい端末を採用する 画面サイズの差で起きるUI差分を極限まで減らす
1. 異なるデバイスでもUIが崩れないか 活用事例 - iPhoneSEなどの小さい端末でのUI崩れの発見 - タブレットサイズに対してのUI崩れの発見
2-2: 異なる状況でもUIが崩れないか
2. 異なる状況でもUIが崩れないか Case1: 文字が長いケース Case2: 正しく画像等を取得できなかった場合(通信状況が悪い) UIの状況は、一画面に対しても様々である。
2. 異なる状況でもUIが崩れないか 問題 - 長い文字列や画像のPathがない場合にUIが崩れる 解決策 - 長い文字列のStoryを用意する - 画像がないケースのStoryを用意する
2. 異なる状況でもUIが崩れないか 運用方法 - UIへのチェック項目をルール化する - 複数のシナリオを用意する 効果 - UI崩れの早期発見になる
- UI修正タスクが減少する
2. 異なる状況でもUIが崩れないか 運用方法 - UIへのチェック項目をルール化する - 複数のシナリオを用意する 効果 - UI崩れの早期発見になる
- UI修正タスクが減少する 引数を渡さないと検証できないの?
2. 異なる状況でもUIが崩れないか Fakeを使ってデータを差し替える 1. FakeXXXを用意 2. VRT時にProviderをoverride ※ VRT時は通信処理は使えない
2. 異なる状況でもUIが崩れないか Case3: リファクタリング等で現状のUIを崩していないか否か 機能追加やリファクタリングがUI崩れに繋がる時もあります。 Component等は特に気をつけるべき🚨
2. 異なる状況でもUIが崩れないか 問題 ・リファクタリングなどの変更による デグレの発生 解決策 ・reg-suitを使い、不要な差分を早期発見👀
2. 異なる状況でもUIが崩れないか 活用例 1. リファクタリングをした場合に差分がないか 2. デザイン修正した場合に、不要な差分がないかを確認できる 3. タップ領域のみを拡大した場合に差分がないか (a11y対応)
2-3: 端末の文字サイズによってUIが崩れないか
3. 端末の文字サイズによってUIが崩れないか Case1: 端末の文字サイズを1.5倍や2倍にしている場合 ユーザーは各OSにおいて文字サイズを設定することができる。 その文字サイズはアプリを制御していない場合を除き、適用する。
3. 端末の文字サイズによってUIが崩れないか iOSでの文字サイズの標準と最大の違い
3. 端末の文字サイズによってUIが崩れないか iOSでの文字サイズの標準と最大の違い 文字サイズの変更に対応しなければUIが崩れる
3. 端末の文字サイズによってUIが崩れないか iOSでの文字サイズの標準と最大の違い 文字サイズの変更に対応しなければUIが崩れる 文字サイズに対応することはAccessibility的にも大切
3. 端末の文字サイズによってUIが崩れないか Flutter Accessibility Large Fonts Render text widgets with
user-specified font sizes (引用: flutter.dev) FlutterのAccessibility的にも推奨されている👀
3. 端末の文字サイズによってUIが崩れないか Flutter Accessibility Large Fonts Render text widgets with
user-specified font sizes (引用: flutter.dev) FlutterのAccessibility的にも推奨されている👀 どう対応するのか?
3. 端末の文字サイズによってUIが崩れないか 端末の文字サイズを検知する The number of font pixels for each
logical pixel. For example, if the text scale factor is 1.5, text will be 50% larger than the specified font size. (引用: flutter.dev)
3. 端末の文字サイズによってUIが崩れないか 問題 文字サイズによるUI崩れが発生 解決策 TextScaleFactorの値を設定し、 複数パターンの文字サイズをテストする。
3. 端末の文字サイズによってUIが崩れないか 実際のVRTを実行した結果 1倍 1.5倍
3. 端末の文字サイズによってUIが崩れないか 活用事例 チームでは文字サイズを1倍と1.5倍を使い、テストをしている。 早期発見できた問題 1. サイズを固定にしているWidgetでのUI崩れ(AppBarなど) 2. VRTは成功しているが、文字サイズが大きく、見切れているケース
3. 端末の文字サイズによってUIが崩れないか 引用: https://developers.cyberagent.co.jp/blog/archives/36310/ 詳しくは CyberAgent Developer Blogへ
第二章: まとめ - 効果を大きくするためには、テストする項目を決めるのが大事 - アプリのケースによって、何をテストするかを決めよう - VRTを駆使すれば、作業時間の減少することができる
第三章: flutter integration testで計測する
第三章: integration testで計測 flutter integration testとは Flutterアプリケーションの特定の部分または全体をテストするための方法 です。Integration Testは、アプリケーションの異なる部分が連携して正しく 機能することを確認します。(統合テスト)
※統合テストとは 個々のモジュールやコンポーネントが正しく連携して動作するかを確 認するテスト
第三章: integration testで計測 flutter_integration_testは計測できる👀 特定のタスクの実行中にパフォーマンスタイムラインを記録 し、結果の概要をローカルファイルに保存するテストを作成す る方法。 引用: flutter.dev
第三章: integration testで計測 flutter_integration_testは計測できる👀 特定のタスクの実行中にパフォーマンスタイムラインを記録 し、結果の概要をローカルファイルに保存するテストを作成す る方法。 引用: flutter.dev integration
testを導入してみよう
第三章: integration testで計測 - 従来のintegration testを記述する。 今回のテストではListViewをスクロールし て、一番最後の要素を見つけたら成功とい う処理を書いている。
integration testを使ってパフォーマンス計測してみよう
第三章: integration testで計測 計測するためには 1. traceActionを使用する 2. reportKeyを設定する 引用: flutter.dev
第三章: integration testで計測 計測するためには 3. test_driverフォルダの中に perf_driver.dartを作成する。 4.
テストを実行し、計測結果のjsonが 生成される 引用: flutter.dev
第三章: integration testで計測 生成されたJson - 平均フレームビルド時間 - 最長フレームビルド時間 - 平均フレーム描画時間
- 最長フレーム描画時間 - 平均CPU使用率 - 平均メモリ使用率 これ以外のメトリクスを取得可能
第三章: integration testで計測 - 平均フレームビルド時間: 16ms未満だと60fpsで描画される - 平均CPU使用率: アプリ全体に対して、特定のアクションが異常値の場合、改善の余地あり -
平均メモリ使用率: アプリ全体に対して、特定のアクションが異常値の場合、改善の余地あり (特に対応している最低のスペック端末での検証だと効果が見えやすい)
Tips: 複数のテストを同時に計測する
第三章: integration testで計測 問題 現状だと値が渡せないので、特定のテスト しか、実行できず、都度書き換える必要が ある。
第三章: integration testで計測 解決策(手順1) integrationTestで複数のケースを一度のアクションで実行するには、 all_test.dart(ファイル名は問わない)というファイルを用意し、それぞれのテストを 呼び出す必要がある。
第三章: integration testで計測 解決策(手順2) 1. integration testのシナリオを置い ているフォルダに対して、テスト名 を取得する。 2.
取得したテスト名一覧を使用し、パ フォーマンスの計測結果を複数作成す る。
現実的に活用できる体制を考える
第三章: integration testで計測 効果が期待できる使用方法 1. 現在のアプリのパフォーマンスを確認する。 2. パフォーマンスが落ちている原因を探す。 3. パフォーマンス改善タスクの際に、ローカルで都度テストをして、計測する。
4. 定期的にintegration testのCIを回し、パフォーマンスの著しい低下を防ぐ。
第三章: integration testで計測 効果が期待できない使用方法 1. PR時にPushごとにintegration_testのCIを回す。 - CIのコストが高いため、コストに対しての効果が期待できない。 2. パフォーマンスが求められないアプリでの実行
- 基本的に複雑なアプリではない限り、気にしなくても快適に使用できる。
第三章: まとめ - integration testの導入はコストが高いので必要なケースから対応する - チームの状況によって活用方法は考えるべき
最後に
まとめ - テストは各チームによって必要なものが変わるので、導入は慎重に - VRTは導入コストが低い - integration testは導入コストが高いため検討が必要
ご清聴ありがとうございました🙇