Firebase Test Lab 完整指南 — Android QA 免費神器
「我們 app 只在 Pixel 上測、Samsung Galaxy S 上就爆」 — 跨真機是 Android QA 永恆痛點。Firebase Test Lab(FTL)是 Google 維護的真機池、免費起跳、跑 100+ 設備矩陣。這篇給你完整 setup + workflow。
為什麼 FTL 是 Android 首選
flowchart LR
Choice{選 device farm?} --> FTL[Firebase Test Lab]
Choice --> BS[BrowserStack]
Choice --> SL[Sauce Labs]
Choice --> AWS[AWS Device Farm]
FTL --> F1[免費 5h/day virtual]
FTL --> F2[1h/day physical]
FTL --> F3[Pixel / Samsung / 摩托羅拉]
FTL --> F4[Crashlytics 串連]
FTL --> F5[Robo Test 自動爬]
FTL --> F6[Google Play 推薦工具]
BS --> B1[$39/月起]
BS --> B2[iOS 強]
style FTL fill:#10b981,color:#fff
style F1 fill:#10b981,color:#fff
3 種測試類型
flowchart TD
FTL[FTL 測試] --> T1[Instrumentation Test]
FTL --> T2[Robo Test]
FTL --> T3[Game Loop Test]
T1 --> T1d["寫 Espresso / UI Automator<br>完整控制、需 dev 配合"]
T2 --> T2d["不寫 code<br>AI 自動點擊探索<br>抓 crash + 截圖"]
T3 --> T3d["遊戲專用<br>跑遊戲內 looping mode"]
style T1 fill:#06b6d4,color:#fff
style T2 fill:#a855f7,color:#fff
style T3 fill:#f59e0b,color:#fff
1. Instrumentation Test(Espresso)
@RunWith(AndroidJUnit4::class)
class LoginTest {
@get:Rule
val rule = ActivityScenarioRule(LoginActivity::class.java)
@Test
fun loginWithValidCredentials() {
onView(withId(R.id.email)).perform(typeText("[email protected]"))
onView(withId(R.id.password)).perform(typeText("Test@123"))
onView(withId(R.id.loginBtn)).perform(click())
onView(withId(R.id.welcomeText)).check(matches(isDisplayed()))
}
}
Build APK + 上傳:
./gradlew assembleDebug assembleAndroidTest
gcloud firebase test android run \
--type instrumentation \
--app app/build/outputs/apk/debug/app-debug.apk \
--test app/build/outputs/apk/androidTest/debug/app-debug-androidTest.apk \
--device model=Pixel7,version=33 \
--device model=SamsungGalaxyS22,version=33 \
--device model=motox4,version=27
2. Robo Test — 不寫 code 神器
gcloud firebase test android run \
--type robo \
--app app/build/outputs/apk/debug/app-debug.apk \
--device model=Pixel7,version=33 \
--timeout 5m \
--robo-directives [email protected],loginPassword=Test@123
會發生什麼: 1. FTL 安裝 APK 2. AI 自動點擊 / 滑動 / 輸入、像猴子一樣探索 3. 5 分鐘內試圖覆蓋每個 screen 4. 抓 crash、ANR、UI freeze 5. 產出影片 + 截圖 + activity graph
5 分鐘設定 = 一週手動測試覆蓋。
3. Game Loop Test
遊戲開發者用、app 跑「demo mode」、FTL 評估 FPS / crash。本文不深入。
跨設備矩陣
flowchart TD
Matrix[Device Matrix] --> Real[Physical 真機]
Matrix --> Virt[Virtual emulator]
Real --> R1[Pixel 7/8/9]
Real --> R2[Samsung Galaxy S22/S23]
Real --> R3[OnePlus / Motorola / Nokia]
Real --> R4["100+ 機種"]
Virt --> V1[Pixel virtual 多版本]
Virt --> V2[更便宜 / 更快]
Virt --> V3["跨 API 21-34"]
style Real fill:#10b981,color:#fff
style Virt fill:#06b6d4,color:#fff
列設備池
gcloud firebase test android models list
# 列出所有可用設備
Matrix run 範例
gcloud firebase test android run \
--type instrumentation \
--app app-debug.apk \
--test app-debug-androidTest.apk \
--device model=Pixel7,version=33,locale=en,orientation=portrait \
--device model=SamsungGalaxyS22,version=33,locale=zh_TW,orientation=portrait \
--device model=Pixel3,version=28,locale=ja,orientation=landscape \
--num-flaky-test-attempts 1
CI 整合 — GitHub Actions
name: Android E2E (Firebase Test Lab)
on:
pull_request:
push:
branches: [main]
jobs:
ftl-test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-java@v4
with:
distribution: 'temurin'
java-version: '17'
- name: Build APK + Test APK
run: |
./gradlew assembleDebug assembleAndroidTest
- name: Auth Google Cloud
uses: google-github-actions/auth@v2
with:
credentials_json: ${{ secrets.GCP_SA_KEY }}
- name: Setup gcloud
uses: google-github-actions/setup-gcloud@v2
with:
project_id: my-firebase-project
- name: Run on Firebase Test Lab
run: |
gcloud firebase test android run \
--type instrumentation \
--app app/build/outputs/apk/debug/app-debug.apk \
--test app/build/outputs/apk/androidTest/debug/app-debug-androidTest.apk \
--device model=Pixel7,version=33 \
--device model=SamsungGalaxyS22,version=33 \
--results-bucket my-test-results \
--timeout 15m \
--no-record-video
Service Account 設置:
1. Google Cloud Console → IAM → Service Accounts
2. 建 SA、grant Firebase Test Lab Admin + Firebase Analytics Viewer
3. 下載 JSON key → 存 GitHub Secrets GCP_SA_KEY
結果分析
flowchart LR
Run[Test Run] --> Results[Results in Firebase Console]
Results --> R1["✓ Pass / ✗ Fail per device"]
Results --> R2[影片 replay]
Results --> R3[Screenshot at fail step]
Results --> R4[Logcat 完整 log]
Results --> R5[Performance metrics<br>CPU / Memory / Network]
Results --> R6[ANR detection]
Results --> R7[Crash stack trace]
Results --> S[Cloud Storage bucket]
S --> Download[下載 raw artifact]
style Results fill:#a855f7,color:#fff
跟 Crashlytics 串連
FTL 抓到 crash → 自動上傳 Crashlytics → 跟 production crash 同 dashboard 看。
// Initialize Crashlytics in test mode
class TestApp : Application() {
override fun onCreate() {
super.onCreate()
if (BuildConfig.DEBUG) {
FirebaseCrashlytics.getInstance().setCustomKey("env", "ftl")
}
}
}
Production crash + FTL crash 都看得到趨勢。
跟 Detox 整合
# 1. Local 跑 Detox
detox build -c android.emu.debug
# 2. 上傳到 FTL 跑跨設備
gcloud firebase test android run \
--type instrumentation \
--app android/app/build/outputs/apk/debug/app-debug.apk \
--test android/app/build/outputs/apk/androidTest/debug/app-debug-androidTest.apk \
--device model=Pixel7,version=33 \
--device model=SamsungGalaxyS22,version=33
Local Detox 快 debug + FTL 跨真機驗證。
iOS 支援 — 警告
✗ iOS 設備少(< 20 個)
✗ 大多舊版(iOS 16-17)
✗ 沒 iPad Pro 最新版
✗ 只支援 XCUITest(不支援 Detox iOS)
iOS 為主 → BrowserStack。
成本控制
| Plan | Virtual | Physical | 月費 |
|---|---|---|---|
| Spark (free) | 5 hr/day | 1 hr/day | $0 |
| Blaze (pay-as-you-go) | $1/hr | $5/hr | 按用量 |
Cost 計算
Matrix run: 5 設備 × 10 分鐘 = 50 device-minutes ≈ 0.83 hr
Daily cost: 0.83 × $5 = $4.15
每天跑 4 次 (PR + nightly):
$4.15 × 4 = $16.60/day
$500/month
省錢策略: - 80% virtual + 20% physical - 只在 main / release 跑 full matrix - PR 只跑 Pixel + Samsung 兩個 - Robo Test 替代部分 Instrumentation
Robo Test 進階
Robo Directives — 引導測試
gcloud firebase test android run \
--type robo \
--app app-debug.apk \
--device model=Pixel7,version=33 \
--robo-directives \
"[email protected],loginPassword=Test@123,IGNORE_skipBtn=,CLICK_loginBtn="
[email protected]— text 欄位自動填IGNORE_skipBtn=— 跳過某按鈕CLICK_loginBtn=— 強制點某按鈕
Robo Script — 錄製手動操作
# 1. 錄製
gcloud firebase test android run --type robo \
--robo-script myscript.json
Android Studio 內可以「錄製」操作 → 存成 script → 上傳跑。
反模式
flowchart TD
Anti[FTL 反模式] --> A1["每 PR 跑 30 個設備"]
Anti --> A2["全用 physical、燒錢"]
Anti --> A3["不看 Robo Test 結果"]
Anti --> A4["不設 timeout"]
Anti --> A5["不串 Crashlytics"]
Anti --> A6["iOS 硬要用 FTL"]
Anti --> A7["不存 result bucket"]
style A1 fill:#ef4444,color:#fff
style A2 fill:#ef4444,color:#fff
style A3 fill:#ef4444,color:#fff
style A4 fill:#ef4444,color:#fff
style A5 fill:#ef4444,color:#fff
style A6 fill:#ef4444,color:#fff
style A7 fill:#ef4444,color:#fff
跟 BrowserStack / Sauce Labs 對比
| 維度 | Firebase Test Lab | BrowserStack | Sauce Labs |
|---|---|---|---|
| Android 設備 | 100+ 真機 | 100+ | 100+ |
| iOS 設備 | < 20、老 | 100+ 含最新 | 100+ |
| 起跳價 | 免費 5h/day | $39/month | 企業向 |
| Robo Test | ✓ 內建 | ✗ | ✗ |
| Crash 整合 | Crashlytics | Manual | Manual |
| CI 體驗 | gcloud CLI | REST API | API |
| Game testing | Game Loop | ✗ | ✗ |
| 真機 vs 雲端 | 真實設備 | 真實設備 | 真實設備 |
給 Android QA 的 5 句
- Android 為主、FTL 是首選
- Robo Test 是 baseline 探索神器、必用
- 80% virtual + 20% physical 省錢
- CI 串 gcloud CLI、SA key 用 Secrets
- iOS 為主請另尋 BrowserStack
最後
Firebase Test Lab 是 Android QA 最被低估的免費神器。Robo Test 一鍵跨 5 個設備、5 分鐘抓 crash、配合 Crashlytics + Crashlytics + Performance Monitoring 串成完整 Android quality 體系。從每天免費跑 5 hr 起步、半年後你會問「為什麼以前沒早點用」。
延伸: - Mobile App Testing 入門(Appium vs Detox) - Cross-browser Testing 策略 - GitHub Actions × Playwright 完整實戰