---
title: Firebase Test Lab 完整指南 — Android QA 免費神器（Robo / Instrumentation / Game Loop）
description: Firebase Test Lab 完整指南。3 種測試類型、跨真機矩陣、Robo auto-explorer、CI 整合（gcloud + GitHub Actions）、vs BrowserStack 對比、iOS 限制、成本控制、常見坑。
category: automation
tags: [firebase-test-lab, android, mobile, gcloud, robo-test]
date: 2026-06-18
faq:
  - q: Firebase Test Lab 跟 BrowserStack 該選哪個？
    a: Android 優先 → FTL（免費起跳、Google 親兒子、設備新）。iOS 為主 → BrowserStack（FTL iOS 設備少且舊）。新案先 FTL 跑 Android、iOS 補 BrowserStack。
  - q: Robo Test 真的能取代寫 case 嗎？
    a: 不能取代但能補位。Robo 自動點擊探索整個 app、抓 crash + 截圖。當 baseline regression、5 分鐘設定省一週。但 deep flow 還是要 Espresso / Detox。
  - q: 免費額度夠用嗎？
    a: 個人 / 小團隊夠：每天 5 hr virtual + 1 hr physical（Spark plan）。大團隊或 nightly 跑全 matrix → 升 Blaze pay-as-you-go ($5/hr physical / $1/hr virtual)。
  - q: 跟 Detox / Appium 能整合嗎？
    a: 可以。Detox 跑 Espresso APK → 上傳 FTL 跑。Appium 不直接支援、但有 plugin。最佳工作流 = local Detox + FTL 跨真機驗證。
---

# Firebase Test Lab 完整指南 — Android QA 免費神器

「我們 app 只在 Pixel 上測、Samsung Galaxy S 上就爆」 — 跨真機是 Android QA 永恆痛點。**Firebase Test Lab（FTL）是 Google 維護的真機池、免費起跳、跑 100+ 設備矩陣**。這篇給你完整 setup + workflow。

## 為什麼 FTL 是 Android 首選

```mermaid
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 種測試類型

```mermaid
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）

```kotlin
@RunWith(AndroidJUnit4::class)
class LoginTest {
    @get:Rule
    val rule = ActivityScenarioRule(LoginActivity::class.java)

    @Test
    fun loginWithValidCredentials() {
        onView(withId(R.id.email)).perform(typeText("qa@test.com"))
        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 + 上傳：

```bash
./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 神器

```bash
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 loginEmail=qa@test.com,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。本文不深入。

## 跨設備矩陣

```mermaid
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
```

### 列設備池

```bash
gcloud firebase test android models list
# 列出所有可用設備
```

### Matrix run 範例

```bash
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

```yaml
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`

## 結果分析

```mermaid
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 看。

```kotlin
// 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 整合

```bash
# 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 — 引導測試

```bash
gcloud firebase test android run \
  --type robo \
  --app app-debug.apk \
  --device model=Pixel7,version=33 \
  --robo-directives \
      "loginEmail=qa@test.com,loginPassword=Test@123,IGNORE_skipBtn=,CLICK_loginBtn="
```

- `loginEmail=qa@test.com` — text 欄位自動填
- `IGNORE_skipBtn=` — 跳過某按鈕
- `CLICK_loginBtn=` — 強制點某按鈕

### Robo Script — 錄製手動操作

```bash
# 1. 錄製
gcloud firebase test android run --type robo \
  --robo-script myscript.json
```

Android Studio 內可以「錄製」操作 → 存成 script → 上傳跑。

## 反模式

```mermaid
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 句

1. **Android 為主、FTL 是首選**
2. **Robo Test 是 baseline 探索神器、必用**
3. **80% virtual + 20% physical 省錢**
4. **CI 串 gcloud CLI、SA key 用 Secrets**
5. **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）](/automation/mobile-testing-appium-detox.html)
- [Cross-browser Testing 策略](/automation/cross-browser-testing.html)
- [GitHub Actions × Playwright 完整實戰](/automation/github-actions-playwright.html)
