appium で Android の E2E テストを書く
最近 Android 開発をちょこちょこしているのですが、フロントエンドの E2E テストみたいに自動でテストしてくれるものが Android にも無いかなー
と探していたところ appium というツールを見つけたので使ってみたというエントリーです。
appium
ネイティブ(モバイル)アプリのためのテスト自動化フレームワークです。
Android と iOS どちらにも対応しています。
特徴として自分の得意な言語でテストケースを書くことができます。
選べる言語は Java, Javascript, Python, Ruby, php などなど。
appium にはデスクトップアプリがあり、それを使うと簡単にテストケースを作ることができます。
以下からダウンロードすることができます。
ダウンロード後以下の画面が立ち上がるのでそのまま「Start Sever」で進みます。
虫眼鏡のアイコンを押します。
このような画面が開くので「JSON Representation」に以下の内容を書き込みます。
{ "platformName": "Android", "deviceName": "エミュレータの名前", "platformVersion": "10", "automationName": "Appium", "app": "apk へのパス", }
エミュレータの名前 は Android Studio でエミュレータを起動した状態で以下のコマンドを打つと得られます。
> adb devices List of devices attached XXXX device
XXXX の部分が名前です。
この状態で「Start Session」を押します。
すると以下のような画面が開きます。
この画面で要素をクリックして 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 を選択してよかったと思いました。