[Robot Framework] Androidモバイルアプリのテスト自動化を構築からスクリプティングまでやってみる Windows環境

# はじめに

Androidモバイルアプリケーションをテスト自動化するとき、よく使うフレームワークとしてAppiumがある。
ただ、Appium + Pythonといったプログラミング言語を用いると、初めての人にとってハードルが高い。
そこで、ある程度簡単に実装できるようにした、キーワード駆動の Robot Frameworkがある。
Robot Frameworkはテストケースを自然言語に近いキーワードを用いて記述するもので、非エンジニアにとっても読みやすく、保守しやすいものになっています。

今回、windows 環境に robot frameworkの環境構築から、モバイルアプリケーションのログイン処理の作成、実行までを初心者でもできるようにドキュメント化した

# セットアップ


## Node.js

appiumのinstallや実行につかうツール。

https://nodejs.org/en/

基本的に最新版をダウンロードし、デフォルトの設定でインストーラーを進めれば、使えるようになる。

最後に動作確認をコマンドプロンプトで行う

```
node -v
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267085/c6a6da01-da44-46f7-f70b-631cc4ab4926.png)

## Java Development Kit (JDK)

Androidの機能を有効にするために、JDKが必要になる。


https://www.oracle.com/java/technologies/downloads/?er=221886

JDKのサイトより、JDK Development Kit windows版のinstaller最新版をダウンロードする
デフォルトの設定でインストーラーを進めれば、使えるようになる。

### 環境変数設定

使うにあたって、環境変数の設定が必要となる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267085/2c826a0d-53e6-7c5d-170b-e3efa2ce0b63.png)

「システム環境変数の編集」を起動し、「環境変数」を選び、追加・編集を行う。

追加する環境変数

| 変数名| 意味 | 例 |
|:-----------|:------------|:------------|
| JAVA_HOME | Java install先 | C:\Program Files\Java\jdk-21|


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267085/b34acaa8-dc3c-435d-97d1-04bd6fbffffe.png)

編集・追加する環境変数

| 変数名| 意味 | 例 |
|:-----------|:------------|:------------|
| Path | 実行パス | %JAVA_HOME%\bin |


最後に動作確認をコマンドプロンプトで行う

```
java -version
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267085/d07c965e-1abf-0df4-c857-f1c803a93b1d.png)


## Android Studio

Androidのアプリケーション操作などを行うために使う。

https://developer.android.com/studio/?hl=ja

Android Studioのサイトより、最新版をダウンロードする
デフォルトの設定でインストーラーを進めれば、使えるようになる。

### パスの取得・設定　（インストール後）

インストールが終わり、Android Studioを起動する。
最初、Android開発のwizardが出てきますが、そのままNextを押し続けて、Studioを起動する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267085/67ce941b-5033-1c42-c9a5-67c56ae45d20.png)


起動後、左上のハンバーガーメニューをクリックすると、ヘッダーメニューが開きます。
そこから、File → Settings を選ぶ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267085/b9d0f729-1050-92c0-7355-e46650fbc9ec.png)メモります

Settingsのモーダルが立ち上がります。
左のメニューから、 Languages&Frameworks -> Android SDK を選ぶと、Android SDK Locationの情報が表示されます。
そのパスを


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267085/8b7b8a92-e39c-46ba-4251-6954702a55af.png)

### 環境変数設定

先ほどと同様に、環境変数設定を行います

追加する環境変数

| 変数名| 意味 | 例 |
|:-----------|:------------|:------------|
| ANDROID_HOME | Android SDK Location | C:\Users\xxx.xxx\AppData\Local\Android\Sdk|

編集・追加する環境変数

| 変数名| 意味 | 例 |
|:-----------|:------------|:------------|
| Path | 実行パス | %ANDROID_HOME%\platform-tools |
| Path | 実行パス | %ANDROID_HOME%\emulator |


環境変数設定後に、コマンドプロンプトを起動し、以下２つのコマンドを実行し、動くことを確認する

```
adb
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267085/83bd92fc-0c26-2923-be98-8ff3ea6c4323.png)


```
emulator
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267085/6ac6b1c6-e163-2a63-f2c0-cfc92dd6d093.png)

## appium

モバイルを操作するツールになります

npmコマンド(node.jsをインストールすると、使えるようになる)を用いてインストールする

```
npm install -g appium
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267085/83c7cc68-bf68-1707-7d88-9d0d6c0890fe.png)

最後に、コマンドプロンプトで以下コマンドを実行し、確認します

```
appium -v
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267085/8604d3bc-7dbb-8a4b-1edf-6dc36c2a9bd6.png)



### driver install

Android を操作するためのdriverをinstallします

https://appium.io/docs/en/2.0/quickstart/uiauto2-driver/

```
appium driver install uiautomator2
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267085/1819d2b6-ad51-87d5-b326-59eae2cb828a.png)

### appium 起動

appiumを常駐させます

コマンドプロンプトで以下コマンドを実行します

```
appium --allow-insecure chromedriver_autodownload
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267085/5c6b7772-2bb4-c6aa-959c-6d5e660f9c0c.png)


## Appium Inspector

モバイルアプリケーションのlocatorを取得するツールになります

https://github.com/appium/appium-inspector/releases

ここから最新のversion 「Appium-Inspector-YYYY.MM.DD-win-x64.exe」をダウントードして、インストールする。

appium inspectorを実行すると、以下のアプリケーションが立ち上がる。（動作確認後、閉じてよいです）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267085/f603613c-fed7-29f4-c7c9-73a8641e9c1f.png)

## Python

Pythonサイトから、Stable Releasesのバージョンをダウンロードする

https://www.python.org/downloads/windows/


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267085/74029cae-e438-dc81-6aba-e0ace7a7a990.png)

「Add python.exe to PATH」のチェックを入れて、どこからでも実行できるようにする。
その後、「Install Now」をクリックし、インストールを完了させる。

任意の場所でコマンドプロンプトを開き、以下コマンドを実施し、動作確認をする

```
python --version
```


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267085/3c7bbc6c-e38a-cb10-96a2-1a12de425574.png)


## robot framework

robotframeworkでWEBアプリケーションのテストを行うライブラリをインストールする

```
pip install robotframework
```

次に、robotコマンドを実行する

```
robot
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267085/e2c03f89-926c-b0f0-32a8-794e088f7b1e.png)


※なお、環境やログインユーザーによって、上記 robotのPATHが正しく通ってなく、動かない可能性がある。
その場合、 pipでインストールしたライブラリが、個人のpython folderにインストールされているからです。
その場合、そのfolderもPATHに追加する必要がある

その時、環境変数のpathに追加するfolderは以下のとおりである。

```
%UserProfile%\AppData\Roaming\Python\Python312\Scripts
```

まず、exploreで対象folderが存在することを確認する。
その後、exploreで開いたパスを環境変数のpathに追加設定する
追加後に、改めてコマンドプロンプトを開き、実行できるかを確認する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267085/fdec04c9-eb67-ce42-036b-16d780fe79da.png)


## robotframework appium library

次に、モバイルアプリのテストを行うライブラリ appium libraryをインストールする

```
pip install robotframework-appiumlibrary
```


# テストデバイスとアプリ

Android Studioのvertual 端末、もしくは実機どちらでも使うことができる。

## 実機を使う場合

以下記事を参考に、端末の設定で、「開発者向けオプション」→「USBデバッグ」を有効にする

https://qiita.com/emurin/items/fe640327f847c474f1e8#android-device%E3%81%AE%E8%A8%AD%E5%AE%9A

## Vertual端末

Android StudioのメニューからTools → Device Manager を選ぶ
Device Managerのメニューより「Add a new device　→　Create Virtual Device」を選ぶ

そこから、任意の端末を選択する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267085/c09d70f1-db1e-2ef3-36d3-79afa26c33bf.png)

※Resolutionが高い端末を選ぶと、メモリ不足により不安定になります


### コマンドプロンプトで起動

Android StudioのDevice Managerから起動することができます。
その場合、メモリを多く消費します。
そのため、Android Studioなしで仮想端末を立ち上げることをおすすめします。

まず、仮想端末のリスを表示する

```
emulator -list-avds
```


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267085/99acfe62-dcae-7168-2b24-2e5e966cb3a0.png)

このように、登録した仮想端末の一覧（Pixel6, Pixel_7_API_35）が表示される

次に、実際に起動するとき一覧のデバイス名を用いて、以下コマンドを実施する

```
emulator -avd  ${端末名}
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267085/a32553bb-97af-56db-8040-4b8abd0e4669.png)

このように、仮想端末のみ立ち上がる。

## Android端末の認識

adbコマンドを使って、Androidの操作、操作できる端末をリストアップする
コマンドプロンプトで以下コマンドを実行する

```
adb devices
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267085/50206dee-7e3d-1c22-e16f-2cdb1fff40ff.png)

このように、端末のUDIDとステータスが表示される。
この例では現在２台のAndroid(仮想端末)が接続されています
device : 利用可能
offline : 利用不可能

状態はこの通りです。

deviceの状態になるように、再接続などを行う必要がある。
実機の場合、先ほどの記事に記載した通り、接続許可設定を行うと、deviceの状態になります。

尚、デバイスを特定する必要があるため、UDIDの情報（ex emulator-5554）をメモっておく必要がある




## テスト自動化練習用デモアプリインストール

以下に、テスト自動化の練習用Androidデモアプリがある
こちらのapkファイルをダウンロードする

https://github.com/valtes-rd/t-dash/releases/tag/AndroidDemo

コマンドプロンプトで以下コマンドを実行して、apkファイルをUDIDで指定した端末にアンドロイドアプリケーションをインストールする

```
adb -s ${端末UDID} install ${apkファイル}
```


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267085/c1dac839-672f-569d-c49f-129c7b6a4c2d.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267085/600450be-a50b-1e9b-d5ab-7b4d5020ec88.png)


# テスト対象

テスト自動化練習デモアプリを用いる。
こちらで、以下ユーザーでログインできることを確認するテストを作成する

| 項目 | 値 |
|:-----------|:------------|
| メールアドレス       | alice@example.com        | 
| パスワード       | password       | 
| 名前 | 山田アリス |


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267085/dd287ba0-a7b1-00c7-ea4b-0d1d6a633f68.png)


https://hotel.testplanisphere.dev/ja/index.html

# ロケーター情報取得 by Appium inspector

Appium inspectorはモバイルアプリのロケーター情報を取得するツールです。
まず、Appium inspectorからモバイルに接続します

接続するときCapabilitiesを知る必要がある。
Capabilitiesは、接続するモバイル・アプリを特定するものです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267085/4bb55116-92bc-7337-4083-f4b71814a8cc.png)

今回、最低限の項目として、以下情報をCapabilitiesと設定し、「Start Session」します。

| 項目 | 意味 | 入力内容|
|:-----------|:------------|:------------|
| platformName       | 接続するプラットフォーム| Android |
| automationName       | appiumのdriver名 | UiAutomator2 |
| udid       |接続する端末のUDID (adbで取得した情報)| emulator-5554 |
| appPackage       | 起動するアプリケーション| com.valtes.demo.login |
| appActivity       |  起動するアプリの画面       | .MainActivity |

Capabilitiesの各項目の詳細はこちら

https://appium.io/docs/en/2.0/guides/caps/


appium inspectorで、モバイルの表示内容がミラーされます。
その情報を選択すると、その要素のxpathなどのlocator情報をとることができます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267085/02a3c170-3ec6-3f14-7e23-b3bc7ddc9f90.png)


# テストコード実装


スクリプトを記述するに用いるキーワードはこちらになります。

https://serhatbolsu.github.io/robotframework-appiumlibrary/AppiumLibrary.html


以下が、今回のテストコードになります（コピーしてそのまま実行できると思います）


```
*** Settings ***
Library  AppiumLibrary

*** Variables ***
${TIME_FOR_STABLE}  2s
${EMAIL}            alice@example.com
${PASSWORD}         password
${USERNAME}         山田アリス

${APPIUM_SERVER}              http://localhost:4723
${AUTOMATION_NAME}            UiAutomator2
${PLATFORM_NAME}              Android
${UDID}                       emulator-5554
${APPPACKAGE}                 com.valtes.demo.login
${APPACTIVITY}                .MainActivity




*** Keywords ***
Open Android APP
  [Documentation]     To open android browser and go to provided URL
  [Arguments]         
  Open Application    ${APPIUM_SERVER}  
    ...    platformName=${PLATFORM_NAME}
    ...    automationName=${AUTOMATION_NAME}
    ...    udid=${UDID}
    ...    appPackage=${APPPACKAGE}
    ...    appActivity=${APPACTIVITY}
    ...    autoAcceptAlerts=false
    ...    autoGrantPermissions=true
    ...    autoWebView=true
    ...    shouldTerminateApp=true
    Sleep  ${TIME_FOR_STABLE}

Close_APP
    Close Application

Capture ScreenShot
	[Arguments]  ${filename}
	Capture Page Screenshot  ${filename}


*** Test Cases ***

SetUp
	Open Android APP

Login Test
	Click Element  //android.widget.ImageView[@content-desc="その他のオプション"]
	Click Element  //android.widget.TextView[@resource-id="com.valtes.demo.login:id/title" and @text="Login"]
	Input Text  //android.widget.EditText[@resource-id="com.valtes.demo.login:id/etEmail"]  alice@example.com
	Input Text  //android.widget.EditText[@resource-id="com.valtes.demo.login:id/etPassword"]  password
	Click Element  //android.widget.Button[@resource-id="com.valtes.demo.login:id/btLogin"]
	Wait Until Element Is Visible  //android.widget.TextView[@resource-id="com.valtes.demo.login:id/tvName"]  10
	Element Text Should Be  //android.widget.TextView[@resource-id="com.valtes.demo.login:id/tvName"]  山田アリス

ScreenShot
	Capture Page Screenshot  screen.png

TearDown
	Close_APP

```


# 実行

```
robot  xxx.robot    <- 実行するrobotのファイル名
```


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267085/34d4462a-9128-63a6-49f5-ab7ef1ee5f3c.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267085/f44a3e7d-049c-461d-6ce9-3357ee6620f1.png)