Remote TestKit の使い方

Appium連携のチュートリアル

概要

Appiumは、スマホやタブレットのテスト自動化を実現するためのテストフレームワークのひとつです。 以前より Remote TestKit では仮想 ADB 機能や Xcode連携機能 (Xcode connector) を用いることで、ローカル PC 上に構築された Appium 環境を用いたテスト自動化が可能でした。2018 年 6 月のバージョンアップにより、Appium サーバ環境を構築することなく簡便に Appium のテストスクリプトを実行することが可能となり、CI 環境との連携も容易に実現することが可能となりました。

Remote TestKit がサポートする Appium 連携

Remote TestKit を用いない場合の Appium 環境

一般的には Appium によるテスト自動化を行うためには下図に示すとおり、Appium を動作させるローカル PC 内に、Node.js や Appium Server などの実行環境を整えた上で、テストスクリプトを作成してスクリプトを実行させる必要がありました。 またテストスクリプトで用いる端末もローカル PC に接続された実機端末のみが対象となり、Android/iOS シミュレータを用いらざるを得ないケースも多々ありました。

Remote TestKit の従来機能を用いた Appium 環境

Remote TestKit では従来より、仮想 ADB 機能や Xcode連携機能 (Xcode connector) を用いることで、クラウド上の端末を用いた Appium 環境を構築することが可能です。この構成では低レイヤーでクラウド上の端末と連携するため Appium 以外のテストフレームワークとの連携が可能というメリットがあります。 ※iOS 端末においては Xcode を用いたデバッグで一部機能制限があります。

Remote TestKit の新機能を用いた Appium 環境

2018 年 6 月のバージョンアップの機能を利用することで、Appium を用いたテスト自動化においてはユーザがテストスクリプトさえ用意すれば Node.js や Appium server 等の実行環境を整えることなく動作可能となりました。また本機能を用いることで、社内外の CI 環境との連携も用意に実現することが可能となり、本来業務としてのテストスクリプトの開発に集中することができます。新機能を用いた Appium 環境は下記のとおりとなります。 ※現時点では Android 4.3 以降のみが対象ですが今夏中に iOS 端末も対応を予定

各種 Appium 環境との比較

前述した 3 つの環境についての比較は下記表のとおりとなります。
RTK 新機能よる環境 RTK 従来機能による環境 RTK なしの環境
Server 環境構築 不要 必要 必要
Client ライブラリ 必要 必要 必要
スマートフォン実機 不要 不要 必要
テストスクリプト実行場所 ローカル PC ローカル PC ローカル PC
Appium以外の連携 不可
CI 環境との連携 簡易 ThriftAPI による連携が必要 実機連携はやや困難

解決される課題

テスト自動化に取り組まれている企業で課題となるのが CI(継続的インテグレーション) での実機検証です。 市中のCIサービスは海外のサービスが多く、端末ラインナップも海外端末がほとんどです。一方 Jenkins 等を用いて自社内に CI 環境を構築する場合は、実機検証環境を用意し運用することは大変です。今回リリースされる Remote TestKit の新しい Appium 機能を用いることで、CI 環境から実機検証を比較的容易に実現することが可能となります

新機能を用いた Appium 連携の手順

基本的には、ローカル PC 上の Appium 環境で動かしているテストスクリプトの Capabilities の設定を変更するだけで Appium自動テストクラウドをご利用いただけます。 以下 Ruby 言語によるテストスクリプトの例を挙げながら説明いたします。

Appium Client ライブラリのインストール

Appium Client ライブラリを下記の手順でインストールします。
gem install selenium-webdriver
gem install appium_lib

接続先の説明

Appium クライアント(テストスクリプト)の接続先として通常ローカル PC 上で実行しているときは "http://localhost:4723/wd/hub" としている部分を "https://gwjp.appkitbox.com/wd/hub" を指定します。 ・Rubyでのコード例
    @driver = Appium::Driver.new(
    caps: {
        ...
    },
    appium_lib: {
        #server_url: 'http://localhost:4723/wd/hub',
        server_url: 'https://gwjp.appkitbox.com/wd/hub',
        wait: 60
    }
).start_driver

ユーザ認証

Appium クライアントの接続時の認証には、Remote TestKit のユーザ名・パスワードを Capabilities に指定します。
Capabilities名
userName Remote TestKit のユーザ名
password Remote TestKit のパスワード
・Rubyでのコード例
@driver = Appium::Driver.new(
    caps: {
        userName: "Remote TestKitのユーザ名",
        password: "Remote TestKitのパスワード",
        ...
    },
    appium_lib: {
        ...
    }
).start_driver

端末指定

「機種名のみ」「機種名 & バージョン」の二種類の方法で、Appium を実行する端末を指定できます。機種名には正規表現も指定することができます。
  • 指定する端末は、Web クライアントや PC クライアントで確認します。
  • 機種名のみで指定する場合には、下記の Capabilities を指定します。
Capabilities名
platformName Android(固定値)を指定
deviceName 機種名を指定 "全体一致" → "スペースによる区切りありの前方一致" → "前方一致の正規表現" の優先順位で判定(大文字・小文字の区別なし)
・Rubyでのコード例(Nexus 5を指定)
@driver = Appium::Driver.new(
    caps: {
        ...
        platform: 'ANDROID',
        platformName: 'Android',
        deviceName: 'Nexus 5X',
    },
    appium_lib: {
        ...
    }
).start_driver
  • 機種名 & バージョンで指定する場合には、下記の Capabilities を指定します。
  • 機種名で絞り込んだ後、バージョンで判定されて、端末が決定されます。
Capabilities名
platformName Android(固定値)を指定
deviceName 機種名を指定 "全体一致" → "スペースによる区切りありの前方一致" → "前方一致の正規表現" の優先順位で判定(大文字・小文字の区別なし)
platformVersion バージョンを指定 PC クライアントの OS カラムの "Android" を除いた部分を指定 "全体一致" → "前方一致の正規表現" の優先順位で判定
・Rubyでのコード例(Nexus 5X の version8 を指定)
@driver = Appium::Driver.new(
    caps: {
        ...
        platform: 'ANDROID',
        platformName: 'Android',
        deviceName: 'Nexus 5X',
        platformVersion: '8',
    },
    appium_lib: {
        ...
    }
).start_driver

アプリのインストール

方法1. Remote TestKit からアクセス可能なお客様ご自身の公開サーバ等に apk をアップロードして下記の Capabilities を指定します。 ※ 必要に応じて社内の Firewall 等の設定に Remote TestKit からのアクセス許可設定を追加してください。アクセス元 IP アドレスは FAQ に記載があります。
Capabilities名
app apk をアップロードした URL を指定
・Rubyでのコード例
@driver = Appium::Driver.new(
    caps: {
        ...
        app: "https://appkitbox.com/test/sample.apk",
    },
    appium_lib: {
        ...
    }
).start_driver
方法2. Remote TestKit の Web 版にログインして、自動テスト機能のアプリ登録画面を使って apk をアップロードした後に、下記の Capabilities を指定してください。
Capabilities名
app アップロードした apk ファイル名を指定 同名ファイルが複数アップロードされている場合には、最新のアップロードファイルが使われます
・Rubyでのコード例
@driver = Appium::Driver.new(
    caps: {
        ...
        app: "sample.apk",
    },
    appium_lib: {
        ...
    }
).start_driver

実行中の画面の確認

Appium サーバに接続後に画面を取得するための snapshotUrl が発行されます。capability を使って snapshotUrl を取得し、ブラウザで開くことで、現在実行中の画面が閲覧可能です。 ・Rubyでのコード例
snapshotUrl = @driver.capabilities['snapshotUrl']

端末レンタルの自動返却

5 分間 Appium サーバ経由で同一端末にアクセスがない場合には、自動返却が行われます。

端末レンタルの自動延長

レンタル残り時間が 5 分未満になった場合に、Appium サーバ経由で同一端末にアクセスがあれば、自動的に 30 分間のレンタル自動延長が行われます。

Google 検索を行う Ruby のテストスクリプト

以下のスクリプトを test.rb 等の名前でローカル PC に保存してください。
require 'rubygems'
require 'test/unit'
require 'selenium-webdriver'
require 'appium_lib'

# get userName, password from Environment variable
RTK_USERNAME = ENV['RTK_USERNAME']
RTK_PASSWORD = ENV['RTK_PASSWORD']
unless RTK_USERNAME && RTK_PASSWORD then
    puts "Environment variable error"
    exit(0)
end


class OpenUrlTest < Test::Unit::TestCase
    def setup
        opts = {
            caps: {
                userName: RTK_USERNAME,
                password: RTK_PASSWORD,
                platform: 'ANDROID',
                deviceName: 'Nexus 5',
                platformName: 'Android',
                browserName: 'Chrome'
            },
            appium_lib: {
                server_url: 'https://gwjp.appkitbox.com/wd/hub',
                wait: 60
            }
        }
        @driver = Appium::Driver.new(opts).start_driver
    end

    def teardown
        @driver.quit()
    end

    def test_google_search
        puts @driver.capabilities['snapshotUrl'].sub('http://localhost:4723', 'https://gwjp.appkitbox.com')
        # Open URL
        url = "https://www.google.com/"
        puts "Open URL: " + url
        @driver.get(url)
        element = @driver.find_element(:name, 'q')
        sleep(5)
        @driver.save_screenshot('capture_01.png')
        
        # Input keys
        word = "Remote testKit"
        puts "Input Keys: " + word
        element.send_keys(word)
        element.submit
        sleep(5)
        @driver.save_screenshot('capture_02.png')

        # Get value
        value = @driver.find_element(:name, 'q').value
        puts "Text field value=" + value
        assert_equal true, value == "Remote testKit"
    end
end
本テストスクリプトを実行するに当たり、環境変数に Remote TestKit のユーザ名、パスワードを設定します。ターミナルより以下を実行します。
export RTK_USERNAME=xxxx
export RTK_PASSWORD=xxxx

そのほかのサンプルコード

その他の言語やテストスクリプトのサンプルコードは下記のリポジトリを参照ください。 https://github.com/remotetestkit/sample-code

技術仕様および制限事項

2018.6月現在、ベータ版としての機能提供となります。現時点では以下の制限があります。
  • ベータ期間においては FLAT ユーザの方が、無料でご利用になれる機能です。
  • 現在は Android 端末のみがご利用になれます(iOS 端末は今夏対応予定)。
  • Appium の仕様から対象となる端末は UiAutomator2 に対応している Android 4.3 以上に限られます。
  • Remote TestKit 側で動作している Appium のバージョンは 1.8.0 となります。 作成するクライアント側のテストスクリプトも 1.8.0 を想定した実装をお願い致します。
  • 5 分間 Appium サーバ経由で同一端末にアクセスがない場合には、自動返却が行われます。また 5 分間の間は自動返却されないため、同じ端末に対して複数スクリプトを実行することができます。
  • サーバに対して負荷のかかる処理、メモリを大量に必要とする処理は強制終了する場合があります。
  • 必要に応じて社内の Firewall 等の設定に Remote TestKit からのアクセス許可設定を追加してください。アクセス元 IP アドレスは FAQ に記載があります。