Appiumに手を出してみた ~ Android ~


この記事は「[Qiita Advent Calendar 2016 Android その2](http://qiita.com/advent-calendar/2016/android_second)」の10日目の記事です。

# 自己紹介
私は、株式会社サイバーエージェント **CA ProFit-X** という広告プロダクトで、メディア様の収益を最大化することを目標にエンジニアをやってます。
**CA ProFit-X** は、モバイル向けネイティブ広告（主にインフィード広告）専業のSSP事業者なのです！
また個人的には、今年から **日本Androidの会** の運営メンバーにも入ってたり。

# お題
今回はテスト自動化を目標に、 *Appium* に手を出し始めた話しをしたいと思います。

# Appiumって？
[Appium](http://appium.io/)とは、iOSおよびAndroidプラットフォーム上で動く
- ネイティブアプリ
- モバイルウェブサービス
- ハイブリッドアプリ
等を自動化するオープンソースのツールです。

# なぜ必要に？
現在、広告配信タグ（モバイルウェブサービス用）のE2Eテストに[Nightmare](http://www.nightmarejs.org/)を使用しています。
しかし、 **モバイルSafariでしか発生しない事象** （Mac Safariでも再現しない）にぶち当たり、実機（シミュレータ）を使用したE2Eテストの必要性が出てきました。
また、せっかくなら広告配信SDK（ネイティブアプリ用）のテストにも使っていきたいと思い。
そこで、SeleniumぽくてWebDriberの流れを組むやつをチームメンバーに紹介されたので試してみました。

# GUI vs CUI
お試しくらいならGUIの方が分かりやすいかなと思い、今回はGUIで試しました。
結構、ハマった。。。
後から公式を読んでいて分かったのはGUIはバージョンが古く更新されてなかったので、Android/iOSの対応バージョンが古いのかも。

# ウェブブラウザとネイティブアプリの起動
いちおう、両方ともやってみた。

# 環境準備

## 環境変数を定義する
GUIでAppium Doctorを立ち上げる`bash`が起動するので、`~/.bashrc`に`JAVA_HOME`と`ANDROID_HOME`をかきました。
書かないとエラーが出て先に進めず・・・。

## AVDで適当に用意する
実機より簡単かなと思い、適当に3端末分用意してみた。
![スクリーンショット 2016-12-10 15.23.19.png](https://qiita-image-store.s3.amazonaws.com/0/4107/8dae914a-0e9c-ceb3-e6fd-d622c5912ac3.png "スクリーンショット 2016-12-10 15.23.19.png")

## Launch AVD
なぜかAVDで設定した3端末中2端末しか出てこない。意味分からん。

![スクリーンショット 2016-12-10 15.25.23.png](https://qiita-image-store.s3.amazonaws.com/0/4107/6c7d93b1-80b1-5206-efa5-2ce995e6ef26.png "スクリーンショット 2016-12-10 15.25.23.png")

## ウェブブラウザを起動してみる

### Use Browser
なぜかChromeが起動できない。
Chromeがインストールされていない端末なら分かるけど、インストールされていても起動できない。
Browserならできた。意味分からん。

![スクリーンショット 2016-12-10 15.25.29.png](https://qiita-image-store.s3.amazonaws.com/0/4107/d38f40fd-5b5c-444a-d6ff-3713e8b67a77.png "スクリーンショット 2016-12-10 15.25.29.png")

### ブラウザ起動に失敗すると
手がかりすくな！

![スクリーンショット 2016-12-10 15.47.35.png](https://qiita-image-store.s3.amazonaws.com/0/4107/a62368c4-ccf6-9a9e-5086-67eae7902877.png "スクリーンショット 2016-12-10 15.47.35.png")

コンソールには・・・？

![スクリーンショット 2016-12-10 15.47.57.png](https://qiita-image-store.s3.amazonaws.com/0/4107/9209c0ab-4800-5fcd-7481-89cdcc5344f6.png "スクリーンショット 2016-12-10 15.47.57.png")

なるほど。ウェブブラウザ起動するだけなのに、アプリパスを指定しろと。なんでだよ！

![スクリーンショット 2016-12-10 15.55.00.png](https://qiita-image-store.s3.amazonaws.com/0/4107/81d59f1b-c781-d000-b180-5b831c04a5a8.png "スクリーンショット 2016-12-10 15.55.00.png")

たしかに置いていないので・・・

![スクリーンショット 2016-12-10 16.11.26.png](https://qiita-image-store.s3.amazonaws.com/0/4107/3b562cf2-13c6-ea2f-02d1-f05047afab45.png "スクリーンショット 2016-12-10 16.11.26.png")

適当に置いた上でリトライすると・・・

![スクリーンショット 2016-12-10 16.10.46.png](https://qiita-image-store.s3.amazonaws.com/0/4107/ab035215-d315-1266-12d7-a9afb36bef2d.png "スクリーンショット 2016-12-10 16.10.46.png")

ｷﾀ━━━━(ﾟ∀ﾟ)━━━━!!

## ネイティブアプリを起動してみる

こんなかんじ。
![スクリーンショット 2016-12-10 16.21.34.png](https://qiita-image-store.s3.amazonaws.com/0/4107/9b261af9-574b-9b9b-8ec0-38c02fbbac22.png "スクリーンショット 2016-12-10 16.21.34.png")

広告配信SDKを開発する際のサンプルアプリが自動で起動した！！！
![スクリーンショット 2016-12-10 16.23.39.png](https://qiita-image-store.s3.amazonaws.com/0/4107/796b2cbb-4f34-1ccb-c2d0-992bc32e1e1b.png "スクリーンショット 2016-12-10 16.23.39.png")

# ここまでの感想

GUIでやる意味がなかた。GUIだとAppium上に画面が出てきてそこにフォーカスをあてると、どのようなviewかわかる（インスペクタ機能）ものの、CUIでよかた。
iOSは最初からCUIでお試しに入ろうと思う。

# 最後に
E2Eテストが充実するとリリース前の確認はもちろんですが、リリース後に大きなメリットがあると思っています。
例えば、僕たち広告配信側としては僕らの知らないところで発生しているメディア様の変更に、追従していけると他事業者様との競争にも優位になれそうな気がしています。
なので、ウェブサービス/ネイティブアプリ問わず、同じ仕組みで全てのテスト自動化の仕組みを構築していくことが重要かなと思っており、今後もE2Eテストを充実させていこうと思っています。

次は、 **Selenium Grid** をかけ合わせてみたい。