Androidでの自動UIテスト

このエントリーは、GMOアドマーケティング Advent Calendar 2018 の 12/15の記事です。

GMOアドマーケティングとしては初のAdvent Calendar参戦です。

 

こんにちは。
GMOアドマーケティングのT.Mです。

はじめに

広告SDKを組み込んだアプリのテストを人手で行っているのですが、
可能な限り自動化したいと思い、UIテストの自動化を試みています。

AndroidにはUIテストを行う方法として、主に3つのフレームワークがあります。(もっとありますが)

  • Espresso
  • UI Automator
  • appium

各フレームワークを簡単に調査

Espresso

GoogleのUIテストフレームワークです。
単一のアプリを対象にしていて、ホワイトボックステストが可能です。
そのため、アプリのプロジェクトにテストコードを書いていきます。

Androidのドキュメントがあります。
Test UI for a single app

UI Automator

こちらもGoogleのUIテストフレームワークです。
複数のアプリ間のやりとりを含むテストが可能です。ブラックボックステストになります。
自分のアプリ以外も操作できるので、設定アプリから機内モードにするとかも可能です。

こちらもAndroidのドキュメントがあります。
Test UI for multiple apps

appium

Android、iOS、Windowsのクロスプラットフォームで使用できるOSSのオートメーションライブラリです。
Seleniumと同様にWebDriverを使用します。
Android環境では、内部でUI Automatorが使用されています。(4.2以上)

テスト対象のアプリ

テスト対象となるアプリです。
JSONを返すサーバにGETリクエストして取得した内容を表示します。

ライセンス表記

テストアプリ作成に伴いライブラリを使っていますのでライセンス表記をします。
OkHttp、Picasso、android-testingは、Apache License, Version 2.0です。
This software includes the work that is distributed in the Apache License 2.0

json-serverはMITライセンスです。
https://github.com/typicode/json-server#license

JSONサーバ

サンプルなので簡単にJSON Serverを使います。
npmで一発でインストール出来るので簡単です。
用意するJSONは下記のようにしました。
タイトル、詳細、画像URLです。

ローカルPCで動かすので、そのまま起動するとlocalhost:3000になるのですが、
Androidエミュレータからだとlocalhostにアクセスできませんでした。
そのため、ローカルPCのIPアドレス(例えば192.168.1.7)をホスト名に指定して起動します。

http://192.168.1.7:3000/ad/1
にアクセスするとJSONが取得できます。

サンプルアプリ

JSONサーバにGETリクエストしてJSONを取得し、画面に表示します。
OkHttpPicassoを使って簡単に作ります。

ライブラリを設定します。

インターネットに接続できるようにパーミッションを設定します。

画面レイアウトです。
ボタンを押したらリクエストします。
title、descriptionを表示するTextViewに、
img-urlの画像を表示するImageViewを配置しています。

ロジック部分です。

実行して、ボタンをクリックすると取得した内容が表示されます。

テストアプリ実行

Espressoを使ってみる

ようやく本題です。
今回はEspressoを使ってみたいと思います。

まずはライブラリの設定です。
最近のAndroidStudioで新規作成すると、runnerとespresso-coreは最初から入っていました。
すでに入っているようであれば、rulesだけ追加します。

テストコードを作成します。
app/src/androidTest/java/パッケージ名/の下に配置します。

onView()・・・ViewInteractionを生成します。ここからViewをクリックしたり内容のチェックが可能になります。
withId()・・・リソースIDからMatcherを生成します。
check()・・・引数で指定したアサーションの確認をします。
matches()・・・ViewAssertionを生成します。これによりcheck()ができます。
perform()・・・Viewに対して操作します。
click()・・・Viewをクリックします。
withText()・・・文字列からMatcherを生成します。

他にもいろいろな事が出来るのでEspressoのリファレンスを参照してください。

hasDrawable()は、Espressoには用意されておらず新規で作成しています。
これはGoogleのサンプルソースから持ってきています。
ImageViewのmDrawableの有無を確認するMatcherになっています。

このテストプログラムを実行するとボタンをクリックし、1秒待って、各要素のチェックを行います。

テスト実行

おわりに

Espressoを使ってテストを書きました。
今回は単純にViewの要素を見ているだけですが、IntentやWebViewのテストも可能です。
テストプログラムでJSONサーバへリクエストしてからsleepを入れているので、
もっとスマートな方法はないかなど確認していきたいです。

UI Automatorやappiumで書くとどう違うのか試していきたいと思います。

以上です。

明日は「座標降下法による行列分解の実装について」のお話です。

お楽しみに!

クリスマスまで続くGMOアドマーケティング Advent Calendar 2018

ぜひ今後も投稿をウォッチしてください!

■エンジニアによるTechblog公開中!
https://techblog.gmo-ap.jp/
■Wantedlyページ ~ブログや求人を公開中!~
https://www.wantedly.com/projects/199431
■エンジニア採用ページ ~福利厚生や各種制度のご案内はこちら~
https://www.gmo-ap.jp/engineer/
■エンジニア学生インターン募集中! ~有償型インターンで開発現場を体験しよう~
https://hrmos.co/pages/gmo-ap/jobs/0000027