Upgrade to Pro — share decks privately, control downloads, hide ads and more …

半自動E2Eで手っ取り早くリグレッションテストを効率化しよう

Avatar for Ryuta Kibe Ryuta Kibe
September 19, 2025

 半自動E2Eで手っ取り早くリグレッションテストを効率化しよう

iOSDC Japan 2025で発表した資料です。

Avatar for Ryuta Kibe

Ryuta Kibe

September 19, 2025
Tweet

Other Decks in Programming

Transcript

  1. 2

  2. 3

  3. - クラウドにアプリバイナリをアップロードする工程で失敗する - UI要素の検出に成功したり失敗したりする - クラウドで動作するSimulatorのパフォーマンスが悪く、タイムアウトして しまう - 位置情報やプッシュ通知のパーミッションの許可を求めるダイアログが表 示されたりされなかったりする(それが原因でシナリオが失敗する)

    - シナリオ実行失敗時、その失敗の直接的な原因を自力では読み取れず、頻 繁にSaaSサポートに問い合わせ - 画面遷移をスワイプ操作で行うような特殊なUIの画面で、遷移が成功した り失敗したりする - SaaSの仕様上の理由でシナリオの部分的なデバッグが難しいケースがあ り、try & errorで時間を浪費してしまう etc… つまずき一覧 他にも細かいつまずきを たくさんしました…
  4. 自分たちが最速で成果を出すための技術選定 - Appium - テスト自動化ツール - 歴史と実績が豊富(私も過去に使ったことがある) - XCUITestも考慮したが、有識者が身近にいなかった -

    シナリオ記述言語にはRubyを採用 - 弊社のバックエンドがRuby on Rails製 - 稀に私もバックエンドAPIを実装していた - ライブラリが多くリリースされていて、目的が早く達成できそう The Ruby logo is used under the Creative Commons Attribution-ShareAlike 2.5 License. © 2006-2025 Ruby Association, Ruby Developers
  5. 工夫: 実機を使うことで出来ない操作をなくす - 手動でSMS認証 - SIMカードを挿した実機を用意 - 手動でQRコードによる出退勤 - 実機のカメラで読み取る

    - 手動で操作をする間、シナリオには と書いて待機させておく - 実機でしか利用できない機能を これからもシナリオに追加できる - (例)NFCを用いた出退勤 sleep 30
  6. - スクリーンショットを加工して精度を上げている - モーダルダイアログの周囲の文字が邪魔 - スクリーンショットを2/3の幅にcrop - 文字色が青いと文字だと認識されにくい - グレースケールに変換

    - Rubyライブラリのおかげで短時間で実装できた - rmagick/rmagick(画像加工) - dannnylo/rtesseract(OCR) 工夫: UI部品を探さず、特定の文字列を探す
  7. 成功するまでenhance()を実行し続ける → 成功! 工夫: 画像編集ライブラリのノイズ除去メソッドを使う 30.times do # 検出できるまで最大30回試す image

    = image.enhance() # (省略: image内の文字を読み取る処理がここに入る) if scanned_text.end_with?(target_text) # (省略: 検出したテキストの座標をtapする) end end
  8. # シナリオ側の実装 Say.text("操作が必要です。本人確認を完了させてください。60秒待ちます。") # 呼び出されるメソッド側の実装 def text(message) Thread.new do system(`say

    -v Kyoko "#{message}"`) # macOSのsayコマンドに喋らせる end end 工夫5: リグレッションテスト担当者のマルチタスク対応
  9. 1. Appium (npm install -g appium) 2. carthage (brew install

    carthage) 3. Appium XCUITest Driver (appium driver install xcuitest) 4. (画像加工をする場合) imagemagick (brew install imagemagick@6) 5. (OCRを実施する場合) tesseract (brew install tesseract) - 日本語対応のため、 https://github.com/tesseract-ocr/tessdata の jpn.traineddataも必要 ※赤字のみ必須、他は任意 私達が利用しているツール
  10. 設定類 - AppiumのCapabilities設定JSON - Appiumに渡す.appファイルを作るアーカイブコマンド { "appium:platformName": "iOS", "appium:automationName": "XCUITest",

    "appium:udid": "{デバイスID}", "appium:autoFillPasswords": false, "appium:language": "ja-JP", "appium:newCommandTimeout": 480000, "appium:app": "{.appファイルのパス}" } $ xcodebuild -scheme {スキーム名} \ -configuration Debug \ -sdk iphoneos \ -archivePath /path/to/app.xcarchive archive { "appium:platformName": "iOS", "appium:automationName": "XCUITest", "appium:udid": "{デバイスID}", "appium:autoFillPasswords": false, "appium:language": "ja-JP", "appium:newCommandTimeout": 480000, "appium:bundleId": "{インストール済のアプリの BundleID}" } アプリを新規インストールする場合 インストール済のアプリを利用する場合