①Appiumを使ってみた【iOS編】


あわせて読みたい:
[②Appium＋JUnitで自動テストを書いてみた【iOS編】](http://qiita.com/kzm7/items/187ef263b6ac3ba7b3bd)
[③Appiumでどこまで出来るか試してみた【iOS編】](http://qiita.com/kzm7/items/85c31bda0fbe5f90a5b2)
[④AppiumでWebアプリのテストを実機で実行する【iOS編】](http://qiita.com/kzm7/private/1701a944784df76a9315)


# 1. はじめに
先日、モバイルアプリのUIテスト自動化ツール **Appium** のバージョン1.0がリリースされました。
これを機に、実際の開発現場で導入を検討している方も多いのではないでしょうか。

今回は、備忘録も兼ねて **Appiumの環境構築 〜 サンプルコードの実行** までの手順を記述したいと思います。
　
　
# 2. 使用環境

## PC
| ソフトウェア | バージョン                   |
| ---------- | -------------------------- |
| OS         | Mavericks (OSX 10.9.2) |
| XCode      | 5.1.1                      |
| Appium     | 1.0                        |


## 実機
| 端末        | バージョン  |
| ---------- | --------- |
| iPhone 5s  | iOS 7.1.1 |

　
# 3. 環境準備
## インストール
**1. node.jsをインストールする**

ターミナルで以下のコマンドを実行します。

```
brew install node
``` 

または[公式サイト](http://nodejs.org/)からpkgファイルをダウンロードしてインストールします。
　
**2. Appiumをインストールする**

ターミナルで以下のコマンドを実行します。

```
npm install -g appium
```

※インストールに失敗する場合は、以下のコマンドを実行して`/usr/local`ディレクトリに書き込み権限を付与してから、再度インストールしてみてください。

```
sudo chmod -R a+w /usr/local
```

※Appium自体を`sudo`権限でインストールしてしまうと、起動の度に`sudo`権限が必要になる(？)ようです。
　
**3. Appium Client(WebDriver) をインストールする**

ターミナルで以下のコマンドを実行します。

```
npm install wd
```
　
**4. 関連モジュールをインストールする**

以下のモジュールは直接Appiumとは関係ありませんが、後述のサンプルコード内で使用しているためインストールしておきます。

```
npm install chai
npm install chai-as-promised
npm install colors
```
　
**5. 診断ツールを実行する**

ターミナルで以下のコマンドを実行し、Appiumに必要なツール類が正しくインストールされたことを確認します。

```
appium-doctor --ios
```
コマンド実行後、`iOS Checks were successful.`と表示されればOKです。

　
## 設定
**・AppiumからiOS Simulatorの使用を許可する**

ターミナルで以下のコマンドを実行します。

```
sudo authorize_ios
```

　
## サンプルコードの取得
**・GitHubからサンプルコードを取得する**

あらかじめ任意の作業ディレクトリに移動しておきます。

```
cd <ディレクトリ名>
```

続いて以下のコマンドを実行し、GitHubからファイルを取得します。

```
git clone git@github.com:appium/sample-code.git
```

または直接[GitHub](https://github.com/appium/sample-code)からZIPファイルをダウンロードしてきても構いません。
　
さて、これでAppiumを使用する準備が整いました。
続いて、サンプルコードを使用して自動テストを実行してみます。
　
　
# 4. テストコードを実行する（ネイティブアプリ）

## Appiumの起動

**・起動する**

以下のコマンドを実行してAppiumを起動します。

```
appium &
```

コマンド実行後に、以下のメッセージが表示されれば準備OKです。

```
info: Welcome to Appium v1.0.0 (REV f0a00fab2335fa88cb355ab4dc43a9cd3f3236c0)
info: Appium REST http interface listener started on 0.0.0.0:4723
info: socket.io started
```
　
なお、Appiumには様々な起動オプションが用意されています。
下記にその一部を記載します。詳しくは[公式ドキュメント(英語)](http://appium.io/slate/en/master/#server-flags)を参照ください。

| フラグ           | デフォルト値 | 説明                                 | 例                          |
|-----------------|--------|-------------------------------------|-----------------------------|
| `--app`         | null   | .appファイルの絶対パスまたはアプリのBundleIDを指定 | `--app /abs/path/to/my.app` |
| `--ipa`         | null   | .ipaファイルの絶対パスを指定 | `--ipa /abs/path/to/my.ipa` |
| `-q` `--quiet` | false | 詳細ログを出力しない |  |
| `-U` `--udid` | null | 実機でテストする場合のUDID | `--udid 1adsf-sdfas-asdf-123sdf` |
| `-r --backend-retries` | 3 | 処理がタイムアウトした時にリトライする回数 | `--backend-retries 3` |
| `--no-reset ` | false | テスト終了時にシミュレータを初期化しない |  |
| `-g` `--log` | null | ログをファイルに出力する | `--log /path/to/appium.log` |
| `--log-timestamp` | false | ログにタイムスタンプを表示する |  |

　
**・終了する**

Appiumは終了するには、以下のコマンドを実行してnodeプロセスをキルします。

```
killall -9 node
```
　
## テストの実行

今回は **JavaScript** で書かれたシンプルなテストコードを実行してみます。
　
あらかじめカレントディレクトリをサンプルコードがあるフォルダに移動しておきます。

```
cd appium/sample-code/examples/node/
```

続いて、以下のコマンドを実行しテストを実行します。

```
node ios-wd-raw.js
```
　
コマンドを実行すると、iOS Simulatorが起動してテストが実行されます。
使用されるアプリは、テストコード内の`app:`に記述されたURLから自動的にダウンロードされるため、事前にインストールしておく必要はありません。

```js:ios-wd-raw.js
var desired = {
    'appium-version': '1.0',
    platformName: 'iOS',
    platformVersion: '7.1',
    deviceName: 'iPhone Simulator',
    app: "http://appium.s3.amazonaws.com/TestApp6.0.app.zip",
    'device-orientation': 'portrait',
  };
```
　
もし、あらかじめインストールしてあるアプリを使用したい場合は、`app:`にBundleIDを記述します。

```js:ios-wd-raw.js
app: "io.appium.TestApp"
```

なおその場合は、テスト終了後にシミュレータが初期化されないように`--no-reset`フラグを指定してAppiumを起動する必要があります。

```
appium --no-reset &
```
　
# 5. 実機でテストを実行する

次は、実機（iPhone5s）を使用してテストを実行してみたいと思います。
　
**1. 実機にアプリをインストール**

実機でテストする場合は、あらかじめアプリを実機にインストールしておく必要があります。
なお、Appiumで使用できる.ipaファイルは、Developmentプロファイルで署名されたものに限られるので注意が必要です。

**Appiumで使用可能なプロビジョニングプロファイルの種類**

| 種類         | 主な用途           | Appium使用可否 |
|-------------|-------------------|---------------|
| Development | 開発用             | ○             |
| Ad Hoc      | テスト用            | ×            |
| App Store   | App Storeリリース用 | ×             |
| Enterprise  | 企業の社内配布用     | ×             |

　
サンプルコードに同梱されているテストアプリのソースをビルドして実機にインストールします。

以下はXcodeのGUI上からビルドを行う手順です。

1. MacにiPhoneを接続します。

1. アプリのプロジェクトをXcodeで開きます。
`/appium/sample-code/apps/TestApp/TestApp.xcodeproj`

1. Xcode画面上部のビルドターゲットで、接続したiPhoneを選択します。

1. メニューの`Product` -> `Run`を実行し、アプリをビルド＆インストールします。

　
**2. 実機で動作するようにテストコードを一部修正**

テストコードを以下のように変更します。

- `app:`の値をURLからアプリのBundleIDに変更

- `udid:`を追加し、使用する実機のUDIDを記述

```js:ios-wd-raw.js【修正後】
var desired = {
    'appium-version': '1.0',
    platformName: 'iOS',
    platformVersion: '7.1',
    deviceName: 'iPhone Simulator',
    app: "io.appium.TestApp",
    udid:'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx', 
    'device-orientation': 'portrait',
  };
```

なおこれらの値は、直接テストコード内に記述する以外にAppium起動時のフラグでも同様の設定を行うことができます。

　
**3. テストコードを実行**

テストの実行方法はシミュレータの時と同じです。
以下のコマンドを実行し、テストを実行します。

```
node ios-wd-raw.js
```

iPhone上でアプリが自動的に立ち上がり、テストが実行されれば成功です。