お仕事でAndroid,iOSのE2Eテストをやる必要があったのと、appium 2.0が試せる状態だったので、このたび環境を構築してみたメモです

Appium 2.0?

モバイルアプリ用テスト自動化ツール「Appium 2.0」まもなく登場。ドライバーの分離、プラグインによる拡張対応など、新機能を開発者Jonathan Lipps氏が解説 - Publickey

現在のところ、 2.0正式版はまだ公開されておらず、テスト版になりますが、 npm install -g appium@nextで簡単に導入出来るようなので、使ってみました

構成

雑いですがアーキテクチャはこのような感じです

001

  • Windows,Mac,Linuxは、それぞれ別のマシン(3台)を使用していますが、appiumとDockerは特に同居していても問題ないと思います
  • Windows,Macは、ポート 4723をListenするため、ポートを占有しないようにしておく必要があります
  • MacでもAndroid Studioは動作するため、WindowsはMacでも代用出来ると思います(たぶん)
  • Robotframeworkを実行しているLinuxは、自分がWSL2を使用しているだけなので特に理由はありません
  • 当記事ではRobotframeworkのテストコード書き方については触れません(Appiumでテスト環境を構築する事が本題)

1.Windows上にAndroid StudioをインストールしてAndroidエミュレータを起動

この章では、以下の手順でAndroidエミュレータを起動するまでの手順をまとめます。(必要無い場合は次の章へ)

  1. Android Studioをインストール
  2. JDK8をインストール
  3. 環境変数を設定
  4. AVD Managerを使用してAndroidエミュレータを作成&起動

1.Android Studioをインストール

Android Studio のインストール | Android Developers

上記、公式の記事通りで特に特筆すべき事は無いです

2.JDK8をインストール

Java SE Development Kit 8 - Downloads | Oracle 日本

上記より、 jdk-8u301-windows-x64.exeみたいなのをダウンロードしてインストールします

3.環境変数を設定

Android Studio、Java、それぞれの環境変数を設定します

Name Value
ANDROID_HOME Android SDKのPath(例: C:\Users\username\AppData\Local\Android\Sdk
JAVA_HOME JDKのPath(例: C:\Program Files\Java\jre1.8.0_31

Android SDKのPathは、初見ではわかりづらかったですが、 Android StudioをインストールしたPathではありません。
以下の通り、Android Studioの Settingsから確認出来ます

002

そして、環境変数 Pathに、以下の2行を追加します

Value
%ANDROID_HOME%platform-tools
%JAVA_HOME%bin

4.AVD Managerを使用してAndroidエミュレータを作成

以下の手順で、Androidエミュレータを作成します

作成が完了したら、再生ボタンのようなアイコンを押すとエミュレータが起動します

003

補足:エミュレータ内でPlay Storeを使用したい場合

端末選択時に、「Play Store」列にアイコンがある端末を使用します

004

もしくは、特定バージョンのChromeを入れたいとか、直接導入したいapkがある場合には、試していませんが以下のサイトのように別途導入したりできるようです

Android Virtual DeviceでChromeを使えるようにする方法 | ハックノート

2.Mac上にXCodeをインストールしてiOSエミュレータを起動

この章では、以下の手順でiOSエミュレータを起動するまでの手順をまとめます。(必要無い場合は次の章へ)

  1. XCodeをインストール
  2. JDK8をインストール
  3. iOSエミュレータを起動

1.XCodeをインストール

あまり覚えていないのですが、たしかApp Storeで XCodeと検索してインストールした覚えがあります(かなり古いMacを使用しているのですみません)

2.JDK8をインストール

Java SE Development Kit 8 - Downloads | Oracle 日本

上記より、 jdk-8u301-macosx-x64.dmgみたいなのをダウンロードしてインストールします

3.iOSエミュレータを起動

XCodeを起動し、メニューから、 Open Developer ToolSimulatorと選ぶと、Macの画面上にiPhoneが表示されます
(Androidと違い、手順も少なく公式なので安心感がありますね)

3. appium: インストール

インストールは npmで行います。(各環境でのnpm実行環境の構築については本記事では割愛します)

Windowsは PowerShell、Macは iTerm2で作業しています

1
2
3
4
5
6
// Windows,Macで実行
$ npm install -g appium@next

// バージョン確認
$ appium -v
2.0.0-beta13

4. appium: ドライバのインストール

AndroidはUIAutomator、iOSはXCUITestを使用するため、Appiumのドライバをインストールします

1
2
3
4
5
6
7
8
9
10
11
12
13
14
// ドライバの一覧を表示
$ appium driver list
- Listing available drivers
- xcuitest [not installed]
- uiautomator2 [not installed]
- youiengine [not installed]
- windows [not installed]
- mac [not installed]
- mac2 [not installed]
- espresso [not installed]
- tizen [not installed]
- flutter [not installed]
- safari [not installed]
- gecko [not installed]

Windowsは uiautomator2、Macは xcuitestをインストールします

1
2
3
4
5
// ドライバのインストール(Windows)
> appium driver install uiautomator2

// ドライバのインストール(Mac)
$ appium driver install xcuitest

5. appium: サーバを起動

appium serverコマンド(or appium)を使用してappiumサーバを起動します。appiumサーバは、Windows,Macそれぞれの 4723ポートでテストの待ち受けを行います

Windows(Android)の方は、chromedriverを自動でダウンロードするように、 --allow-insecure chromedriver_autodownloadオプションを指定しています

1
2
3
4
5
// appiumサーバを起動(Windows)
> appium --base-path /wd/hub --allow-insecure chromedriver_autodownload

// appiumサーバ起動(Mac)
$ appium --base-path /wd/hub

起動がうまくいけば、こんな感じで待ち受けが始まります

1
2
3
4
5
6
7
8
9
10
11
// 例: Mac
$ appium server --base-path /wd/hub
[Appium] Welcome to Appium v2.0.0-beta.13
[Appium] Non-default server args:
[Appium] basePath: /wd/hub
[Appium] tmpDir: /var/folders/1g/zp2praq97qa6c8q2hqq34lx80000gn/T
[Appium] Attempting to load driver xcuitest...
[Appium] Appium REST http interface listener started on 0.0.0.0:4723
[Appium] Available drivers:
[Appium] - xcuitest@3.52.0 (automationName 'XCUITest')
[Appium] No plugins have been installed. Use the "appium plugin" command to install the one(s) you want to use.

6. テストを実行(Python)

Robotframeworkで実行する前に、試しに簡単なスクリプトを書いて Androidでのテストを実行してみます

platformVersionの所は、作成したAndroidエミュレータに従って置き換えて下さい

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
// Android(Windows)版
$ cat hello.py
import os
import time
from selenium import webdriver
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities

# Setup
appium_host = [WindowsのIPアドレスを入力]

# Capability
capabilities=DesiredCapabilities.CHROME.copy()
capabilities["platformName"] = "Android"
capabilities["platformVersion"] = "10"
capabilities["deviceName"] = "Android Emulator"
capabilities["browserName"] = "Chrome"
capabilities["automationName"] = "UiAutomator2"

# Chrome Options
option = webdriver.ChromeOptions()
option.add_argument("--disable-dev-shm-usage");
option.add_argument("--no-sandbox");
option.add_argument("disable-infobars")

# WebDriver
driver = webdriver.Remote(
options=option,
command_executor="http://"+appium_host+":4723/wd/hub",
desired_capabilities=capabilities)

# Testcase
driver.get("https://example.com")
time.sleep(5)
driver.get("https://yahoo.com")
time.sleep(5)
driver.get("https://google.com")
time.sleep(5)
driver.get("https://apple.com")
time.sleep(5)

# Close
driver.close()
driver.quit()

注:コピペする際にちょっとコード書き換えたので一発で動かないかもしれません、すみません

ちなみに、iOSの場合の capabilitiesは以下のようになります

1
2
3
4
5
6
// iOS(Mac)版
capabilities["platformName"] = "iOS"
capabilities["platformVersion"] = "13.1"
capabilities["deviceName"] = "iPhone 11 Pro Max"
capabilities["browserName"] = "Safari"
capabilities["automationName"] = "XCUITest"

補足: iOSシミュレータでappiumのエラーが出る場合

[Appium]iOSシミュレーターでテストしようとしたら”Could not get Xcode version.”というエラーが表示されたときの対処 - Qiita

上記の記事と同様、 Could not get Xcode versionのエラーが出ました
上記の記事と同様に、以下の2ステップでFIXしました

1
2
3
4
5
6
// XCodeのPATHを確認
$ xcode-select -print-path
[(1)ここにPATHが表示される]

// XCodeのPATH変更
$ sudo xocde-select -switch [(1)で表示されたPATH]

6. テストを実行(Robotframework)

Robotframeworkでは、 AppiumLibraryが公開されています(Github

1
2
// AppiumLibraryのインストール
$ pip install robotframework-appiumlibrary

これを Libraryでインポートして使用します

1
2
3
4
5
6
7
8
9
10
11
// 例:ブラウザを開くキーワード - Android(Windows)版
$ cat keywords/browser.robot
*** Settings ***
Library AppiumLibrary

*** Keywords ***
ブラウザを開く
[Documentation] ブラウザを開いて${ADDRESS}にアクセスする
[Arguments] ${ADDRESS}
Open Application [WindowsのIPアドレス] hoge platformName=Android platformVersion=10 deviceName=Android Emulator browserName=Chrome automationName=UiAutomator2
Go To Url ${ADDRESS}

例えば、SeleniumLibraryで Open Browserを使用している箇所は Open Applicationを使用します

1
2
3
4
5
// Android(Chrome)
Open Application [WindowsのIPアドレス] hoge platformName=Android platformVersion=10 deviceName=Android Emulator browserName=Chrome automationName=UiAutomator2

// iOS(Safari)
Open Application [MacのIPアドレス] hoge platformName=iOS platformVersion=13.1 deviceName=iPhone 11 Pro Max browserName=Safari automationName=XCUITest wdaStartupRetries=4 iosInstallPause=8000 wdaStartupRetryInterval=20000

Androidエミュレータ上にFirefoxやEdgeをインストールして動作させる場合は以下のようになります (エミュレータ上でPlay Storeを使用する手順はこちら→ 補足:エミュレータ内でPlay Storeを使用したい場合

1
2
3
4
5
# Android(Firefox)
Open Application [WindowsのIPアドレス] hoge platformName=Android platformVersion=10 deviceName=Android Emulator automationName=UIAutomator2 appPackage=org.mozilla.firefox appActivity=.App

# Android(Edge)
Open Application [WindowsのIPアドレス] hoge platformName=Android platformVersion=10 deviceName=Android Emulator automationName=UIAutomator2 appPackage=com.microsoft.emmx appActivity=com.microsoft.ruby.Main

その他AppiumLibraryの例としては、 Portraitや、Landscapeキーワードを使って端末を回転させたりなど、実機(エミュ)独特のテストシナリオが実現できます

補足: Macでconnect ECONNREFUSEDが出る

iOS(Mac)でテストを実行したところ、 Error: connect ECONNREFUSED 127.0.0.1:8100エラーが出たため、iOS(Mac)では wdaStartupRetries=4 iosInstallPause=8000 wdaStartupRetryInterval=20000を追加しました

以下のIssueを参考にしました

Error: connect ECONNREFUSED 127.0.0.1:8100 · Issue #12094 · appium/appium