2015.03.10   |   iOS

iOS実機をスクリプトで操作して機能テストしてみる

iPhoneを実際に動かしてアプリのテストしたいと思って調べてみたところ、appiumというツールを使えばスクリプトで実機を操作して機能テストできる事が分かりました。

実際に導入して使ってみたのでその時の導入手順等をメモしときます。

参考: Qiita: Appiumを使ってみた【iOS編】

導入環境

  • 母艦:MacBookAir (Yosemite)
    • brew インストール済
    • pip, Virtualenvwrapper インストール済
  • 実機:iPod Touch 5th (iOS8.1)
    • テスト対象のアプリをデバッグビルドでインストール済
    • (要 iOS Developer Program登録)

Appiumインストール

関連パッケージインストール

# パッケージリストを最新に
brew update

# Appiumインストール
brew install node
npm install -g appium
npm install wd

# 実機を操作するために必要
brew install --HEAD ideviceinstaller

# シミュレータ有効化(今回は使ってないけど一応)
sudo authorize_ios

# インストール完了チェック
appium-doctor --ios

最後のコマンド実行後「iOS Checks were successful.」というように表示がされれば成功みたいです。

Pythonライブラリ導入

Appiumをインストールすることで、iOS実機の操作が可能になるみたいですが、これをスクリプトのテストコードからアクセスできるように言語ごとのライブラリを導入する必要があります。今回は書き慣れてるPythonを使ってライブラリを入れてみます。(人気なのはRubyのよう。)

# appium用に環境作成
mkvirtualenv appium
# ライブラリ導入
pip install Appium-Python-Client
pip install pytest

これでひと通りシステムの前準備が完了しました。

Appiumからテストを実行してみる

実機をUSBでつないだ状態で

appium &

とするとサーバーが立ち上がるのでそのままにしておきます。

実機設定

設定 > デベロッパ > Enable UI Automation

iOS8.0からなのかよく分からないですが、実機でこの設定をONにしてあげないとPCから操作できないみたいです。テスト実行前にこの設定を有効化しておきましょう。

テスト実行

# coding: utf-8

from __future__ import absolute_import, division, print_function

import unittest
import os
from random import randint
from appium import webdriver
from time import sleep

class SimpleIOSTests(unittest.TestCase):

    def setUp(self):
        self.driver = webdriver.Remote(
            command_executor='http://127.0.0.1:4723/wd/hub',
            desired_capabilities={
                'app': '【アプリのbundle-Id】',
                'udid': '【実機のUDID】',
                'platformName': 'iOS',
                'platformVersion': '8.1',
                'deviceName': 'iPod touch'
            })

    def tearDown(self):
        self.driver.quit()

    def test_scroll(self):
        # 画面をスクロールして待機
        self.driver.swipe(start_x=0, start_y=0.6, end_x=0, end_y=0.2, duration=800)
        sleep(1)


if __name__ == '__main__':
    suite = unittest.TestLoader().loadTestsFromTestCase(SimpleIOSTests)
    unittest.TextTestRunner(verbosity=2).run(suite)

テスト用にこんな感じのスクリプトを用意しておきます。テストしたアプリがTableViewのアプリだったのでとりあえず下にスクロールするだけのテストコードです。アプリのBundle-IDと実機のUDIDは実際の環境に合わせて書き換えて下さい。

python functional_test.py

そして、今作ったファイル(functional_test.py)を実行するとテストが始まります。上手くセットアップ出来ていれば、ホームなどの画面からアプリが自動で立ち上がりテストしてくれます。このケースでは、アプリ起動完了後、画面がほんのちょっとスクロールし、アプリが終了してテストが終わります。

今色々試しているところですが、画面上のViewを取得したりも出来るので、表示内容があっているかや、ちゃんとジェスチャーに反応するかといったテストが書けるみたいです。

リリース前のテストなどを一部自動化できるのでこのAppiumはかなり便利です。ただ欠点としては実行が遅く時間が掛かってしまいます。要素を取得したり操作するのに都度通信をする必要があるみたいで、マッチする要素を順番に探すみたいなことをすると次のアクションが起こるまで結構待たされます。この辺は書き方等工夫するなりして対策が必要そうです。

アプリが勝手に動くのを見てるだけでもなかなか面白いので、是非Appium活用してみてください。