コガネブログ

平日更新を目標に Unity や C#、Visual Studio、ReSharper などのゲーム開発アレコレを書いていきます

【Unity】「Airtest IDE」と「Poco」を使用して Unity で開発中の Android のゲームで UI の自動テストを試してみた

はじめに

前回、Airtest IDE を使用して Android のゲームで
画像認識による UI の自動テストを行う方法を紹介しました

今回は「Poco」というフレームワークを Unity プロジェクトに導入して、
画像認識ではなく、Hierarchy のオブジェクトを文字列で指定する
UI の自動テストの方法を紹介していきます

検証環境

  • Windows 10
  • Android 7.0
  • Airtest IDE v1.0.0

Airtest IDE の準備

上記の記事の「導入方法」と「Android と接続」を参考にしてください

Poco の導入

下記のページにアクセスして「Clone or download>Download ZIP」を押します

https://github.com/AirtestProject/Poco

そして、ダウンロードした ZIP ファイルを展開して

f:id:baba_s:20181002205812p:plain

展開したフォルダ内の「Unity3D」フォルダを Unity プロジェクトに追加します

f:id:baba_s:20181002205844p:plain

すると、コンパイルエラーが発生するので、

  • uGUI を使用している場合は「ngui」フォルダを削除します
  • NGUI を使用している場合は「ugui」フォルダを削除します

f:id:baba_s:20181002210106p:plain

そして、シーンのカメラに「Poco Manager」をアタッチします

以上で Poco の導入が完了です

テスト用のスクリプトの作成

f:id:baba_s:20181002210620p:plain

例えば、シーンにこのように UI のオブジェクトが配置して、
ボタンが押されたらテキストオブジェクトを非表示にするようにしたとします

そして、Android を Windows に接続して、
Unity から APK をビルドして、ビルドが完了したら

f:id:baba_s:20181002211016p:plain

「Airtest IDE」の「Poco Assistant」のプルダウンメニューから「Unity」を選択します
すると、Unity の Hierarchy と同じ階層が表示されて、
Airtest IDE が Unity からビルドした APK を正しく認識していることがわかります

f:id:baba_s:20181002210726p:plain

# -*- encoding=utf8 -*-
from poco.drivers.unity3d import UnityPoco
poco = UnityPoco()
# StartButton という名前のボタンをクリックします
poco('StartButton').click()

その後、「Script Editor」に上記のようなコードを貼り付けて実行します

f:id:baba_s:20181002211612g:plain

そして、再生ボタンを押すか F5 を押すと、テストが開始され、
ボタンが自動でクリックされることが確認できます

以上が基本的な使い方になります

よく使われる関数

クリックと長押し

# -*- encoding=utf8 -*-
from poco.drivers.unity3d import UnityPoco
poco = UnityPoco()

# basic という名前のオブジェクトをクリックします
poco('basic').click()

# basic と表示されているオブジェクトをクリックします
poco(text='basic').click()

# star_single という名前のオブジェクトを長押しします
poco('star_single').long_click()

# star_single という名前のオブジェクトを5秒間長押しします
poco('star_single').long_click(duration=5)
  • click:クリック
  • long_click:長押し(秒数指定可能)

プロパティの取得や設定

# -*- encoding=utf8 -*-
from poco.drivers.unity3d import UnityPoco
poco = UnityPoco()

# star_single という名前のオブジェクトを取得します
star = poco('star_single')

# star_single という名前のオブジェクトが存在する場合
if star.exists():
    
    # 位置を取得します
    pos = star.get_position()
    
    # pos_input という名前のオブジェクトを取得します
    input_field = poco('pos_input')
    
    # 1秒待機します
    time.sleep(1)
    
    # pos_input という名前のオブジェクトのテキストを設定します
    input_field.set_text('x={:.02f}, y={:.02f}'.format(*pos))
    
    # 3秒待機します
    time.sleep(3)

# title という名前のオブジェクトのテキストを取得します
title = poco('title').get_text()

# 取得したテキストが「Basic test」と等しい場合
if title == 'Basic test':
    
    # btn_back という名前のボタンオブジェクトを取得します
    back = poco('btn_back', type='Button')
    
    # btn_back という名前のボタンオブジェクトをクリックします
    back.click()
  • exists:存在するかどうかを確認
  • get_position:位置を取得
  • set_text:テキストを設定
  • time.sleep:指定した秒数待機
# -*- encoding=utf8 -*-
from poco.drivers.unity3d import UnityPoco
poco = UnityPoco()

# btn_start という名前のオブジェクトを取得します
btn = poco('btn_start')

# テキストを取得してログ出力します
print(btn.get_text())  # => 'Start'

# introduction という名前のオブジェクトを取得します
intro = poco('introduction')

# text プロパティの情報をログ出力します
print(intro.attr('text'))

# type プロパティの情報をログ出力します
print(intro.attr('type'))

# foo-bar という名前の FooBar オブジェクトを取得します
obj = poco('foo-bar', type='FooBar')

# オブジェクトが存在するかどうかをログ出力します
print(obj.exists())
  • attr:指定したプロパティの情報を取得

さいごに

今回は「Airtest IDE」と「Poco」を使用して
Unity で開発中の Android のゲームで UI の自動テストを行う方法を紹介しました

Airtest IDE では画像認識によるテストだけでなく、
このように Poco を使用することで文字列ベースのテストも可能になります

ぜひ今回紹介した方法でもテストを試してみていただければと思います

参考サイト様