はじめに
上記にて紹介されているテスト自動化の実行環境において
テスト用のマシンと単一の端末で運用されているため複数のテストを実行する際に時間がかかるという課題がありました。
そこでiOS,Android複数端末を繋いだ際に、それぞれの端末で同時に並列でテスト実行をできるようにするために必要な処理の検討と実装を行いました。その際に必要だった修正箇所や注意事項等をまとめていきたいと思います。
端末IDの取得
端末が一つの場合は各種処理で省略できていた部分を、端末指定で実行する必要がでてきました。
その際に指定する端末IDの取得方法をまとめます。
Androidの場合
adb devices
を実行すると
$ adb devices
List of devices attached
38241JEHN01076 device
38241JEHN08609 device
この場合38241JEHN01076
の部分が端末IDとなる
iOS端末の場合
$ idevice_id
00008101-000059400461401E (USB)
この場合00008101-000059400461401E
の部分が端末IDとなる
idevice_idの導入については下記参考
https://qiita.com/s_noza/items/518d4ee28490c25d95b7
これらのコマンドから端末IDだけを抜き出せるコマンドを書いておくと便利
$ adb devices | sed 1d | cut -f 1
38241JEHN01076
38241JEHN08609
$ idevice_id | cut -f 1 -d ' '
00008101-000059400461401E
pythonでの並列実行
これまで一つの端末でAirtestを実行していた際は
subprocess.run(["/bin/sh", airtest.sh, option])
上記のようにAirtest実行のシェルを実行していた箇所を
subprocess.Popen(["/bin/sh", airtest.sh, option])
このように書き換えることで、シェルの終了を待たず後続処理を実行できる。
端末指定でAirtestを実行
iOSでの実行をする前には先に取得したデバイスID指定でWebDriverAgentの起動とiproxyの起動を行っておく必要があります。
参考
https://qiita.com/s_noza/items/518d4ee28490c25d95b7#%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%83%A9%E3%82%A4%E3%83%B3%E3%81%8B%E3%82%89%E3%81%AE%E5%AE%9F%E8%A1%8C
/Applications/AirtestIDE.app/Contents/MacOS/AirtestIDE runner "test.air" --device Android:///38241JEHN01076 --log log_38241JEHN01076
/Applications/AirtestIDE.app/Contents/MacOS/AirtestIDE reporter "test.air" --log_root log_38241JEHN01076 --export exp --outfile log_38241JEHN01076.html
/Applications/AirtestIDE.app/Contents/MacOS/AirtestIDE runner "test.air" --device iOS:///localhost:8100//00008101-000059400461401E --log log_00008101-000059400461401E
/Applications/AirtestIDE.app/Contents/MacOS/AirtestIDE reporter "test.air" --log_root log_00008101-000059400461401E --export exp --outfile log_00008101-000059400461401E.html
同時に複数のAirtestを実行した場合ログ出力ファイル名がかぶってしまうと、同一ファイルに書き込もうとしてエラーが発生するため
ログ名指定に端末IDを使う等ユニークな名前にする必要があります
adbコマンド実行時の注意点
Airtestを実行中の処理では
/Applications/AirtestIDE.app/Contents/MacOS/airtest/core/android/static/adb/mac/adb -s 38241JEHN08609 shell input keyevent HOME
のようにAirtestIDE内のadbが使用されているため
シェルスクリプト内で単にadb devices
と記述して自前で導入したAndroid SDKのadbを使用すると
adb server version (40) doesn't match this client (41); killing...
のようなエラーがでて実行中のAirtestが停止する場合があります。
シェルスクリプト内でも
/Applications/AirtestIDE.app/Contents/MacOS/airtest/core/android/static/adb/mac/adb devices
のように明示的にAirtestIDEのadbを使用することで回避できます。
その他やったこと
・Airtestの実行を開始すると同時に、端末IDと実行中であることを示す状態を実行マシンのローカルファイルに保存しておく
・新規のテストリクエストが来た際に上記を読み取ることで、実行中でない端末IDを指定して新規のテストを実行できるように
おわりに
これまで端末一台でテストをしていたため、複数端末同時にテストを実行できる環境を整えることで、かなり効率が上がる見込みです。
今後はAndroid端末はSTFを利用してリモートでテストできるようにする等、効率的な自動テスト環境になるように整えていきたいと思います。
参考