Speaker

Sumio Toyama

Sumio Toyama

テスト自動化が好きなAndroidエンジニア

Androidアプリのテスト自動化に興味を持っているエンジニアです。「Androidテスト全書」執筆。
DeNAのSWETグループで、Android関連プロジェクトへの自動テスト導入などを行っています。

Gradle Managed Virtual Devicesで変化するエミュレータ活用術

皆さんはAndroidエミュレータを使っていますか?
普段の開発であたり前のように使われているエミュレータですが、Gradle Managed Virtual Devicesの導入によって、Androidエミュレータを取り巻く事情が大きく変化しようとしています。

Gradle Managed Virtual Devicesは、Android Gradle Plugin (AGP) 7.2より導入された機能です。
この機能を使うと、build.gradleにテストを走らせたいAndroidエミュレータのスペックを書くだけでAVD (Android Virtual Device)の作成・起動からテストまでをコマンド1つで実行できます。
また、(Canary版ではあるものの)Automated Test Device (ATD)と呼ばれる軽量なエミュレータも利用できるようになっています。

一見とても便利そうなGradle Managed Virtual Devicesですが、本機能にも得手不得手があります。
例えば、画面が表示されなかったり、テスト実行が終わると同時にエミュレータも終了したりするため、意図通り動かなかったときの解析が大変なことがあります。

本セッションでは、新しく導入されたGradle Managed Virtual Devices機能はどのようなものなのか、それによってエミュレータの使い方がどのように変化してくのか紹介します。
また、AGPの実装を調べて判明した内容を元に、Gradle Managed Virtual Devicesを活用する際に直面しがちなトラブルの解決方法も合わせて紹介します。

具体的には次のようなトピックなどについて紹介します。
これを機に、皆さんが持っているAndroidエミュレータの知識もアップデートしませんか?

・Gradle Managed Virtual Devicesでできること、できないこと
・Gradle Managed Virtual Devicesの活用例
 ・Robolectricでは心許無いテストを動かす
 ・UIテストを動かす
 ・スクリーンショットテストを動かす
・CI環境上でGradle Managed Virtual Devicesを使うときの工夫
・Gradle Managed Virtual Devicesの実行で問題が起きたときの調査方法Tips

※できるだけCanary版を含む最新のAGPの実装を調べた結果にもとづいて話す予定です。

Robolectricの限界を理解してUIテストを高速に実行しよう

Espressoを使ったUIテストは、ユニットテストでは手の届かない動作確認にとても役立ちます。
そのような役立つ面がある一方で、UIテストには実行時間が長いという問題が付いてまわります。
たとえば、実行時間の長さ故に、Pull Requestの度にUIテストを実行するのは非現実的です。

そのような悩みを解決するために登場したのが、GoogleのProject Nitrogenの一環として実装が進んでいるRobolectric 4です。
Robolectric 4が採用しているアプローチは、Espressoを使ったUIテストを高速なローカルJVM上で(Local Testとして)実行するというものです。

ところが、いざUIテストをLocal Testとして動かそうとすると、次のようなトラブルに直面します。

・サンプルレベルのUIテストコードは動くのに、いざ実プロダクトのテストを動かそうとすると動かない
・エラーメッセージを見ても何が問題なのか分からない

日々忙しい中でこれらのトラブルを自力で解決するのは大変ですが、予め動作する範囲が分かっていたらどうでしょうか?
動作する範囲内でUIテストを書ければ、Robolectricのトラブルに巻き込まれなくなります。
日々のPull Requestの度にUIテストを実行することも夢ではありません!

本セッションでは、Robolectricで動作するUIテストの範囲を明らかにすべく、以下のようなトピックを紹介します。

・EspressoのUIテストをRobolectricで動かすための準備
・Android Jetpack Componentsのうち、Robolectricで動く機能、動かない機能
・Espresso APIのうち、Robolectricで動く機能、動かない機能
・Robolectricで画面更新を待ち合わせる方法のベストプラクティス
・Robolectricで動かしたいオススメUIテスト

EspressoのテストをAndroidの最新トレンドに対応させよう

Androidを取り巻く状況はこの2年間で大きく変化しています。例えば次のような変化がありました。

・Android関連パッケージのAndroidX (Jetpack)への再編
・記述言語のKotlinへのシフト
・Android Architecture Components(AAC)の浸透

このめまぐるしい変化にEspressoのテストコードも対応していかなければなりません。
本セッションでは、最新トレンドに対応したEspressoのテストが書けるようになることを目標に、次のトピックを紹介します。

・EspressoをAndroidX対応にする
・EspressoをKotlin対応にする
 ・Espresso Test Recorderを使ってKotlinで記録する
 ・変更に強くするためにKotlinでPage Objectデザインパターンを適用する
・AACを採用したアプリに対するEspressoテストの注意点

また、2018年後半に公開が予定されているProject Nitrogen導入に伴う変化についても(具体的な公開時期や発表時間の制約によりますが)可能であれば紹介したいと考えています。

本セッションの内容を学んで、UIテストコードもAndroidの最新潮流に乗り遅れないようにしましょう!

Espressoテストコードの同期処理を究める

■対象者
・Espressoで自動テストを書いてみたものの、不安定なテストが多くて困っている方
・Espressoでテストを自動化する範囲をより広げて行きたい方

■概要
AndroidのUIテストツールであるEspressoの特徴の1つに、
「UI操作に関する同期(待ち合わせ)処理を自動的にやってくれる」
というものがあります。
公式ドキュメントによると、この自動同期機能の恩恵により、
テストコードで明示的にwait/sleep/pollingを書く必要がなくなる、とも書かれています。

ところが、RxJavaなどの非同期処理を主体としたフレームワークが広く採用されるようになってから、Espressoの自動同期機能がうまくいかず、UIが更新される前に次の操作が実行されてしまい、テストが失敗するケースに直面することが多くなってきました。

皆さんの中にも、UI更新の待ち合わせがうまく行かず、その場しのぎにsleepを挿入した経験の有る方がいらっしゃるのではないでしょうか?

このセッションでは、Espressoの自動同期処理が何をしてくれるものなのか?
Espressoの自動同期処理でうまく行かないときにどうすれば良いのか?
という疑問を解決すべく、最新のEspresso 3.xの実装にもとづいて、以下の内容について解説します。

・Espressoが提供する自動同期機能が保証してくれること・くれないこと
・Espressoの同期処理をカスタマイズするIdlingResource APIの概要
・Espressoが提供しているIdlingResource実装の紹介と、その使い道
(一例として、RxJavaの非同期処理を待ち合わせる方法も紹介します)
・最後の手段: IdlingResourceを使わずに、簡単に同期を取る方法

このセッションを聴いた方が、
タイミングによって失敗してしまうような、
不安定なEspressoテストを自力で修正できるようになることを目指したいと思います。

DroidKaigi 2022 Sessionize Event

October 2022 Tokyo, Japan

DroidKaigi 2020 Sessionize Event

February 2020 Tokyo, Japan

DroidKaigi 2019 Sessionize Event

February 2019 Tokyo, Japan

DroidKaigi 2018 Sessionize Event

February 2018

DroidKaigi 2017

「変更に強いEspressoテストコードを効率良く書こう」
https://droidkaigi.github.io/2017/timetable.html#session-26

March 2017 Tokyo, Japan

DroidKaigi 2016

「生まれ変わったUI Automatorを使いこなす」
https://droidkaigi.github.io/2016/timetable.html#session-2016-02-19-11-30-12-00-b

February 2016 Tokyo, Japan

Sumio Toyama

テスト自動化が好きなAndroidエンジニア

Please note that Sessionize is not responsible for the accuracy or validity of the data provided by speakers. If you suspect this profile to be fake or spam, please let us know.

Jump to top