Mobile App Testing 入門 — Appium vs Detox 怎麼選、跨平台策略、device farm
Mobile QA 完整入門。原生 / 跨平台 / hybrid 三種 app 差異、Appium vs Detox 取捨、跟 Web testing 不同的坑、雲端 device farm 選擇。
💡 本文原刊於 qa.9niche.com,2026-08 併入 9niche.com 懶人包,內容照原文完整搬遷。
目錄
1. 前言
「網站測試我會、mobile 也差不多吧」是新人最大的誤解。Mobile testing 是另一個物種 — 不同 OS、不同裝置尺寸、不同網路、推播、相機、權限、deep link… 痛點是 web 的 3-5 倍。這篇講 QA 從 web 跨到 mobile 該注意什麼。
2. 三種 App 你要先分清楚
| 類型 | 例子 | 測試難度 | 自動化選 |
|---|---|---|---|
| Native | Twitter (early)、Uber、銀行 App | 高(要兩套) | XCUITest + Espresso 或 Appium |
| Cross-platform | Discord、Bloomberg、Meta | 中 | Detox(RN)/ Patrol(Flutter)/ Appium |
| Hybrid | 多數中小 App | 低 | Appium / 通用 web 工具 |
測試前先問:「我們是哪種 App?」 — 工具選錯後面會吐血。
3. Mobile vs Web 的 5 大差異
1. OS / 裝置碎片化
- iOS:相對單純,但 iOS 16/17/18 + iPad / iPhone SE/15 Pro Max 都要測
- Android:地獄。Samsung S24、Pixel 8、小米 14 都有自家 ROM 微調。Android 8 ~ 14 都還有人用
對策:選 top 5 機種覆蓋 80% 使用者 → 看你 Firebase Analytics 數據決定。
2. 網路情境
| 情境 | 怎麼測 |
|---|---|
| 慢速 4G | Charles Proxy / Network Link Conditioner |
| 切換 WiFi ↔ 4G | 中途切看 reconnect |
| 完全離線 | 飛航模式 |
| 不穩 / 高延遲 | Throttling |
3. 推播與背景
Push notification 必測:
- App 開啟時收到
- App 背景時收到
- App 完全 kill 時收到
- 點通知開到正確頁面(deep link)
- 通知 payload 含特殊字元 / emoji
- 連續多則通知 batching
4. 權限 flow
首次安裝 → 開 App → 觸發功能(拍照/位置/推播)→
彈權限 → 使用者允許 / 拒絕 / 「不要再問」→
不同分支 UX 都要測
權限拒絕後的 fallback path 常被忽略。
5. App lifecycle
- Foreground → Background(按 Home)
- Background → Foreground 回來
- Memory pressure 被 kill
- Cold start vs Warm start
- 來電中、收到簡訊
測試:跑流程到一半切走 / 切回,看狀態保留嗎?
4. 自動化工具二選一:Appium vs Detox
Appium — 通用之王
優點:
- 跨平台同一份 code 跑 iOS + Android
- 支援 Native / Cross / Hybrid
- 業界標準、社群大、工作機會多
- 可寫 Python / Java / JS / Ruby
缺點:
- 慢(每步都要過 WebDriver protocol)
- Selector 不穩定(要用 Accessibility ID)
- iOS 跑特別慢
- 環境配置複雜(Xcode + Android SDK + Node + Java...)
Detox — React Native 神器
優點:
- 灰盒測試(跟 app process 同步)
- 比 Appium 快 5-10 倍
- Auto-sync — 不用自己 wait
- React Native 一等公民
缺點:
- 只支援 RN
- iOS Simulator + Android Emulator only(不能跑真機)
- 學習曲線比 Appium 陡
我的選擇規則
| 你的情境 | 選 |
|---|---|
| RN App + 內部團隊 | Detox(速度、穩定) |
| Native App + 兩位專家分 iOS/Android | XCUITest + Espresso |
| 中小團隊、要跨平台共用 | Appium |
| Flutter | Patrol 或 Flutter Driver |
| Hybrid / WebView | Appium(其中 webview 部分用 Selenium) |
5. Appium 快速體驗
環境
brew install node android-platform-tools
npm install -g appium
appium driver install xcuitest
appium driver install uiautomator2
第一支 test(Python)
from appium import webdriver
from appium.options.android import UiAutomator2Options
from appium.webdriver.common.appiumby import AppiumBy
options = UiAutomator2Options()
options.platform_name = 'Android'
options.device_name = 'Pixel_8_API_34'
options.app = '/path/to/app.apk'
options.automation_name = 'UiAutomator2'
driver = webdriver.Remote('http://localhost:4723', options=options)
# 選元素優先順序:
# 1. Accessibility ID (跨平台、最穩)
login_btn = driver.find_element(AppiumBy.ACCESSIBILITY_ID, 'login_button')
login_btn.click()
# 2. ID (Android resource-id / iOS name)
email = driver.find_element(AppiumBy.ID, 'email_input')
email.send_keys('[email protected]')
# 3. XPath (最後手段)
# 不要常用 - 慢、脆弱
跑
# 開 Appium server
appium
# 另一個 terminal 跑 test
python tests/test_login.py
6. Detox 快速體驗(RN)
// e2e/login.test.js
describe('Login', () => {
beforeEach(async () => {
await device.reloadReactNative();
});
it('logs in successfully', async () => {
await element(by.id('email-input')).typeText('[email protected]');
await element(by.id('password-input')).typeText('Pass@123');
await element(by.id('login-button')).tap();
await expect(element(by.text('Welcome'))).toBeVisible();
});
});
跑:
detox build -c ios.sim.debug
detox test -c ios.sim.debug
7. 跨平台 selector 策略
團隊規範:
- 跟 dev 約定每個元素加
accessibilityID="meaningful-name" - 命名規則:
<screen>-<element>-<action>,例如login-email-input - Avoid 用 visible text(i18n 換語言就壞)
8. Device Farm — 雲端真機
本機跑 Simulator / Emulator 不夠真實。真機很重要。
| 服務 | 強項 | 弱項 |
|---|---|---|
| BrowserStack | UI 好、設備多 | 貴 |
| Sauce Labs | 老牌、企業 | 貴 |
| AWS Device Farm | 跟 AWS 整合 | UI 差 |
| Firebase Test Lab | Android 強、Google 親兒子 | iOS 少 |
| LambdaTest | 便宜 | 設備新但社群小 |
| 自架(OpenSTF) | 完全可控 | 維護成本 |
新團隊推薦:BrowserStack 或 Firebase Test Lab。設備數量、穩定度最值得。
9. 環境準備陷阱
iOS
- Mac 必備(Xcode 只能 Mac 跑)
- Apple Developer 帳號 ($99/yr) 真機 sign
- Simulator 跟真機 behavior 不同(Push、Touch ID)
- 每個 Xcode 升級可能打死 Appium driver
Android
- Windows / Mac / Linux 都可
- Emulator 慢、最好真機
- 不同 OEM 行為不同(華為跟 Samsung 行為差異大)
- ADB 偶爾掛掉要重啟
10. CI 整合 — 痛點最深
節奏:
- PR:Simulator/Emulator E2E(10-15 分鐘)
- Nightly:真機 device farm(多裝置)
- Release:全裝置 + 多 OS 版本
不要 PR 跑真機 — 太慢、會被罵。
11. 反模式
- 本機過就 push — 你 Pixel 8 過、別人 Samsung S20 爆
- 跑 release build 才測 — Release / Debug 行為不同,提早遇到
- 不測權限 fallback — 拒絕後 app crash 上 store 退
- 不測 deep link — push / 廣告連進來 crash
- 忘了測直 / 橫排 — 旋轉 90 度爆 layout
- iOS only / Android only 心態 — 必須兩平台都會
- 不測網路差 — 高鐵上一定壞
12. QA 跨進 Mobile 的學習路線
時程:3-6 個月。
13. 工具速查
| 工具 | 用途 |
|---|---|
| Appium Inspector | 看 UI element tree |
| Charles Proxy | 攔網路流量、改 response |
| Stetho | Android Chrome DevTools |
| Reactotron | React Native debugger |
| Flipper | RN / Native 通用 debugger |
| adb logcat | Android log |
| Xcode Console | iOS log |
| TestFlight | iOS beta 派發 |
| Firebase App Distribution | Android beta 派發 |
14. 最後
Mobile QA 痛苦但薪資 / 職缺都比純 web 多。學完之後你不只是 web QA、是「跨平台 QA 工程師」— 職涯路寬一倍。從手動測一個 App 開始,下一篇進自動化選 Appium 或 Detox。
相關連結
Firebase Test Lab 完整指南。3 種測試類型、跨真機矩陣、Robo auto-explorer、CI 整合(gcloud + GitHub Actions)、vs BrowserStack 對比、iOS 限制、成本控制、常見坑。
Detox 完整指南。React Native E2E 框架、灰盒測試原理、Sync 機制、Page Object 適配、Mocking、CI 整合(GitHub Actions + Firebase Test Lab)、跟 Appium 對比。
從零搭起 API 測試框架。pytest fixtures、requests session、JSON schema 驗證、auth 處理、CI 整合,附完整範例。
相關懶人包
2026 QA 趨勢實戰:我看到的 5 個轉變(AI、Shift-Left、Observability)
從手動 QA 到 AI 輔助、從測試金字塔到測試獎盃。這篇分享我這 10+ 年看 QA 從「測完才知道」到「shift-left + AI」的真實觀察。
2026 QA 面試的 AI 題 — 12 題 + 答題框架(面試官想聽什麼)
2026 QA 面試新增一整類「你怎麼用 AI」的問題。這篇整理 12 個高頻 AI 面試題、每題附面試官真正想聽的點與答題框架,從「你用過哪些 AI 工具」到「AI 生的 test 怎麼信任」。
AI / LLM 功能 Spec Review — 幻覺 / 評估 / 成本 / 法遵 8 個必問
AI 功能 spec review 完整指南。LLM 不確定性處理、評估指標、Prompt versioning、成本控制、安全護欄、法遵(EU AI Act / GDPR)、Fallback、人工 review 流程。
一般聲明
本站提供之資訊僅供參考,不保證其完整性與正確性。使用者應自行判斷資訊之適用性。