qa-testing-android
Compare original and translation side by side
🇺🇸
Original
English🇨🇳
Translation
ChineseQA Testing (Android)
Android QA测试
Android testing automation with Espresso, UIAutomator, and Compose Testing.
使用Espresso、UIAutomator和Compose Testing实现Android测试自动化。
Quick Reference
快速参考
| Task | Command |
|---|---|
| List emulators | |
| Start emulator | |
| List devices | |
| Install APK | |
| Run unit tests | |
| Run instrumented tests (connected) | |
| Run instrumented tests (GMD) | |
| List GMD tasks | `./gradlew tasks --all |
| Clear app data | |
| 任务 | 命令 |
|---|---|
| 列出模拟器 | |
| 启动模拟器 | |
| 列出设备 | |
| 安装APK | |
| 运行单元测试 | |
| 运行插桩测试(已连接设备) | |
| 运行插桩测试(GMD) | |
| 列出GMD任务 | `./gradlew tasks --all |
| 清除应用数据 | |
Quick Start (2026 Defaults)
快速入门(2026默认配置)
- Prefer Gradle Managed Devices (GMD) + ATD images for CI; use for local ad-hoc runs.
connectedAndroidTest - Enable test isolation via AndroidX Test Orchestrator for instrumented tests.
- Disable animations via Gradle (preferred) instead of per-runner ADB steps.
testOptions - Keep selectors stable: (Views),
withId()(Compose), resource-id/content-desc (UIAutomator).testTag
Recommended Gradle defaults for stable instrumented tests (version catalog names vary by project):
kotlin
android {
testOptions {
animationsDisabled = true
execution = "ANDROIDX_TEST_ORCHESTRATOR"
}
}
dependencies {
androidTestUtil(libs.androidx.test.orchestrator)
}- CI环境优先使用Gradle Managed Devices (GMD) + ATD镜像;本地临时运行使用。
connectedAndroidTest - 为插桩测试启用AndroidX Test Orchestrator以实现测试隔离。
- 通过Gradle 禁用动画(推荐方式),而非每次运行时执行ADB步骤。
testOptions - 使用稳定的选择器:(Views)、
withId()(Compose)、resource-id/content-desc(UIAutomator)。testTag
以下是稳定插桩测试推荐的Gradle默认配置(版本目录名称因项目而异):
kotlin
android {
testOptions {
animationsDisabled = true
execution = "ANDROIDX_TEST_ORCHESTRATOR"
}
}
dependencies {
androidTestUtil(libs.androidx.test.orchestrator)
}When to Use
使用场景
- Debug or stabilize flaky Android UI tests
- Add Espresso tests for View-based UIs
- Add Compose UI tests for composables
- Add UIAutomator tests for system UI or cross-app flows
- Set up an Android test gate in CI
- 调试或稳定不稳定的Android UI测试
- 为基于View的UI添加Espresso测试
- 为Composable添加Compose UI测试
- 为系统UI或跨应用流程添加UIAutomator测试
- 在CI中设置Android测试关卡
Inputs to Gather
需要收集的信息
- UI stack: Views, Compose, or mixed
- Test layer: unit, Robolectric, instrumented UI, UIAutomator/system
- CI target: PR gate vs nightly vs release; emulator vs device farm
- Device matrix: min/target API, form factors, locales (if relevant)
- Flake symptoms: timeouts, missing nodes, idling/sync, device-only issues
- App seams: DI hooks for fakes, feature flags, test accounts/test data
- UI技术栈:Views、Compose或混合栈
- 测试分层:单元测试、Robolectric测试、插桩UI测试、UIAutomator/系统测试
- CI目标:PR关卡、夜间构建或发布测试;模拟器或设备农场
- 设备矩阵:最低/目标API级别、设备形态、语言区域(如相关)
- Flake测试症状:超时、节点缺失、idle/同步问题、仅设备端出现的问题
- 应用可测试点:DI钩子用于模拟数据、功能开关、测试账号/测试数据
Testing Layers
测试分层
| Layer | Framework | Scope |
|---|---|---|
| Unit | JUnit + Mockito | JVM, no Android |
| Unit (Android) | Robolectric | JVM, simulated |
| UI (Views) | Espresso | Instrumented |
| UI (Compose) | Compose Testing | Instrumented |
| System | UIAutomator | Cross-app |
| 分层 | 框架 | 范围 |
|---|---|---|
| 单元测试 | JUnit + Mockito | JVM环境,无需Android |
| Android单元测试 | Robolectric | JVM环境,模拟Android |
| UI测试(Views) | Espresso | 需设备/模拟器运行 |
| UI测试(Compose) | Compose Testing | 需设备/模拟器运行 |
| 系统测试 | UIAutomator | 跨应用 |
Core Principles (Stability)
核心原则(稳定性)
Device Matrix
设备矩阵
- Default: emulators for PR gates; real devices for release
- Cover: min supported API level, target API level, plus tablet/foldable if supported
- 默认配置:PR关卡使用模拟器;发布测试使用真实设备
- 覆盖范围:最低支持API级别、目标API级别,若支持则包含平板/折叠屏
Flake Control
Flake测试控制
- Prefer Gradle for instrumented tests
testOptions { animationsDisabled = true } - Use AndroidX Test Orchestrator to isolate state and recover from crashes
- Use IdlingResources / Compose idling + instead of sleeps
waitUntil - Mock network with (or your DI fake) and avoid live backends
MockWebServer - Reset app state per test (test account/data, storage, feature flags)
- 插桩测试优先使用Gradle
testOptions { animationsDisabled = true } - 使用AndroidX Test Orchestrator隔离状态并从崩溃中恢复
- 使用IdlingResources / Compose idle + 替代休眠
waitUntil - 使用(或DI模拟)模拟网络,避免使用真实后端
MockWebServer - 每次测试重置应用状态(测试账号/数据、存储、功能开关)
Writing Tests
编写测试
- Espresso (Views): open
references/espresso-patterns.md - Compose: open
references/compose-testing.md - UIAutomator (system/cross-app): open
references/uiautomator.md
- Espresso(Views):打开
references/espresso-patterns.md - Compose:打开
references/compose-testing.md - UIAutomator(系统/跨应用):打开
references/uiautomator.md
Workflows
工作流程
Add a New UI Test (Instrumented)
添加新的UI测试(插桩式)
- Pick framework: Espresso (Views) vs Compose Testing vs UIAutomator boundary.
- Add stable selectors: View , Compose
id, systemModifier.testTag/resource-id.content-desc - Control externals: fake/mock network + deterministic test data.
- Add waits: IdlingResources / Compose idling + (avoid sleeps).
waitUntil - Run locally: (or a single test via runner args).
./gradlew connectedAndroidTest
- 选择框架:Espresso(Views) vs Compose Testing vs UIAutomator(边界场景)
- 添加稳定选择器:View的、Compose的
id、系统的Modifier.testTag/resource-idcontent-desc - 控制外部依赖:模拟网络 + 确定性测试数据
- 添加等待:IdlingResources / Compose idle + (避免休眠)
waitUntil - 本地运行:(或通过运行参数指定单个测试)
./gradlew connectedAndroidTest
Diagnose a Flaky Instrumented Test
诊断不稳定的插桩测试
- Confirm reproduces: run the test 10x; isolate to one device/API if needed.
- Remove nondeterminism: network, clock/timezone, locale, feature flags, animations.
- Replace sleeps with idling/explicit waits; validate your IdlingResource actually idles.
- Capture artifacts: logcat + screenshot + screen recording for failures.
- If still flaky, isolate app state (orchestrator + clear data) and bisect the interaction steps.
- 确认可复现:运行测试10次;若需则隔离到特定设备/API
- 移除非确定性因素:网络、时钟/时区、语言区域、功能开关、动画
- 用idling/显式等待替代休眠;验证你的IdlingResource确实能进入idle状态
- 捕获artifacts:logcat + 截图 + 录屏用于故障分析
- 若仍不稳定,隔离应用状态(Orchestrator + 清除数据)并二分排查交互步骤
Add a CI Gate (Preferred: GMD)
添加CI关卡(推荐:GMD)
- Configure GMD + ATD images (see ).
references/gradle-managed-devices.md - Run PR gate on a small matrix; expand via groups for nightly/release.
- Ensure artifacts upload on failure: , screenshots/logcat.
**/build/reports/androidTests/
- 配置GMD + ATD镜像(参见)
references/gradle-managed-devices.md - PR关卡运行小型设备矩阵;夜间/发布测试扩展矩阵
- 确保测试失败时上传artifacts:、截图/logcat
**/build/reports/androidTests/
ADB Commands (Triage)
ADB命令(问题排查)
bash
undefinedbash
undefinedScreenshot
截图
adb exec-out screencap -p > screenshot.png
adb exec-out screencap -p > screenshot.png
Screen recording
录屏
adb shell screenrecord /sdcard/demo.mp4
undefinedadb shell screenrecord /sdcard/demo.mp4
undefinedCI Integration
CI集成
Preferred: Gradle Managed Devices (GMD). See .
references/gradle-managed-devices.mdyaml
undefined推荐方案:Gradle Managed Devices (GMD)。参见。
references/gradle-managed-devices.mdyaml
undefined.github/workflows/android.yml
.github/workflows/android.yml
name: Android CI
on: [push, pull_request]
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-java@v4
with:
java-version: '17'
distribution: 'temurin'
- uses: gradle/actions/setup-gradle@v3
- run: ./gradlew test pixel6api34DebugAndroidTest
undefinedname: Android CI
on: [push, pull_request]
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-java@v4
with:
java-version: '17'
distribution: 'temurin'
- uses: gradle/actions/setup-gradle@v3
- run: ./gradlew test pixel6api34DebugAndroidTest
undefinedNavigating References
参考文档导航
The reference guides are intentionally large; search within them instead of loading everything:
rg -n \"^## \" frameworks/shared-skills/skills/qa-testing-android/references/compose-testing.mdrg -n \"Idling|waitUntil|Synchronization\" frameworks/shared-skills/skills/qa-testing-android/references/compose-testing.mdrg -n \"RecyclerView|Intents\" frameworks/shared-skills/skills/qa-testing-android/references/espresso-patterns.md
参考文档内容较多,建议直接搜索所需内容而非全部阅读:
rg -n \"^## \" frameworks/shared-skills/skills/qa-testing-android/references/compose-testing.mdrg -n \"Idling|waitUntil|Synchronization\" frameworks/shared-skills/skills/qa-testing-android/references/compose-testing.mdrg -n \"RecyclerView|Intents\" frameworks/shared-skills/skills/qa-testing-android/references/espresso-patterns.md
Do / Avoid
建议与禁忌
Do
建议
- Prefer orchestrator + per-test isolation for instrumented tests
- Use IdlingResources / for async waits
waitUntil - Use Robot/Page Object patterns for readability and reuse
- Run a small device matrix on PRs; expand on nightly/release
- 插桩测试优先使用Orchestrator + 单测隔离
- 异步等待使用IdlingResources /
waitUntil - 使用Robot/Page Object模式提升可读性和复用性
- PR运行小型设备矩阵;夜间/发布测试扩展矩阵
Avoid
禁忌
- for synchronization
Thread.sleep() - Tests depending on live network/backends
- Flaky selectors (localized text, position-only selectors)
- 使用进行同步
Thread.sleep() - 测试依赖真实网络/后端
- 使用不稳定的选择器(本地化文本、仅基于位置的选择器)
Resources
资源
| Resource | Purpose |
|---|---|
| references/espresso-patterns.md | Espresso matchers, actions |
| references/compose-testing.md | Compose testing guide |
| references/uiautomator.md | UIAutomator patterns (system UI) |
| references/gradle-managed-devices.md | Managed Devices for CI |
| data/sources.json | Documentation links |
| 资源 | 用途 |
|---|---|
| references/espresso-patterns.md | Espresso匹配器、操作指南 |
| references/compose-testing.md | Compose测试指南 |
| references/uiautomator.md | UIAutomator模式(系统UI) |
| references/gradle-managed-devices.md | CI用Managed Devices指南 |
| data/sources.json | 文档链接集合 |
Templates
模板
| Template | Purpose |
|---|---|
| assets/template-android-test-checklist.md | Stability checklist |
| 模板 | 用途 |
|---|---|
| assets/template-android-test-checklist.md | 稳定性检查清单 |
Related Skills
相关技能
| Skill | Purpose |
|---|---|
| software-mobile | Android development |
| qa-testing-strategy | Test strategy |
| qa-testing-mobile | Cross-platform mobile |
| 技能 | 用途 |
|---|---|
| software-mobile | Android开发 |
| qa-testing-strategy | 测试策略 |
| qa-testing-mobile | 跨平台移动测试 |