AirTestとAppiumを併用し、WebとNativeのハイブリッドなゲームアプリをテストする。

概要

WebViewとネイティブを相互利用するゲームアプリのE2Eというか、導線テストというか、通しテストというか。まぁとにかく、動作確認をしたい。というときに難儀する。ということがある。Unity+WebViewとかになるともう…

もともと、ゲームのUIというのはUIテストフレームワークと相性が悪いことが多い。(各OSのUIフレームワークでなく、独自の仕組みを使うことが多いからだ)

Appiumなどはかなり優秀なテストフレームワークだ。
中のコンテキストを切り替えれば、アプリ内に表示されたWebViewに対し、処理やAssertを行うことが可能になっている。しかし、Unityなどで制作されたUIに対しては、画像解析などの仕組みを用意しなければならないだろう。

その点でいうとAirtestはなかなか良い。これはUnity上のUI(NGUIとuGUIに対応してたはず)を再起的に捜査してobject名でUIを捜査するそれに加え、画像認識を利用することで、ボタンを認識してその位置を叩く。といったことも可能になっている。
Airtestそのものについてはコガネブログさんの
http://baba-s.hatenablog.com/entry/2018/10/03/090000
こちらのブログがバズっていて参考にさせていただきました。
軽く中身を見てみると
https://github.com/openstf/minicap などを利用してスクショを取得し、OpenCVで画面捜査、タップエリアを認識する。というもの。他にもPocoというライブラリを導入する手法やこれらのテストを作りやすくするためのIDEなどがあり、NetEaseすげーの一言。一時期全く同じ手法で自動テストの仕組みをつくっていたけどよっぽど洗練されている…


ということで、AppiumとAirtestを同時に起動すればハイブリッドなアプリの動線確認などが行えるんじゃないか?という実験をしてみたらうまく行った

なんの役に立つの?

ゲームのような独自のUIを持ったネイティブとWebのハイブリッドなアプリのE2Eテスト的なことができます。できると思う。多分。

需要あるの?

一部で根強い要望があるんじゃ


python -m airtest でAirtestを起動しつつ、中のコードではAppiumへ接続を開始する。AppiumはAppiumサーバー。Airtest自体はADBを利用して連携しているのでかち合うこともなく、互いの操作を保管することができる。
  1. Airtest を実行。
  2. コード内でAppium経由でアプリを起動
  3. Airtestによる操作
  4. Appium内のContextを切り替え、Webviewへの操作を行う。
  5. 再度Airtestによる操作

登場人物



それぞれの基本的な使い方は省略。要望があれば細かく書く。

https://github.com/gree/unity-webview
に対し、アプリ起動、Webview操作、Unityのバックボタン操作。というコードは以下になる。
https://gist.github.com/mogeta/191a4f6a1bb8e654ad75abcef578fa4d


疑問

Appium、DOMに対してのクリック処理がうまくうごかなくて、結局JavaScriptを実行しているけどこれでいいのか?

Jenkinsでテスト集計したいのでテスト形式で実行したいけどとりあえず
https://github.com/kyrus/python-junit-xml
で強制的に出力している。筋が悪い…

0 件のコメント :