LIVESENSE ENGINEER BLOG

リブセンスエンジニアの活動や注目していることを発信しています

スマホアプリのUIテスト自動化をしていきます

これは Livesense Advent Calendar 2024 DAY 10 の記事です。

はじめに

こんにちは、マッハバイトの草間です。
マッハバイトのスマホアプリでUIテストの自動化をすることになりました。
その過程で検討したことについて書きます。

社内の過去事例

転職会議事業部でWebのE2Eテストについて書かれた記事があります。
それを参考にスマホアプリのUIテスト自動化を検討していきました。

made.livesense.co.jp

経緯

マッハバイトでは、リリース前にスマホアプリのシナリオテストをエンジニア全員で実施しています。
具体的な内容は記載しませんが、全員の時間を合わせるとほぼ1日分の時間がシナリオテストの実施に毎週使われる状態となっています。
毎週1日分の作業時間が使われるのは、保守や新規施策開発などの時間を非常に圧迫します。
そのため、人の介在を減らすことを目的にテスト自動化を検討することにしました。

求めること

検討するにあたり、次の観点を挙げました。

  1. コスト
  2. テストを作りやすいか
  3. サポートの手厚さ
  4. エンジニア以外でも使えるか

上記の順を優先度として、自前で作るか、SaaSを利用するか検討しました。

検討

次のもので検討を開始しました。

  1. MagicPod
  2. Autify
  3. BrowserStack
  4. BitriseとXCUITest

上記4つのうち、3つがSaaSになります。
それぞれシナリオテストの一部を実装しました。

各サービスを使ってみて

個々のサービスについての使用感などの細かい部分は割愛しますが、個人的に次のような感想をいだきました。

  • テストを作るのそれなりに大変
    • 非エンジニアで保守は難しそう
  • サポートはそれなりにそれぞれある
  • コスト・・・

結論

今回検討した結果、BitriseとXCUITestを使ってUIテストの自動化を行うこととしました。
選んだ理由は、次の通りです。

  • Bitriseはすでに使っている
    • コストが今と変わらない(増減しない)
  • エンジニアの工数は結局どれも使いそう
  • どのツールもやりたいことに対して機能が多い

今回は、SaaSを使わずに実施することになりました。

最後に

今後、BitriseとXCUITestでUIテストの自動化を行っていきます。
また、AndroidのUIテストの導入も行っています。
これらが進捗し、導入するうえで発生したことなどをブログにかければと思っています。

Appendix

なんか薄い記事になってしまったので、検討しているときにAppiumというオープンソースの自動化ツールを知りました。
ほんの少しだけ触ったのでそのことをちょっとだけ記載してみます。

Appium君は何者?

スマホアプリのテスト自動化ツールとのこと。
いくつかのプログラミング言語でスマホ用のE2Eテストが書けるオープンソースのツールということがわかりました。

ちょっと触ってみる

BrowserStackで利用できたので検討のついで触ってみました。
プログラミング言語はRubyを選択しました。( Rubyを選択した理由
サクッと書いてみると次のような感じです。

require 'rubygems'
require 'appium_lib'
require 'selenium-webdriver'
caps = {}
caps['browserstack.user'] = 'XXXXXXXXXXXXX'
caps['browserstack.key'] = 'XXXXXXXXXXXXXXX'
caps['app'] = 'upload先のキー'
caps['device'] = 'iPhone 15 Pro Max'
caps['os_version'] = '17'
caps['project'] = 'First Ruby project'
caps['build'] = 'Ruby iOS'
caps['name'] = 'single_test'
caps['platformName'] = 'iOS'
appium_driver = Appium::Driver.new({
                                     'caps' => caps,
                                     'appium_lib' => {
                                       :server_url => "https://hub-cloud.browserstack.com/wd/hub"
                                     }}, true)
driver = appium_driver.start_driver

上記がお決まりの記述です。
細かい説明は省きます。
iOSのテストを書きました。
次のような感じです。

wait = Selenium::WebDriver::Wait.new(:timeout => 30)
wait.until { driver.find_element(:accessibility_id, "${ボタンのタイトル}").displayed? }
textButton = driver.find_element(:accessibility_id, "${ボタンのタイトル}")
textButton.click

sleep 5

wait.until { driver.find_element(:accessibility_id, "${ボタンのタイトル}").displayed? }
textButton2 = driver.find_element(:accessibility_id, "${ボタンのタイトル}")
textButton2.click

これは簡単に書けるなと思い、このコードをAndoridでも動かしてみると、ボタンが取得できないことがわかりました。
「同じコードでやれないのか。。。。 」と愕然としたのを覚えています。

Appendixの最後に

結果としては、iOSとAndroidそれぞれでコードを書く必要があると判断しました。
それならAppiumでなくてもいいかなと個人的に思いました。