小さなエンドウ豆

まだまだいろいろ勉強中

appium で Android の E2E テストを書く

appium で Android の E2E テストを書く

最近 Android 開発をちょこちょこしているのですが、フロントエンドの E2E テストみたいに自動でテストしてくれるものが Android にも無いかなー
と探していたところ appium というツールを見つけたので使ってみたというエントリーです。

appium

ネイティブ(モバイル)アプリのためのテスト自動化フレームワークです。
AndroidiOS どちらにも対応しています。
特徴として自分の得意な言語でテストケースを書くことができます。
選べる言語は Java, Javascript, Python, Ruby, php などなど。

appium にはデスクトップアプリがあり、それを使うと簡単にテストケースを作ることができます。
以下からダウンロードすることができます。

github.com

ダウンロード後以下の画面が立ち上がるのでそのまま「Start Sever」で進みます。

f:id:h-piiice16:20200321165532p:plain

f:id:h-piiice16:20200321165711p:plain

虫眼鏡のアイコンを押します。

f:id:h-piiice16:20200321170010p:plain

このような画面が開くので「JSON Representation」に以下の内容を書き込みます。

{
  "platformName": "Android",
  "deviceName": "エミュレータの名前",
  "platformVersion": "10",
  "automationName": "Appium",
  "app": "apk へのパス",
}

エミュレータの名前Android Studioエミュレータを起動した状態で以下のコマンドを打つと得られます。

> adb devices
List of devices attached
XXXX    device

XXXX の部分が名前です。
この状態で「Start Session」を押します。

すると以下のような画面が開きます。

f:id:h-piiice16:20200321174652p:plain

この画面で要素をクリックして tap, send_keys, clear で操作をしていきます。
tap はその名の通りボタンなどをタップする操作になります。
send_keys は EditText などに値を入力する操作で、clear は値を消す操作になります。

このように操作を加えていくとページ上部にコードが現れます。
これがテスト操作のためのコードになるのでコピーします。(言語はセレクトボックスから選べます)

そのコピーしたコードを以下のように RSpec に載せます。

require 'spec_helper'

desired_caps = {
  caps: {
    platformName:  'Android',
    platformVersion: '10',
    deviceName:    'xxxxxxxxxxxxxxxxxxx', # デバイスの名前
    app:           'yyyyyyyyyyyyyyyyyyyyyy' # apk の場所
  },
  appium_lib: {
    wait: 60
  }
}

describe 'Basic Android interactions' do

  before(:all) do
    @driver = Appium::Driver.new(desired_caps, false).start_driver
  end

  after(:all) do
    @driver.quit
  end

    it 'スケジュール画面での確認' do
          @driver.start_recording_screen
         ################ 以下ペーストした部分 ####################
          el4 = @driver.find_element(:id, "com.example.myscheduler:id/fab")
          el4.click
          el5 = @driver.find_element(:id, "com.example.myscheduler:id/dateEdit")
          el5.send_keys "2020/01/01"
          el6 = @driver.find_element(:id, "com.example.myscheduler:id/titleEdit")
          el6.send_keys "title"
          el7 = @driver.find_element(:id, "com.example.myscheduler:id/detailEdit")
          el7.send_keys "detail"
          el8 = @driver.find_element(:id, "com.example.myscheduler:id/save")
          el8.click
          el9 = @driver.find_element(:id, "com.example.myscheduler:id/snackbar_text")
          expect(el9.text).to eq('追加しました')
          @driver.back
          el10 = @driver.find_element(:id, "android:id/text2")
          expect(el10.text).to eq('title')
          ################ ここまで #############################
          @driver.stop_and_save_recording_screen './sample.mp4'
     end
end

@driver.start_recording_screen は動画を撮る際に要る構文です。
終わりに @driver.stop_and_save_recording_screen './sample.mp4' とすると mp4 形式で出力されます。

非常に便利ですね。

まとめ

appium はデスクトップアプリを使うと非常に簡単にテストケースを作ることができました。

この容易さに加えて AWS の Device Farm というサービスとの連携ができるそうです。
Device Farm を使うと iOS, Android のプラットフォームを越えたテストや Android 特有のいろいろな端末でのテストを同時に行うことができるらしいです。

Android E2E で調べると他にも候補がありましたが、これらの点から appium を選択してよかったと思いました。