17
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

グリー/ExPlay品質管理Advent Calendar 2023

Day 22

Airtestの複数端末同時実行環境を整える

Last updated at Posted at 2023-12-21

はじめに

上記にて紹介されているテスト自動化の実行環境において
テスト用のマシンと単一の端末で運用されているため複数のテストを実行する際に時間がかかるという課題がありました。
そこで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を実行していた際は

run
subprocess.run(["/bin/sh", airtest.sh, option])

上記のようにAirtest実行のシェルを実行していた箇所を

popen
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

Android
/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
iOS
/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を利用してリモートでテストできるようにする等、効率的な自動テスト環境になるように整えていきたいと思います。

参考

17
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
17
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?