Appiumとは?仕組み(アーキテクチャ)を整理【Android,iOS】

久々にお仕事ネタの話題です~IT関連の専門的で結構ガチな話です。
なんか、ソシャゲやアニメの記事が多い中、違和感ありますが。一応ITとかAIも機会があれば取り上げてるので;(もう昨年の話ですが、ラズパイとかディープラーニングとか書いたなー)

今回のお題は、スマホアプリの自動化ツール「Appium」のお話です。

「自動化」といえばWinActorに代表される、業務自動化ツール(RPA)の活用が拡大しているこの頃ですね。事務作業自動化とはまた違う領域ですが、開発現場においても広義のRPAといえるツールの導入の機運が高まっているのを感じています。

特に、アプリケーションのテスト作業の自動化については、Selenium IDEといった、
ノンプログラマーでも使いやすい枯れたツールが存在していることもあり、既に当たり前に使われている現場も多いかと思われます。

Webアプリケーション向けのテスト自動化では、Seleniumと呼ばれるOSSが広く使われていますが、一方で、昨今のスマホ普及により増加したモバイルアプリのテスト向けとして開発・使用されているのが「Appium」と呼ばれるOSSです。

自分も開発現場でこの度触る機会が一時期あり、色々勉強したのですが、その仕組みなどはまだもやっとしたまま……(仕組みなどは詳しく理解しなくても、とりあえず使うことはできるのですがね)

自己学習の整理のため、Appiumの仕組み(アーキテクチャ)について、アウトプットしておきます。

(参考文献)

実践 Appium
実践 Appium
posted with amazlet at 19.05.04
Manoj Hans
オライリージャパン
売り上げランキング: 466,285


(参考ページ)
Appiumの仕組みと使い方 - Qiita

SeleniumのUIテスト自動化をiOS/AndroidにもたらすAppiumの基礎知識とインストール方法、基本的な使い方 (1/4):スマホ向け無料システムテスト自動化ツール(8) - @IT

Appiumアーキテクチャ

Appiumにはいくつかの登場人物が存在します。
登場人物を一覧表に示します。


ハードウェアソフトウェア説明
PC
テストスクリプト・テスターが準備するテスト自動操作プログラム
・Java、Groovy、Rubyなどあらゆる言語に対応
Appiumクライアントライブラリ・アプリを操作するためのAPIを提供
・テストスクリプトからAPIを通じて命令を受け、Mobile JSON Wire ProtocolでAppiumサーバーに転送
・Appiumサーバーから実行結果を受け取り、テストスクリプトに返送
・主なAPIとして、Driver、Device、TouchAction、MultiActionがある
Appium サーバー・Appiumクライアントライブラリからの命令を解釈し、ドライバーおよび自動化フレームワークを介してアプリを操作する
・アプリの操作が完了したら結果をAppiumクライアントライブラリに返送
・サーバには、Desired Capabilities という初期設定が存在し、クライアント側で指定。
(参考)https://www.atmarkit.co.jp/ait/articles/1506/02/news017.html
ドライバー・自動化フレームワークを使ってデバイスを操作する
・iOS 用(iOSDriver), Android 用(AndroidDriver), Win 用(WindowsDriver)のドライバーが存在
自動化フレームワーク・Android/iOSが提供しているデバイス操作用のフレームワーク
・UiAutomator2などがある
デバイス
bootstrap.jar (Android)・デバイスでテスト操作命令を実行。実行後、Appiumサーバーにメッセージとログを返送
・TCPサーバとして機能している
bootstrap.js (iOS)・デバイスでテスト操作命令を実行。実行後、Appiumサーバーにメッセージとログを返送

大きな特徴しては、Appiumを搭載しているPC内でクライアント-サーバー型のアーキテクチャを取っていることだと思います。

テストスクリプトで内で記述したAppiumクライアントライブラリを介して、Appiumサーバーに命令を送る。Appiumサーバーがそれに従って、PCにUSB接続されたデバイスを自動操作するというものです。

なぜ、このようなクライアント-サーバー型の構成をとっているのかは不明ですが、クラサバの一般的なメリットから考えれば、おそらく以下の狙いがあるのかなと。

・デバイス(サーバに接続、管理された)をネットワークを介して自動操作する際に有用
・機能分散、実装上の都合?(複数のテストスクリプトを同時実行する際、PC-デバイス間の中継機能を持たせたサーバを配するのがいい?)
・どうやら、SeleniumのSelenium Serverが、クライアントライブラリが対応していないドライバーを操作するために仲介するのと同じような役割のようです。iOS/Androidのプラットフォームに公式に対応していないアプリを動かすためにも必要らしいとか。

クラサバ間で使われているプロトコル(Mobile JSON Wire Protocol)はHTTPベースで、データはJSON形式と決して特殊なものではなく、なじみのあるものが使われています。

テスターがデバイスをAppiumで自動操作する際には、まずセッションを確立するところから始まります。このセッションを介することで、デバイスにあるテスト対象のアプリを自動操作することになります。

セッション確立までの流れは調べたところ以下のようになるみたいです。(Androidデバイス操作の場合)



※実際の実装を調べたわけではないので、順序や内容が間違ってる可能性あり


セッションはテスト終了後に切断されます。

Appiumの仕組みはまだ詳細は深入りしていませんが、最初のセッション確立だけでもその大まかな概観が見えてきますね。

Appiumのインストールやコマンドの解説については、以下に記しました。

・インストール、テスト準備方法
https://nine-num-98.blogspot.com/2020/04/appium-katalon-01.html

・コマンド、サンプルコード解説
https://nine-num-98.blogspot.com/2020/04/appium-katalon-02.html

スポンサーリンク