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
リリース前のリグレッションテストをUIテストで自動化、1年間運用した話
Search
yu mitsuhori
July 25, 2019
Programming
2
340
リリース前のリグレッションテストをUIテストで自動化、1年間運用した話
2019/7/25のAndroidTestNightで発表した資料です
yu mitsuhori
July 25, 2019
Tweet
Share
More Decks by yu mitsuhori
See All by yu mitsuhori
【DroidKaigi版】ReactNativeとKotlinで叶える夢のリアルタイム音声配信
youmitsu
1
3.1k
ReactNativeとKotlinで叶える夢のリアルタイム音声配信
youmitsu
1
770
stand.fm(Android)におけるreact-native-track-playerの改善
youmitsu
1
2k
TargetSdkVersion29で BottomNavigationが点滅する件
youmitsu
1
1.5k
New features in RemoteConfig, Analytics at Google I/O 2019
youmitsu
1
610
FirebaseNotification,RemoteConfigでユーザセグメントごとにプッシュ通知を実装する
youmitsu
8
1.5k
Report from Google I/O 2019
youmitsu
1
73
OSSにコントリビュートした話
youmitsu
1
73
初めて自作ViewのAARライブラリを公開した話
youmitsu
1
350
Other Decks in Programming
See All in Programming
かんたんデザイン編集やってみた~「完全に理解した」までの道のり~
morit4ryo
1
130
Djangoの開発環境で工夫したこと - pre-commit / DevContainer
hiroki_yod
1
690
Modular Monolith Monorepo ~シンプルさを保ちながらmonorepoのメリットを最大化する~
yuisakamoto
11
4.1k
PipeCDの歩き方
kuro_kurorrr
4
140
RWC 2024 DICOM & ISO/IEC 2022
m_seki
0
150
17年周年のWebアプリケーションにTanStack Queryを導入する / Implementing TanStack Query in a 17th Anniversary Web Application
saitolume
0
180
【re:Growth 2024】 Aurora DSQL をちゃんと話します!
maroon1st
0
650
React CompilerとFine Grained Reactivityと宣言的UIのこれから / The next chapter of declarative UI
ssssota
7
3.5k
macOS なしで iOS アプリを開発する(※ただし xxx に限る)
mitsuharu
1
170
.NET 9アプリをCGIとして レンタルサーバーで動かす
mayuki
1
760
talk-with-local-llm-with-web-streams-api
kbaba1001
0
160
Welcome JSConf.jp 2024
yosuke_furukawa
PRO
0
3.1k
Featured
See All Featured
Designing on Purpose - Digital PM Summit 2013
jponch
116
7k
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
27
4.3k
Rebuilding a faster, lazier Slack
samanthasiow
79
8.7k
The Illustrated Children's Guide to Kubernetes
chrisshort
48
48k
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
232
17k
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
356
29k
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
95
17k
VelocityConf: Rendering Performance Case Studies
addyosmani
326
24k
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
191
16k
Fantastic passwords and where to find them - at NoRuKo
philnash
50
2.9k
Optimizing for Happiness
mojombo
376
70k
Intergalactic Javascript Robots from Outer Space
tanoku
270
27k
Transcript
リリース前のリグレッションテストをUIテ ストで自動化、1年間運用した話 養命酒(Yu Mitsuhori)/ @1013Youmeee Android Test Night #7 at
DeNA
自己紹介 2 - 三堀 裕(みつほり ゆう) - 養命酒(youmeee, youmitsu) -
メインはAndroid - 新宿の隣でヘルスケア系アプリを開発していました (7/19に最終出社でした。有給消化中) - Github: youmitsu - Twitter: @1013Youmeee
この発表の目的 - 某アプリLでのAndroid Instrumented Testを用いたリグレッションテストの自動化の 取り組みについての事例の紹介 - 1年間運用してみてよかった点や、注意点、課題点などの紹介 3
こんな話をしていきます - 自動化の経緯 - 某アプリLでのテスト - テストの種類 - タイミング -
構成と構築について - テスト方針 - システム構成図 - 選定技術とテスト実装について - 1年間運用してみた所感 - 良かった点、現時点での課題点、改善策 - まとめ 4
自動化の経緯 5
- 2015年にリニューアル - MAU約400万 - 中〜大規模 - 開発チーム:Android 2人, iOS
3人 - QAチームなどはいない。開発チームが仕様検討、設計、実装、テスト、リリースを一 貫して行う - ベースはClean Architecture 6 某アプリLの概要
某アプリLの悩みの種 - 保守運用フェーズ、開発人員も減らされている - これからも長く存続しつづけるであろう - 開発人員が少ない中での作業効率化(自動化できるものはしていきたい) - テスト実施における精神的負担の軽減 7
某アプリLでのリグレッションテスト 8
某アプリLでのリグレッションテスト - リリース前に改修していない部分に影響がないかをテストする(E2Eテスト) =>手動での実施だと全ケース約1人日かかる 参考 - 単体テスト - 各レイヤーごと、View以外 -
結合テスト - 修正された機能においてテストケースを作成し、実機を操作してテストする 9
主な開発フローとテスト 10 Develop Feature1 Feature2 Release Master : 単体テスト :
結合テスト : リグレッションテスト PlayStoreへ デプロイ
自動テスト構築について 11
当初の自動化方針 - 基本的な方針は今までのリグレッションテストと同じ - E2Eテスト。できるだけ実働環境に近い状態で実行する - Releaseブランチにて実施する - 自動化できない部分は手動で実施する -
主にWebView - TestSuiteはActivityやFragment単位ではなく、ユーザタイプ&課金タイプごとに定義 する - APIやWebサーバはテスト環境を使用 - テストファーム(Visual Studio AppCenter)で走らせることを想定 12
テスト実行時の構成 - Android Instrumented Test(AndroidJUnitRunner) - Espresso - Assertion, Action
- UiAutomator - バックグラウンド復帰の実装 - RxIdler2 - RxJava2のBackground Taskの終了を待つ - AppCenter SDK - 画面のキャプチャ - Page Object Pattern(リファクタリング中) - 画面ごとをObjectとして定義する。UIテストにおけるデザインパターン 13
テストコード実装にあたって - アプリをインストールしてからすべての機能を順番にチェックしていく - 画面に表示されているコンポーネントのチェック(Espresso) - onView()で要素取得(条件はwithIdやwithText) - isDisplayed()による表示確認 -
実際にユーザが操作するのと同じシチュエーションで実行したいため、 API通信はモックせず実際のネットワーク通信でテストを実行する 14
アーキテクチャ 15 Runner TestCase Page テストを実行するクラス。 エントリポイント 各Feature単位で定義。 Pageオブジェクトを使っ てユーザシナリオを組み
立てる 画面単位で定義。 assert,perform系のメ ソッドを持ち、TestCase から呼び出される 1 n n n
簡単なコードイメージ(Runnerクラス) @RunWith(AndroidJUnit4.class) @LargeTest public class RegressionRunner { @Inject NoticeTest noticeTest;
// 各機能ごとにテストケースクラスを定義 @Rule public ReportHelper reportHelper = Factory.getReportHelper(); // AppCenterSDKの画像キャプチャ用インスタンス @Rule public ActivityTestRule<MainActivity> mainActivityActivityTestRule = new ActivityTestRule(MainActivity.class, false, false); @Test // ゲストユーザ&&TypeAのシナリオテストを実行 public void GuestUserTypeA_regression() { reportHelper.label("A_freeUser_regression Start"); // AppCenterSDKによる画面キャプチャ splashActivityActivityTestRule.launchActivity(new Intent()); // アプリの起動 noticeTest.assertNotice(); // お知らせ画面のテスト実行 ... } // 有料ユーザ&&TypeBなどのシナリオテストを以下に続けて定義 } 16 Runnerクラス
簡単なコードイメージ(TestCase, Pageクラス) class NoticePage : Page { private fun isShowedCouponBanner()
= onView(withId(R.id.coupon_view)).check(matches(isDisplayed())) fun clickBanner() = apply { onView(withId(R.id.coupon_view)).perform(click()) label("clickBanner") } } 17 Pageクラス class NoticeTest @Inject constructor( context: Context ) : BaseTest(context) { fun assertNotice() { NoticePage() .assert { isShowedCouponBanner() } .clickBanner() .assert { // クリック後の画面状態を assert } } } TestCaseクラス
システム構成について 18
自動化におけるシステム構成 19 Schedule Build & Distribute App Test app Run
Test & Report Azure Pipeline Visual Studio App Center Outlook Flow Teams Developer Notification テスト完了通知は メールでしか 受け取れないため Check Result 以下のIPを許可しておく ・195.249.159.238/32 ・195.249.159.239/32
AppCenterの紹介 - Microsoftが提供するモバイル向けCI/CDプラットフォーム - Build, Test, Distributeなど テスト - DeviceFarm上で実行可能
- デバイス数が豊富 - 100ドルずつ課金していくと並列実行数を増やせる - 直列のみ: 98ドル, 2並列: 198ドル, n並列: 98nドル - 30日間は無料トライアル期間 - AppCenterSDKを使うと、スクリーンショットの撮影も可能 (動画は撮れない...はず) 20
1年間運用してみた所感 21
良かった点 - 全ケース中の60%ほどテスト工数が削減できた - 手動でやる作業が削減されたことで、効率的、精神衛生的にもGood - とりあえずこれを回しておけばOKという点では安心感もある - テスト実施頻度が高くなった -
カスタムビューで実装していた部分はEspressoのonViewで取得できないことがあっ たので、UIテストにおいてのテスタビリティを意識するきっかけになった 22
辛い点、出てきた問題点 - 不安定(特にAppCenterでの実行時) 通らないとリリースできないので、逆にリリースまでのスピードが落ちる - ネットワーク起因(タイムアウト) => API通信のモック化を検討中 - AppCenterの実機がアニメーションオフにしていない
- 安定しないので、手動でスケジューリングすることになる、、 => 安定してきたらCIとして自動スケジューリングさせたい - 実行速度が遅い(テスト実行: 15~20分、テスト結果作成: 15~20分) - 3つのOSバージョンで直列実行するため、全部終わるのに 1時間くらいかかる - WebView辛い - 非同期にレンダリングされる要素は取得に失敗しやすい( Espresso Web) 23
まとめ 24
まとめ - 某アプリLにおいて、リリース前のリグレッションテストを自動化した事例について紹 介 - UIテスト安定化させるのは難しい、継続的にテスト自体をメンテしていく必要があり そう - 通信のタイムアウト -
デバイス起因 - 実行時間 - WebView - いくつかの工夫によって安定化を目指していく - WebViewに対しては深いテストをしない - APIClientをモックする 25