Appium + Android で ネイティブアプリの自動実行を試してみた

2021.06.17

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

いわさです。

Appiumをご存知でしょうか。
モバイルプラットフォームの自動化ライブラリです。

先日、AWS Device Farm の記事を作成しました。

この記事ではリモートアクセスを試していますが、自動実行を行うためには自動化ライブラリを準備する必要があります。
AWS Device Farm では Appium に対応しています。

今回は前段階として、ローカル端末でAppiumの自動実行を試してみたいと思います。
テスト用にアプリを吐き出す場合、iOSだと証明書周りが面倒になるので、Androidで試します。

Appiumとは

Appiumは、iOS/Android/Windowsデスクトッププラットフォームでアプリケーション操作を自動化するためのオープンソースツールです。
ネイティブアプリ、モバイルウェブアプリ、ハイブリッドアプリなど、様々なモバイルアプリをターゲットとした自動実行が可能です。

Appium自体はクロスプラットフォームツールとなっており、WindowsからもMacからも実行が可能です。

どういう仕組なのか

内部的には各プラットフォームで標準で用意されている自動化フレームワークを使っています。

  • iOS 9.3以降 : Apple の XCUITest
  • iOS 9.3以下 : Apple の UIAutomation
  • Android 4.3以降 : Google の UiAutomator / UiAutomator2
  • Windows : Microsoft の WinAppDriver

Selenium と同様に WebDriver API を使っており、自動化部分は Selenium のノウハウをそのまま使うことが出来ます。
内部的には Appiumの実体は Webサーバーで、Appiumクライアント(テストコード)は HTTPリクエスト さえ送信できればどういった環境でもテスト実行が可能です。

ただし、 Appiumクライアントライブラリが公式で言語別に提供されており、そちらを使うとテストの作成が簡単になります。
用意されている言語は Ruby, Python, Java, C# です。

やってみる

セットアップ

Appiumサーバーのセットアップ方法は、NPMからインストールするかデスクトップアプリをダウンロード・インストールするか、になります。
デスクトップアプリだとNodeランタイムも含めて必要なものが全てバンドルされているので簡易的にサーバーセットアップが可能です。

また、アプリの解析機能などもついており、のちのち活用したいと思いますので今回はデスクトップアプリを使ってみたいと思います。
ダウンロードはGitHubのリリースページから行います。

自動化を行う対象プラットフォームにあわせてテストドライバーの事前設定・確認が必要です。
今回はAndroidアプリになるので、UiAutomator2の設定確認を行います。

主なところだと、Java, Android SDK の設定がされていてパスが通っていれば問題ないと思います。

テスト作成

今回はテスト対象のアプリは作成しません。
Appiumから デモ用のアプリ が提供されているのでそれをダウンロードして使用したいと思います。

また、テストコードの中身は今回は掘り下げませんが以下のうち、 capabilities の platformVersion と app については実行環境ごとの変更が必要です。

const wdio = require("webdriverio");
const assert = require("assert");

const opts = {
  path: '/wd/hub',
  port: 4723,
  capabilities: {
    platformName: "Android",
    platformVersion: "11",
    deviceName: "Android Emulator",
    app: "/Users/iwasa.takahito/Downloads/ApiDemos-debug.apk",
    appPackage: "io.appium.android.apis",
    appActivity: ".view.TextFields",
    automationName: "UiAutomator2"
  }
};

async function main () {
  const client = await wdio.remote(opts);

  const field = await client.$("android.widget.EditText");
  await field.setValue("Hello World!");
  const value = await field.getText();
  assert.strictEqual(value,"Hello World!");

  await client.deleteSession();
}

main();

appのパスはAndroid上のAPKインストール先ではなく、ホストデバイス側で保存しているAPKファイルパスです。 このAPKをテスト実行時に接続デバイス(今回だとエミュレーター)へ送信されます。

次のようにテストプロジェクトディレクトリを作成し、WebDriverのインストールを行います。

iwasa.takahito@xxx work % mkdir appium-nyumon
iwasa.takahito@xxx work % cd appium-nyumon
iwasa.takahito@xxx appium-nyumon % npm init -y
iwasa.takahito@xxx appium-nyumon % npm install webdriverio

実行

Android11 のエミュレーターを起動します。

appiumサーバーを起動します。
アクセスポートは4723がデフォルトですが、変更も可能です。

テストを実行します。
用意したテストコードを node実行するだけです。

iwasa.takahito@xxx appium-nyumon % node index.js

あとは、エミュレーターで自動実行されます。

さいごに

プラットフォーム毎の環境用意に少し手こずりましたが、テスト自体はスムーズに実行することが出来ました。
次回は AWS Device Farm で自動テストの実行を試してみたいと思います。

参考