本書の前提:
02_回帰テスト版の前提に加え、クラウドファーム (BrowserStack / AWS Device Farm / LambdaTest) を全廃し、ローカル Mac (Mac mini / Mac Studio / MacBook Pro) と USB-C ケーブル接続の実機モバイル端末のみで回帰テストを完結させる 運用に最適化したベストプラクティス。底本:
02_回帰テスト版/次世代検証ツール選定案_問1_ネイティブアプリ_回帰テスト版.mdの結論を、オールローカル前提に書き直したもの。調査日: 2026-06-08
Appium 3.x を Mac 上で起動し、USB-C ケーブル接続の実機 iPhone / iPad / Android 端末に対して直接通信する完全ローカル構成。クラウドファームへの月額支出はゼロとし、自社所有実機の購入コストを唯一の継続支出とする。
| 領域 | iOS / iPadOS | Android | ローカル実機版 固有事項 |
|---|---|---|---|
| コアフレームワーク | Appium 3.x + XCUITest Driver | Appium 3.x + UiAutomator2 Driver | Mac mini に直接 install、サーバー常駐は実行時のみ |
| テストランナー | pytest / Mocha (Mac mini ローカル) | 同左 | クラウド CI 廃止 |
| 実機接続 | USB-C → Mac (iPhone 15 以降 / iPad Air M2 以降) | USB-C → Mac (Pixel 6 以降 / Galaxy S24 以降) | Lightning モデル (iPhone 14 以前) は USB-A→Lightning ハブ経由 |
| シミュレータ補完 | Xcode iOS Simulator (M シリーズで実機相当の動作) | Android Studio Emulator (Apple Silicon ネイティブ) | OS バージョン網羅に活用 |
| 視覚検証 | OpenCV (OSS) + Apple Vision Framework (オンデバイス) | OpenCV (OSS) + Android ML Kit (オンデバイス) | クラウド送信ゼロ |
| DRM 領域 | OpenCV ベースライン + 手動目視レビュー | 同左 | 実機画面を Mac で直接キャプチャ |
| 状態管理 | XCUITest ベース宣言型 YAML シナリオ | Espresso ベース宣言型 YAML シナリオ | ローカル Git 管理 |
| OS バージョン網羅 | 自社購入の実機 + iOS Simulator | 自社購入の実機 + Android Emulator | クラウド経由の OS 網羅は廃止 |
| マルチモーダル LLM | 本番判定不採用 | 同左 | ローカル LLM (DwarfStar4 等) のデバッグ補助は可 |
| 機種 | 適合 | 理由 |
|---|---|---|
| Mac mini M4 / M4 Pro (推奨) | ✅ | デスク常設、USB-C ポート 3 個 + Thunderbolt 4 で USB-C ハブ拡張容易、低消費電力 |
| Mac Studio M4 Max / M3 Ultra | ✅ | iOS Simulator + Android Emulator + Appium 同時起動でも余裕、メモリ 64 GB 以上推奨 |
| MacBook Pro M4 Pro / Max | ⚠️ | 携帯性は高いが USB-C ポート 3 個で実機接続数に制約、外付け USB-C ハブ必須 |
| Mac mini M2 以前 | ⚠️ | iOS Simulator が重く実用上限が低い、新規導入なら M4 系を推奨 |
| Intel Mac | ❌ | Xcode 16 / iOS 18 SDK は Apple Silicon 推奨、Rosetta 経由は遅く非推奨 |
| 機種 | 役割 | USB ポート |
|---|---|---|
| iPhone 15 / 15 Pro / 16 / 17 | 通常 iPhone 検証 | USB-C |
| iPhone Air (薄型新シリーズ) | サイズ違い検証 | USB-C |
| iPad Pro M4 | 大画面 iPadOS 検証 | USB-C (Thunderbolt 4) |
| iPad Air M2 / iPad mini A17 Pro | iPad ミドルレンジ検証 | USB-C |
Lightning 端子の iPhone (8 〜 14 / SE 系) は USB-C 直結不可。USB-A→Lightning ケーブル + USB-A→USB-C 変換、または USB-C ハブの USB-A ポートを経由する。レガシー OS (iOS 16 以前) サポートが不要なら省略可。
| 機種 | 役割 |
|---|---|
| Pixel 8 / 8 Pro / 9 | Pure Android (Google 標準) 検証 |
| Galaxy S24 / S25 | One UI / Samsung Internet 連動検証 |
| Xiaomi / OPPO 等 | グローバル市場向けアプリの場合 |
クラウドファーム年額 $2,700 ≈ ¥420,000 と比較し、2 年で回収可能。3 年目以降は端末更新を除き継続支出ゼロ。
注意: USB-C ケーブルは「USB 2.0 (480 Mbps、給電のみ)」「USB 3.2 Gen 2 (10 Gbps、データ転送)」「Thunderbolt 4 (40 Gbps)」の区別がある。実機自動化には データ転送対応 が必須で、給電専用ケーブルでは ADB / Xcode 接続が確立しない。
# Homebrew で基本ツール
brew install node # Appium 3.x 動作要件
brew install --cask android-platform-tools # ADB / fastboot
brew install libimobiledevice ios-deploy # iOS USB 接続管理
brew install ideviceinstaller usbmuxd # iOS 実機通信
# Xcode (Mac App Store から最新版インストール)
xcode-select --install
sudo xcodebuild -license accept
# Android Studio (Cask 経由 or 公式 .dmg)
brew install --cask android-studio
# SDK Manager で Android 14 / 15 / 16 の System Image を導入
# Appium 3.x
npm install -g appium@^3.5.0
appium driver install xcuitest
appium driver install uiautomator2
# Python テストランナー (例)
pip install appium-python-client==3.* pytest pytest-xdist opencv-python scikit-imagexcrun devicectl (Xcode 15+) または
idevice_id -l で接続端末の UDID
を取得:
$ xcrun devicectl list devices
$ idevice_id -l
00008130-001A4D2E0E8B001E # iPhone 15 Pro$ adb devices
List of devices attached
HT123456789AB device # Pixel 8
RFC456789012 device # Galaxy S24# 通常起動 (Mac の任意のポート)
$ appium server --port 4723 --base-path /wd/hub \
--use-drivers xcuitest,uiautomator2 \
--log appium.log
# 確認
$ curl http://localhost:4723/wd/hub/status┌─────────────────────────────────────────┐
│ Mac mini M4 Pro │
│ ├─ Appium 3.x server │
│ ├─ Xcode iOS Simulator (補完) │
│ ├─ Android Emulator (補完) │
│ └─ Test Runner (pytest / Mocha) │
└──────┬──────────────────────────────────┘
│ Thunderbolt 4 / USB-C
│
▼ CalDigit TS4 (USB-C ハブ)
│
├─ USB-C → iPhone 15 Pro
├─ USB-C → iPad Air M2
├─ USB-C → Pixel 8
├─ USB-C → Galaxy S24
└─ USB-A → Lightning → iPhone SE3
--allow-insecure adb_shell で並列可| 検証対象 | 実機優先 / 補完で十分 |
|---|---|
| タッチ操作・センサー・カメラ | 実機必須 |
| DRM 再生 | 実機必須 (シミュレータでは FairPlay / Widevine が動作しない) |
| 画面サイズ網羅 (Pro Max / mini / iPad Pro 13“) を補完 | iOS Simulator で十分 |
| 古い OS バージョン (iOS 17 / Android 14) | Simulator / Emulator で OS 網羅 |
| パフォーマンス測定 | 実機必須 |
| アクセシビリティ (VoiceOver / TalkBack) | 実機推奨、Simulator でも一部可 |
| 領域 | iOS / iPadOS | Android |
|---|---|---|
| 通常 UI | OpenCV + SSIM (Python) | OpenCV + SSIM (Python) |
| Canvas 領域 | OpenCV + Apple Vision Framework (Mac で実行) | OpenCV + Android ML Kit (実機オンデバイス) |
| DRM 領域 | 実機画面を Mac でキャプチャ → 手動目視 | 同左 |
| locator 修復 | 手動メンテ | 同左 |
オンデバイス ML は クラウド送信が一切発生しない ため、本書のオールローカル方針と完全に整合する。
# OpenCV による視覚 Diff (Python、Mac mini 上で動作)
import cv2
from skimage.metrics import structural_similarity as ssim
def visual_diff(baseline_png, current_png, threshold=0.95):
base = cv2.imread(baseline_png, cv2.IMREAD_GRAYSCALE)
curr = cv2.imread(current_png, cv2.IMREAD_GRAYSCALE)
score, diff_map = ssim(base, curr, full=True)
return {'pass': score >= threshold, 'score': score, 'diff_map': diff_map}スクリーンショット取得:
# iOS 実機からスクリーンショット取得 (Appium)
driver.save_screenshot('current_ios.png')
# Android 実機からスクリーンショット取得 (ADB 経由)
import subprocess
subprocess.run(['adb', '-s', 'HT123456789AB', 'exec-out', 'screencap', '-p'],
stdout=open('current_android.png', 'wb'))| 観点 | 必須要件 |
|---|---|
| ホスト | Apple Silicon Mac (M2 以降、M4 系推奨)、メモリ 32 GB 以上 |
| 実機接続 | USB-C データ転送対応ケーブル + USB-IF 認証 USB-C ハブ |
| iOS 接続 | デベロッパモード ON、Apple Developer Program 推奨 |
| Android 接続 | USB デバッグ ON、ADB で device 状態確認 |
| 視覚比較 | OpenCV + SSIM (Python) または PixelMatch (Node.js) |
| シナリオ管理 | 宣言型 YAML、Git ローカル管理 |
| データ流出ゼロ | スクリーンショット・テストログを外部送信しない |
02_回帰テスト版)
を採用| 番号 | 作業 | 担当 | 想定時間 |
|---|---|---|---|
| 1 | Mac mini を起動、Xcode / Android Studio / Appium のバージョン確認 | QA | 10 分 |
| 2 | 実機 5 台を USB-C ハブで接続、xcrun devicectl list /
adb devices で認識確認 |
QA | 5 分 |
| 3 | 各実機の OS バージョンを記録、iOS / Android 開発者モードが ON であることを確認 | QA | 5 分 |
| 4 | YAML シナリオの最新化 (前月の不具合修正で UI が変わった箇所) | QA + Dev | 1-3 時間 |
| 5 | Appium server 起動、テストランナー実行 (実機 5 台並列) | QA | 4-6 時間 |
| 6 | iOS Simulator / Android Emulator で OS 網羅補完 (iOS 17 / Android 14 等) | QA | 2 時間 |
| 7 | OpenCV / SSIM 比較で差分検出された画面の目視確認 | QA | 1-2 時間 |
| 8 | DRM 領域シナリオの手動目視レビュー (実機画面を直接観察) | QA | 30 分 |
| 9 | レポート作成、Issue 起票 | QA | 1 時間 |
| 合計 | 約 1.5 営業日 |
| 対立項目 | CI/CD 前提版 / 回帰テスト版の裁定 | ローカル実機版の裁定 |
|---|---|---|
| Appium 3.x 移行方式 | 即時全面移行 | 変更なし |
| DRM 領域ツール | Applitools Eyes / OpenCV + 手動 | OpenCV + 実機画面直接目視 |
| マルチモーダル LLM 代替 | ルールベース state machine | 変更なし + ローカル LLM 補助許可 |
| コアフレームワーク | Appium 3.x | 変更なし |
| 端末ファーム | BrowserStack / AWS Device Farm | 完全廃止、自社実機のみ |
| OS バージョン網羅 | クラウド経由で iOS 17/18/26、Android 14/15/16 | 実機購入 + Simulator/Emulator で補完 |
以下のいずれかが発生した時点で、本書を破棄し回帰テスト版
(02_回帰テスト版) または CI/CD 前提版
(01_CI-CD前提版) への移行を検討する:
| 品目 | 金額 (税込) |
|---|---|
| Mac mini M4 Pro 64 GB / 1 TB | ¥350,000 |
| iPhone 15 Pro 256 GB | ¥160,000 |
| iPhone SE3 (Lightning、レガシー用、中古可) | ¥30,000 |
| iPad Air M2 11“ 128 GB | ¥100,000 |
| Pixel 8 128 GB | ¥80,000 |
| Galaxy S24 256 GB | ¥120,000 |
| CalDigit TS4 (USB-C ハブ) | ¥45,000 |
| USB-C ケーブル × 5 + 周辺 | ¥15,000 |
| Apple Developer Program (初年度) | ¥12,800 |
| 初期投資合計 | 約 ¥912,800 |
| 年間継続支出 (2 年目以降) | 約 ¥12,800 (Apple Developer のみ) |
クラウドファーム年額 $2,700-3,600 ≈ ¥420,000-560,000 と比較し、3 年間で約 ¥600,000-870,000 のネット削減。
底本
02_回帰テスト版/次世代検証ツール選定案_問1_ネイティブアプリ_回帰テスト版.md
の参考文献をすべて引き継ぐ。ローカル実機版固有の追加情報:
devicectl (Xcode 15+ の実機管理 CLI): https://developer.apple.com/documentation/xcode/devicectl-reference