開発者ブログ
HTML5資料室 » Appiumを使ったAndroid・iOSでのテスト » Android端末上でテストを行う(コマンドライン)

Android端末上でテストを行う(コマンドライン)

Last modified by msakai on 2016/09/08, 16:26

テスト環境

  • Windows7 x64

環境構築

JDKのインストール

こちらからインストーラーをダウンロードし、実行します。
本稿では執筆時点での最新版であるJDK 8u77(Windows x64)を利用します。
インストールが完了したらコマンドプロンプトからJavaにPATHが通っているか確認します。

>java -version
java version "1.8.0_77"
Java(TM) SE Runtime Environment (build 1.8.0_77-b03)
Java HotSpot(TM) 64-Bit Server VM (build 25.77-b03, mixed mode)

またWindowsの環境変数にJavaの設定を行います。
システムの詳細設定を開き、システム環境変数に以下の値を設定します。

 変数名  値
 JAVA_HOME  C:\Program Files\Java\jdk1.8.0_77
 Path  ;C:\Program Files\Java\jdk1.8.0_77\bin (既存の値に追記)

注意:
Javaの実行ファイルのパス指定に%JAVA_HOME%への参照が含まれていると
Appiumのインストールに失敗する場合があります。

// PATHに%JAVA_HOME%\bin を指定

Error: Command 'jar tf C:\\Path\to\\appium\\node_modules\\appium-selendroid-driver\\node_modules\\appium-selendr
oid-installer\\selendroid\\download\\selendroid-server.jar' errored out: Error: spawn jar ENOENT
    at exports._errnoException (util.js:870:11)
    at Process.ChildProcess._handle.onexit (internal/child_process.js:178:32)
    at onErrorNT (internal/child_process.js:344:16)
    at nextTickCallbackWith2Args (node.js:442:9)
    at process._tickCallback (node.js:356:17)
    at ChildProcess.<anonymous> (lib/teen_process.js:31:14)
    at emitOne (events.js:77:13)
    at ChildProcess.emit (events.js:169:7)
    at Process.ChildProcess._handle.onexit (internal/child_process.js:198:12)
    at onErrorNT (internal/child_process.js:344:16)
    at nextTickCallbackWith2Args (node.js:442:9)
    at process._tickCallback (node.js:356:17)

この場合は、環境変数Pathを絶対パスで指定してください。

Node.jsのインストール

こちらからインストーラーをダウンロードし、実行します。
本稿ではLTSの最新版である 4.4.3 を利用します。
インストールが完了したらコマンドプロンプトからNode.jsにPATHが通っているか確認します。

>node -v
v4.4.3

Gitのインストール

こちらからインストーラーをダウンロードし、実行します。
"Adjusting your PATH environment" という項目では "Use Git from the Windows Command Prompt" を選択します。
インストールが完了したら、GitへPATHが通っているか確認します。

>git --version
git version 2.8.1.windows.1

Android SDKのインストール

ダウンロードと展開

こちらから android-sdk_rXX-windows.zip をダウンロードします。(2016年4月現在のバージョンは r24.4.1 です)
ダウンロードしたzipファイルを解凍し、適当な位置へ移動します。ここでは C:\opt\android へ移動したこととします。

パッケージのインストール

C:\opt\android\SDK Manager.exe を起動し、以下のパッケージをインストールします。

  • Tools
    • Android SDK Tools
    • Android SDK Platform-tools
    • Android SDK Build-tools (番号が最も新しいものを1つ)
  • Android 4.4.2 (API 19)
    • SDK Platform
  • Extras
    • Google USB Driver

プロキシの設定

プロキシ環境下ではSDK Managerが通信に失敗し、SDKのインストールができません。
Tools > Options... からプロキシの設定をする必要があります。

PATHの設定

Android SDKを使用するために、SDKへPATHを通します。
システムの詳細設定を開き、システム環境変数に以下の値を設定します。

 変数名  値
 ANDROID_HOME  C:\opt\android
 Path  ;C:\opt\android\platform-tools (既存の値に追記)

Appiumのインストール

次のコマンドを実行し、Appiumをインストールします。

>npm install -g appium appium-doctor
>appium -v
1.5.1

プロキシを設定する

プロキシ環境下ではnpmがネットワーク接続ができずAppiumのインストールに失敗します。
下記の様にnpmにプロキシ設定を行います。
なおプロキシのURLを http://proxy.local:9000/ とします。

npm -g config set proxy http://proxy.local:9000/
npm -g config set https-proxy http://proxy.local:9000/
npm -g config set registry http://registry.npmjs.org/
npm -g config set strict-ssl false

またWindowsの環境変数にプロキシの設定を行います。
システムの詳細設定を開き、システム環境変数に以下の値を設定します。

 変数名  値
 HTTP_PROXY  http://proxy.local:9000/
 HTTPS_PROXY  http://proxy.local:9000/

なお、Selenium Grid と組み合わせてテストを実行する場合、これらの環境変数が原因で
localhostのSelenium Grid Hub に接続できない、または接続できてもテストが動作しないことがあります。
この環境変数はAppiumのインストール時のみ使用しますので、必要がなければその後削除してください。

環境の診断

Appiumをインストールしたら、Appiumが動作できる環境であるかどうかを appium-doctor を利用して診断します。
Android環境の診断には--android、iOS環境の診断には--iosをオプション設定します。

>appium-doctor --android
info AppiumDoctor ### Diagnostic starting ###
info AppiumDoctor  ✔ ANDROID_HOME is set to: C:\opt\android
info AppiumDoctor  ✔ JAVA_HOME is set to: C:\Program Files\Java\jdk1.8.0_77
info AppiumDoctor  ✔ adb exists at: C:\opt\android\platform-tools\adb.exe
info AppiumDoctor  ✔ android exists at: C:\opt\android\tools\android.bat
info AppiumDoctor  ✔ emulator exists at: C:\opt\android\tools\emulator.exe
info AppiumDoctor ### Diagnostic completed, no fix needed. ###
info AppiumDoctor
info AppiumDoctor Everything looks good, bye!
info AppiumDoctor

Android端末の接続

USBデバッグの有効化

Appiumを通じてAndroid端末でテストを実行するには、実行する端末でUSBデバッグを有効にする必要があります。

Android 4.2以降の端末では開発者オプションが非表示にされています。
設定から端末情報を開き、ビルド番号を連打することで表示することができます。

端末の接続と認識

Android端末をPCに接続します。(※USBドライバーを別途インストールする必要がある場合があります。)
コマンドプロンプトから次のコマンドを実行し、端末が認識されていることを確認します。

>adb devices
List of devices attached
<端末のID>       device

なおAndroid 4.2以降は初回接続時にデバッグ認証が要求され、「unauthorized」と表示されます。
端末に表示されている認証ダイアログから接続先PCを承認してください。

Appium起動・テスト(Android4.1以前)

nodeConfig.jsonファイルの用意

任意のフォルダに、次のような内容でnodeConfig.json(Selenium GridにAppiumサーバを登録するための設定を記載するファイル)を作成する。

{
 "capabilities": [
    {
     "platform": "ANDROID",
     "browserName": "android",
     "version": "2.3.6 Galaxy S2",
     "platformName": "Android",
     "deviceName": "Galaxy S2",
     "platformVersion": "2.3.6",
     "maxInstances": 1,
     "seleniumProtocol": "WebDriver"
    }
  ],
 "configuration": {
   "cleanUpCycle": 2000,
   "timeout": 30000,
   "proxy": "org.openqa.grid.selenium.proxy.DefaultRemoteProxy",
   "url": "http://127.0.0.1:4723/wd/hub",
   "host": "127.0.0.1",
   "port": 4723,
   "maxSession": 1,
   "register": true,
   "registerCycle": 5000,
   "hubPort": 4444,
   "hubHost": "localhost"
  }
}

●項目の説明

 項目名  説明
 platform  テストを実行する端末のOS。Android端末でのテストの場合 "ANDROID"。
 browserName  テスト対象のブラウザ名。 "android" 固定。
 version  端末を区別するためのバージョン名。
 任意の値だが、AndroidのOSバージョン+デバイス名とすると複数端末でのテスト実行時に区別することが出来る。
 platformName  テストを実行する端末のOS。 Android, iOS, FirefoxOS。
 platformVersion  端末のOSのバージョン。
 deviceName  端末の種類。 ex) Xperia Z3, Galaxy S4
 url  Appiumサーバのアドレス。
 host  「url」のホスト部。
 port  「url」のポート。
 hubPort  Hubの起動しているポート。
 hubHost  Hubの起動しているサーバのホスト。

WebViewテスト用アプリのダウンロード

http://search.maven.org/#search|ga|1|selendroid から、android-driver-app.apk をダウンロードし、任意の場所に解凍する。

※ テストライブラリを使用する場合は、mod版をご使用ください ⇒ mod版のダウンロード

Appiumの起動

次のコマンドを実行し、Appiumサーバを起動する。

appium  --nodeconfig C:\Users\user\Documents\selenium\nodeConfig.json ^
  --selendroid-port 9515 ^
  --app C:\Users\user\Documents\selenium\android-driver-app.apk ^
  --platform-version 19 ^
  --app-pkg io.selendroid.androiddriver ^
  --app-activity io.selendroid.androiddriver.WebViewActivity ^
  --session-override

●オプションの説明

 設定名  詳細 
 nodeconfig  nodeConfig.jsonファイルへのフルパス。
 selendroid-port  selendroidと通信するポート。デフォルトは8080のため、他のアプリケーションで使用中の場合は衝突しないよう設定する。
 app  android-driver-app.apkファイルへのフルパス。
 platform-version  利用するAndroid SDKのバージョン。「Android SDKのインストール」でインストールしたものを指定する。
 app-pkg  アプリのパッケージ名。
 Webテスト用のアプリを使用するため、 "io.selendroid.androiddriver" を設定する。
 app-activity  起動するアクティビティ名。
 Webテスト用のアプリを使用するため、 "io.selendroid.androiddriver.WebViewActivity" を設定する。
 session-override  テスト実行時に前のテストセッションが残っていても新しいテストを開始するフラグ設定。

以上で、AppiumがNodeサーバとして起動し、Selenium Gridに登録される。

テストの実行

次のCapabilityを指定してテストを実行する。

{
 "platform": "ANDROID",
 "browserName": "android",
 "version": "2.3.6 Galaxy S2",
 "model": "SC-03D",
 "deviceName": "Galaxy S2",
 "platformVersion": "10",
 "platformName": "Android",
 "automationName": "Selendroid",
 "autoWebview": true
}

以下の点に注意すること。

  • "platform"、"browserName"、"version" はAppiumを起動するときに設定したnodeConfig.jsonと同一の値を指定する。
  • "automationName" には必ず "Selendroid" を指定する。
  • "autoWebview" に true を設定する。

テストに失敗する場合

テスト実行に失敗する場合でかつAppiumの実行ログに INSTRUMENTATION_FAILED と表示されていた場合、
以下のファイル、ディレクトリを削除することで解消される場合がある。

  • C:\Users\{ユーザー名}\AppData\Local\Temp\selendroid.io.selendroid.androiddriver.apk
  • C:\Users\{ユーザー名}\AppData\Local\Temp\io.selendroid.androiddriver

Appium起動・テスト(Android4.2以降)

※現在chromeのみ動作確認済

nodeConfig.jsonファイルの用意

任意のフォルダに、次のような内容でnodeConfig.json(Selenium GridにAppiumサーバを登録するための設定を記載するファイル)を作成する。

{
 "capabilities": [
    {
     "platform": "ANDROID",
     "browserName": "chrome",
     "version": "4.4.4 Xperia Z3",
     "platformName": "Android",
     "platformVersion": "19",
     "deviceName": "Xperia Z3",
     "maxInstances": 1,
     "seleniumProtocol": "WebDriver"
    }
  ],
 "configuration": {
   "cleanUpCycle": 2000,
   "timeout": 30000,
   "proxy": "org.openqa.grid.selenium.proxy.DefaultRemoteProxy",
   "url": "http://127.0.0.1:4723/wd/hub",
   "host": "127.0.0.1",
   "port": 4723,
   "maxSession": 1,
   "register": true,
   "registerCycle": 5000,
   "hubPort": 4444,
   "hubHost": "localhost"
  }
}

●項目の説明

 項目名  説明
 platform  テストを実行する端末のOS。Android端末でのテストの場合 "ANDROID"。
 browserName  テスト対象のブラウザ名。 "chrome" 固定。
 version  端末を区別するためのバージョン名。
 任意の値だが、AndroidのOSバージョン+デバイス名とすると複数端末でのテスト実行時に区別することが出来る。
 platformName  テストを実行する端末のOS。 Android, iOS, FirefoxOS。
 platformVersion  端末のOSのバージョン。
 deviceName  端末の種類。 ex) Xperia Z3, Galaxy S4
 url  Appiumサーバのアドレス。
 host  「url」のホスト部。
 port  「url」のポート。
 hubPort  Hubの起動しているポート。
 hubHost  Hubの起動しているサーバのホスト。

Appiumの起動

次のコマンドを実行し、Appiumサーバを起動する。

 appium --nodeconfig C:\Users\user\Documents\selenium\nodeConfig.json --session-override

●オプションの説明

 項目名  説明
 nodeconfig  nodeConfig.jsonファイルへのフルパス。
 session-override  テスト実行時に前のテストセッションが残っていても新しいテストを開始するフラグ設定。

以上で、AppiumがNodeサーバとして起動し、Selenium Gridに登録される。

テストの実行

次のCapabilityを指定してテストを実行する。

{
 "platform": "ANDROID",
 "browserName": "chrome",
 "version": "4.4.4 Xperia Z3",
 "platformVersion": "19",
 "platformName": "Android",
 "deviceName": "Xperia Z3"
}

Appiumを利用したテストの並列実行

Appium 1.4以降を利用するとホストとなるWindows PC 1台の上で、複数のAppiumを同時に実行することが出来る。
複数のAppiumインスタンスを同時に起動することで実機、エミュレーター問わず複数のAndroidを同時にテストすることが可能となる。
その際は以下の起動パラメーターを付加してインスタンスを起動する。

 パラメーター名  説明
 -p  AppiumがSelenium Gridからの通信を受け取るポート番号。
 nodeconfig.jsonのurlまたはportで指定したポート番号。
 -bp  Appiumの実行ポート番号。
default-capabilities  DesiredCapabilitiesのデフォルト値。
 --chromedriver-port  ChromeDriverが利用するポート番号。
 Android 4.2以上のデバイスでテストするときに設定する。
 --selendroid-port  Selendroidが利用するポート番号。
 Android 4.1以下のデバイスでテストするときに設定する。

※p、bp、chromedriver-port(selendroid-port)の3つはAppiumインスタンス毎に違う値を必ず設定すること。

Android 4.1以前の設定サンプル

nodeconfig_galaxy_s2.json

{
 "capabilities": [
    {
     "platform": "ANDROID",
     "browserName": "android",
     "version": "2.3.6 Galaxy S2",
     "platformName": "Android",
     "platformVersion": 10,
     "deviceName": "Galaxy S2",
     "maxInstances": 1,
     "seleniumProtocol": "WebDriver"
    }
  ],
 "configuration": {
   "cleanUpCycle": 2000,
   "timeout": 30000,
   "proxy": "org.openqa.grid.selenium.proxy.DefaultRemoteProxy",
   "url": "http://127.0.0.1:4492/wd/hub",
   "host": "127.0.0.1",
   "port": 4492,
   "maxSession": 1,
   "register": true,
   "registerCycle": 5000,
   "hubPort": 4444,
   "hubHost": "127.0.0.1"
  }
}

起動コマンド

appium --nodeconfig C:\Users\user\selenium\nodeconfig_galaxy_s2.json ^
  --app C:\Users\user\selenium\android-driver-app.apk ^
  --session-override ^
  --selendroid-port 9915 ^
  -p 4492 ^
  -bp 2251 ^
  --default-capabilities "{\"udid\":\"デバイスID\"}"

テスト時に指定するcapabilities

{
 "platform": "ANDROID",
 "browserName": "android",
 "version": "2.3.6 Galaxy S2",
 "model": "SC-03D",
 "deviceName": "Galaxy S2",
 "platformVersion": "10",
 "platformName": "Android",
 "automationName": "Selendroid",
 "autoWebview": true
}

Android 4.2以降の設定サンプル

nodeconfig_nexus_5.json

{
 "capabilities": [
    {
     "platform": "ANDROID",
     "browserName": "chrome",
     "version": "5.1 Nexus5",
     "platformName": "Android",
     "platformVersion": "5.1",
     "deviceName": "Nexus5",
     "maxInstances": 1,
     "seleniumProtocol": "WebDriver"
    }
  ],
 "configuration": {
   "cleanUpCycle": 2000,
   "timeout": 30000,
   "proxy": "org.openqa.grid.selenium.proxy.DefaultRemoteProxy",
   "url": "http://127.0.0.1:4723/wd/hub",
   "host": "127.0.0.1",
   "port": 4723,
   "maxSession": 1,
   "register": true,
   "registerCycle": 5000,
   "hubPort": 4444,
   "hubHost": "127.0.0.1"
  }
}

起動コマンド

appium --nodeconfig C:\Users\user\selenium\nodeconfig_nexus_5.json ^
  --session-override ^
  --chromedriver-port 9916 ^
  -p 4493 ^
  -bp 2252 ^
  --default-capabilities "{\"udid\":\"デバイスID\"}"

テスト時に指定するcapabilities

{
 "platform": "ANDROID",
 "browserName": "chrome",
 "version": "5.1 Nexus 5",
 "deviceName": "Nexus 5",
 "platformVersion": "22",
 "platformName": "Android"
}

Copyright (C) 2012-2017 NS Solutions Corporation, All Rights Reserved.