monkeyrunnerでAndroidの自動化テスト作成

# Androidの操作を自動化してテストを自動化する

## 開発環境
Mac 10.14.6

## やったこと
* Mac でmonkeyrunnerを動かすためにopenjdk8のインストール
* monkeyrunner で操作を記録
* 記録した操作で実行

## 参考にしたサイト
https://qiita.com/ikota/items/ef6bdb4dad6ab9ba912a
https://developer.android.com/studio/test/monkeyrunner/MonkeyDevice?hl=ja


##手順
### monkeyrunnerの実行環境の構築
すでにAndroid StudioがDownloadされている環境ではmonkeyrunnerが以下にある。
/Users/xxx/Library/Android/sdk/tools/bin/monkeyrunner

ターミナルからmonkeyrunnerを実行すると、以下のエラーが出て実行できない。

~~~
./monkeyrunner 
-Djava.ext.dirs=/Users/xxx/Library/Android/sdk/tools/lib:/Users/xxx/Library/Android/sdk/tools/lib/x86_64 is not supported.  Use -classpath instead.
Error: Could not create the Java Virtual Machine.
Error: A fatal exception has occurred. Program will exit.
~~~

monkeyrunner は"Java SE 10.0.2"　では実行できないようなので OpenJDK 8をinstallする。

~~~
$ brew tap homebrew/cask-versions
==> Tapping homebrew/cask-versions
Cloning into '/usr/local/Homebrew/Library/Taps/homebrew/homebrew-cask-versions'...
remote: Enumerating objects: 21, done.
remote: Counting objects: 100% (21/21), done.
remote: Compressing objects: 100% (17/17), done.
remote: Total 225744 (delta 8), reused 6 (delta 4), pack-reused 225723
Receiving objects: 100% (225744/225744), 58.27 MiB | 7.02 MiB/s, done.
Resolving deltas: 100% (155275/155275), done.
Tapped 155 casks (202 files, 64.5MB).

$ brew cask install adoptopenjdk8
==> Downloading https://github.com/AdoptOpenJDK/openjdk8-binaries/releases/download/jdk8u252-b09/OpenJDK8U-jdk_x64_mac_hotspot_8u252b09.pkg
==> Downloading from https://github-production-release-asset-2e65be.s3.amazonaws.com/140418865/c5d7a700-80b2-11ea-83f0-4ba454f82e1c?X-Amz-Algorithm=AWS4-HMAC-SHA256
######################################################################## 100.0%
==> Verifying SHA-256 checksum for Cask 'adoptopenjdk8'.
==> Installing Cask adoptopenjdk8
==> Running installer for adoptopenjdk8; your password may be necessary.
==> Package installers may write to any location; options such as --appdir are ignored.
Password:
installer: Package name is AdoptOpenJDK
installer: Installing at base path /
installer: The install was successful.
🍺  adoptopenjdk8 was successfully installed!
~~~

openjdk8 がインストールされたことを確認する。

~~~
$ /System/Library/Frameworks/JavaVM.framework/Versions/A/Commands/java_home -V
Matching Java Virtual Machines (2):
    10.0.2, x86_64:	"Java SE 10.0.2"	/Library/Java/JavaVirtualMachines/jdk-10.0.2.jdk/Contents/Home
    1.8.0_252, x86_64:	"AdoptOpenJDK 8"	/Library/Java/JavaVirtualMachines/adoptopenjdk-8.jdk/Contents/Home

/Library/Java/JavaVirtualMachines/jdk-10.0.2.jdk/Contents/Home
~~~

defaultのjava versionをopenjdk8に切り替える。

~~~ ~/.bashrc
export JAVA_HOME=$(/System/Library/Frameworks/JavaVM.framework/Versions/A/Commands/java_home -v "1.8.0_252")
PATH=${JAVA_HOME}/bin:${PATH}
~~~


Android 端末側で開発者オプションを有効にして、adb 接続できていることを確認する。

~~~
$ adb devices
List of devices attached
18f8de88	device
~~~

これで実行環境は整った。

### monkeyrunner で操作を記録して、実行スクリプトに変換して実行
こちらのサイトに書かれている通りに実行する。
https://qiita.com/ikota/items/ef6bdb4dad6ab9ba912a

~~~
$ /Users/xxx/Library/Android/sdk/tools/bin/monkeyrunner ~/run_monkeyrecoder.py
~~~

携帯の画面と操作したログが右側に表示されるので、テストしたいシナリオを実行した後に、
Export Actions をして操作ログをaction_test.txtとして保存する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535710/80c79b48-b07d-940b-ab40-be8c16b50261.png)

先ほど保存したaction_test.txtを @ikota さんのconverterスクリプトを使って実行用のスクリプトに変換する。

~~~
$ python monkey_converter.py action_test.txt action_test.py
~~~

変換してできたaction_test.pyをmonkeyrunnerで実行すれば、自動で先ほど行った操作ができるようになる。

~~~
$ /Users/xxx/Library/Android/sdk/tools/bin/monkeyrunner ~/action_test.py
~~~


以上で、
Mac OS上でMonkey Runnerを使って、Android 端末の制御を自動化できた。