AirtestでUIテストしてみた

# はじめに
業務でAirtestを導入したいという要望を受けひとまずテストを行うところまで試してみたので、導入手順などをまとめたいと思います。

# 使用したバージョン
Airtest IDE 1.0.1
Poco-SDK versionCode 4
Unity 2018.2.14f1

# インストール
[公式サイト](https://airtest.netease.com/index.html)のダウンロードボタンからZipファイルをダウンロードします。

![official-site.jpg](https://qiita-image-store.s3.amazonaws.com/0/111339/b448cc33-14a0-048a-7a83-105cc54193ab.jpeg)

任意の場所にZipファイルを解凍します。
解凍されたフォルダ内のAirtestIDE.exeが実行するアプリケーションとなります。

# 初回起動
初回起動時にアカウント認証ウィンドウが表示されます。
Skipボタンがあるので、Skipします。
次回起動以降はアカウント認証ウィンドウが表示されない状態になります。
（ある程度の期間が経つとアカウント認証ウィンドウが再度表示されるかもしれません。）

![account-authentication.jpg](https://qiita-image-store.s3.amazonaws.com/0/111339/9aecac40-95ac-81bb-4eb3-d468c8725de5.jpeg)

アカウント認証ウィンドウをスキップするとAirtest IDEが起動します。

![airtest-ide.jpg](https://qiita-image-store.s3.amazonaws.com/0/111339/7dee9217-66c9-3010-fdbd-6d627fd70553.jpeg)

# Poco SDKの導入
Airtest IDEだけで画像認識のUIテストを作成することができます。
[【Unity】「Airtest IDE」を使用して Android のゲームで画像認識による UI の自動テストを試してみた - コガネブログ](http://baba-s.hatenablog.com/entry/2018/10/02/090000)
しかし、一つのUIテストを複数のPCで利用できるようにすることが難しいため、アプリ内のオブジェクトを直接操作できるようにできる`Poco SDK`を導入します。

[PocoSDKのリポジトリ](https://github.com/AirtestProject/Poco-SDK)からPoco SDKのZipファイルをダウンロードします。

任意の場所にZipファイルを解凍します。
内部の`Unity3D`フォルダをUnityプロジェクト内にコピーします。

![airtest-unity3d.jpg](https://qiita-image-store.s3.amazonaws.com/0/111339/4531d58a-1333-2f53-641e-fed48ce6673a.jpeg)
![unity-unity3d.jpg](https://qiita-image-store.s3.amazonaws.com/0/111339/19b1dc09-7972-1b93-f4cd-f30a6da4a354.jpeg)

エラーが発生していると思いますので、以下のどちらかの対応をします。

- uGUIを利用している場合は`Unity3D/ngui`フォルダを削除
- NGUIを利用している場合は`Unity3D/ugui`フォルダを削除

空のGameObjectを作成し、`PocoManager`をアタッチします。
（実行時に`DontDestroyOnLoad(this)`が呼ばれるようになっています。）

# テストの新規作成
以下の画面のテストを作成してみたいと思います。

![title-scene.jpg](https://qiita-image-store.s3.amazonaws.com/0/111339/960bc4a4-0801-acd0-c450-1fa1af14dbfa.jpeg)
![outgame-scene.jpg](https://qiita-image-store.s3.amazonaws.com/0/111339/8f4afbbe-e26b-dad1-2169-e8562942541e.jpeg)
![ingame-scene.jpg](https://qiita-image-store.s3.amazonaws.com/0/111339/9d72693b-91af-21f7-63f9-2f5930d582be.jpeg)

タイトルシーンからアウトゲームに遷移できるかのテストを書きたいと思います。
Airtest IDEを起動し、メニューバーの`File > New`もしくは`New Project`からプロジェクトを作成します。
Script Editorウィンドウに表示されているスクリプトをPoco SDKでテストを行うための初期化処理に書き換えます。

```py:GotoOutgame.py
# -*- encoding=utf8 -*-
from poco.drivers.unity3d import UnityPoco                  # Unity用のインポート.

# Windows用の初期化処理.
from poco.drivers.unity3d.device import UnityEditorWindow   # UnityEditor用のインポート.
dev = UnityEditorWindow()                                   # デバイスにUnityEditorを指定.
addr = ('', 5001)                                           # 接続先のIPアドレスを指定.
poco = UnityPoco(addr, device=dev)                          # Unity用のPocoを生成.
```

これでテスト実行時にUnityのHierarchy上のオブジェクトにアクセスすることができるようになります。
ここからUnityのHierarchy上のオブジェクトにアクセスするテストを書いていきます。

1. Airtest IDEのDevicesウィンドウで`Windows App Connection > Search Window`からUnityEditorに接続します。   
2. 取り込んだUnityEditorでPlayボタンを押し、実行している状態にします。
3. Airtest IDEのPoco Assistantウィンドウで`Stop`となっているプルダウンメニューから`Unity`を選択します。
4. Poco AssistantウィンドウにUnityのHierarchyのようなものが表示されます。
5. Poco Assistantウィンドウのオブジェクトをダブルクリックか右クリックメニューから`UI path-code`を選択ことで、スクリプト側にオブジェクトを取得するスクリプトが追加されます。

上記の手順を行った後、作成したスクリプトが以下になります。

```py:GotoOutgame.py
# ～さっき作成した初期化処理～

# テスト実行.
import time                         # 処理を止めるメソッド用のインポート.
poco("GotoOutgameButton").click()   # GotoOutgameボタンをクリックする.

time.sleep(1)                       # 画面遷移を待つため1秒間処理を止める.

text = poco("OutgameText")          # Outgameと表示しているテキストオブジェクトを取得.
assert(text.exists())               # テキストが存在しているか確認.
```

# テストの実行
DevicesウィンドウにUnityEditorを接続した状態だとテスト実行時の接続処理に失敗してしまいテストが失敗してしまうため、切断しておく必要があります。
Devicesウィンドウの`Phone Assistant > Disconnect Current Device`を選択すると切断できます。

テストを実行するには、以下の手順を行います。

1. UnityEditorでPlay状態にする。
2. Airtest IDEで`Run Script`ボタンを押します。
3. Airtest IDEのLog Viewerにログが表示されます。

![airtest-result.jpg](https://qiita-image-store.s3.amazonaws.com/0/111339/bc0c73e9-313d-4a40-8bc2-0f161d3e3111.jpeg)

# まとめ
Airtestの導入方法とPoco SDKを利用したテストの作成方法をまとめました。

Poco SDKを利用したテストはあまり実行環境に影響されることなくテストを行うことができました。
画像認識でもテストを作成することはできましたが、他のPCで同じテストを行う際にテストが失敗しやすく安定しませんでした。

Poco SDKを導入するだけだとリリースするアプリにもPoco SDKが含まれてしまいます。
リリース時にはPoco SDKがアプリに含まれないようにする必要がありそうです。

# 参考URL
[公式サイト](https://airtest.netease.com/index.html)
[AirtestIDE — airtest-ide documentation](https://airtest.netease.com/docs/en/index.html)
[PocoSDK Integration Guide — poco 1.0 documentation](https://poco.readthedocs.io/en/latest/source/doc/integration.html)
[PocoSDKのリポジトリ](https://github.com/AirtestProject/Poco-SDK)
[【Unity】「Airtest IDE」を使用して Android のゲームで画像認識による UI の自動テストを試してみた - コガネブログ](http://baba-s.hatenablog.com/entry/2018/10/02/090000)
[【Unity】「Airtest IDE」と「Poco」を使用して Unity で開発中の Android のゲームで UI の自動テストを試してみた - コガネブログ](http://baba-s.hatenablog.com/entry/2018/10/03/090000)