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
410
リリース前のリグレッションテストを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.2k
ReactNativeとKotlinで叶える夢のリアルタイム音声配信
youmitsu
1
900
stand.fm(Android)におけるreact-native-track-playerの改善
youmitsu
1
2.2k
TargetSdkVersion29で BottomNavigationが点滅する件
youmitsu
1
1.6k
New features in RemoteConfig, Analytics at Google I/O 2019
youmitsu
1
760
FirebaseNotification,RemoteConfigでユーザセグメントごとにプッシュ通知を実装する
youmitsu
8
1.6k
Report from Google I/O 2019
youmitsu
1
100
OSSにコントリビュートした話
youmitsu
1
100
初めて自作ViewのAARライブラリを公開した話
youmitsu
1
410
Other Decks in Programming
See All in Programming
猫の手も借りたい!ので AIエージェント猫を作って社内に放した話 Claude Code × Container Lambda の Slack Bot "DevNeko"
naramomi7
0
250
あなたはユーザーではない #PdENight
kajitack
4
300
Windows on Ryzen and I
seosoft
0
110
TROCCOで実現するkintone+BigQueryによるオペレーション改善
ssxota
0
140
nuget-server - あなたが必要だったNuGetサーバー
kekyo
PRO
0
170
受け入れテスト駆動開発(ATDD)×AI駆動開発 AI時代のATDDの取り組み方を考える
kztakasaki
2
520
Head of Engineeringが現場で回した生産性向上施策 2025→2026
gessy0129
0
210
Rで始めるML・LLM活用入門
wakamatsu_takumu
0
160
Unity6.3 AudioUpdate
cova8bitdots
0
110
CDIの誤解しがちな仕様とその対処TIPS
futokiyo
0
170
Rubyと楽しいをつくる / Creating joy with Ruby
chobishiba
0
200
CSC307 Lecture 15
javiergs
PRO
0
220
Featured
See All Featured
The agentic SEO stack - context over prompts
schlessera
0
680
[SF Ruby Conf 2025] Rails X
palkan
2
810
Designing Dashboards & Data Visualisations in Web Apps
destraynor
231
54k
Effective software design: The role of men in debugging patriarchy in IT @ Voxxed Days AMS
baasie
0
240
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
34
2.6k
SEO in 2025: How to Prepare for the Future of Search
ipullrank
3
3.3k
A Tale of Four Properties
chriscoyier
162
24k
How to train your dragon (web standard)
notwaldorf
97
6.5k
Building Flexible Design Systems
yeseniaperezcruz
330
40k
Dominate Local Search Results - an insider guide to GBP, reviews, and Local SEO
greggifford
PRO
0
94
VelocityConf: Rendering Performance Case Studies
addyosmani
333
24k
Neural Spatial Audio Processing for Sound Field Analysis and Control
skoyamalab
0
200
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