测试助手
- 作者仓库星标 49,853
- 作者更新于 实时读取
- 作者仓库 expo
- 领域
- 工程开发
- 兼容 Agent
-
- Claude Code
- Cursor
- Cline
- Codex
- Windsurf
- Gemini CLI
- +20
- 信任分
- 88 / 100 · 社区维护
- 作者 / 版本 / 许可
- @expo · 未声明 license
- Token 消耗评级
- 低消耗
- 接入复杂程度
- 需简单配置
- 是否需要外部 API Key
- 不需要
- 兼容的系统
- 未声明(默认跨平台)
- 底层运行要求
- 无特殊要求
- 文件与系统权限
-
- 只读
- 允许写入 / 修改
- Shell 执行
- 网络行为
- 仅限本地
- 安装命令数
- 26 条
档案由构建时根据 SKILL.md 与安装命令自动衍生,可能与作者实际意图存在差异。
需要注意: 未限定 allowed-tools,默认拥有全部工具权限。
---
name: android-e2e-testing
description: Test Expo Router features on Android emulators using ADB. Use after implementing native Android…
category: 工程开发
runtime: 无特殊运行时
---
# android-e2e-testing 输出预览
## PART A: 任务判断
- 适用问题:代码实现、重构、调试或代码审查。
- 输入要求:目标材料、限制条件、期望输出和验收方式。
- 证据边界:围绕“When to Use / Prerequisites / Step 1: Build and Launch”读取原文规则,不把推断写成作者承诺。
## PART B: 执行结果
- **01** 任务判断:确认你的需求是否属于代码实现、重构、调试或代码审查,并标出输入、限制和预期结果。
- **02** 执行计划:优先按“When to Use / Prerequisites / Step 1: Build and Launch”拆成步骤,说明每一步会读取什么、修改什么、产出什么。
- **03** 交付结果:给出可复制的命令、文件改动、检查清单或内容草稿,并说明如何继续迭代。
- **04** 风险边界:结合 读取文件、写入/修改文件、执行终端命令、主要在本地完成、通常不需要额外 API Key 给出执行前确认项。
## Running Rules
- 读取文件、写入/修改文件、执行终端命令;主要在本地完成;通常不需要额外 API Key。
- 先小样例验证,再放大到真实任务。
- 交付时同时给结果、检查口径和下一步迭代建议。 原文出现了 `/sdcard`、`/tmp` 这类斜杠命令;如果你的 Agent 支持命令触发,优先用命令开场,再补充目标和边界。
告诉 Agent 目标文件或材料、期望结果、不可改范围、是否允许联网或执行命令。本 Skill 的权限画像是:读取文件、写入/修改文件、执行终端命令。
先用一个小任务确认它会围绕“When to Use / Prerequisites / Step 1: Build and Launch”工作;涉及文件或命令时,先看 diff、日志、预览或测试结果。
检查最终产物是否包含明确结果、必要证据和下一步动作;如果输出泛泛而谈,就补充输入、边界和验收标准后重跑。
---
name: android-e2e-testing
description: Test Expo Router features on Android emulators using ADB. Use after implementing native Android…
category: 工程开发
source: expo/expo
---
# android-e2e-testing
## 什么时候使用
- 用于组织测试、定位失败并形成修复闭环 适合处理工程开发场景下的代码实现、调试、重构、测试或代码审查,核心价值是把输入、判断、执行、验证和交付边界固定下来,避免 Agent 泛泛回答。 把任务拆成可执行、可检查、可继续迭代的步骤;通常不需…
- 面向代码实现、重构、调试或代码审查,优先处理能明确输入、步骤和验收标准的工作。
## 需要提供什么
- 目标材料、目录范围、期望结果和不可改动内容。
- 是否允许联网、执行命令、读写文件或调用外部服务。
## 执行规则
- 围绕「When to Use / Prerequisites / Step 1: Build and Launch」组织步骤,不把推断写成作者事实。
- 读取文件、写入/修改文件、执行终端命令;主要在本地完成;通常不需要额外 API Key。
- 先跑小样例,确认结果可检查后再扩大任务范围。
## 输出要求
- 给出最终产物、关键证据、验证方式和下一步动作。
- 信息不足时标记 unknown,不编造命令、平台或依赖。 作者原文负责流程事实;仓库文件负责来源和命令;流狐只补充适用场景、限制和质量判断。
skill "android-e2e-testing" {
输入层 -> 用户目标 + 目标文件 + 禁止范围 + 验收标准
上下文层 -> When to Use / Prerequisites / Step 1: Build and Launch
规则层 -> SKILL.md 触发条件 / 执行顺序 / 输出格式
运行层 -> 无特殊运行时 | 读取文件、写入/修改文件、执行终端命令 | 主要在本地完成
安全层 -> 通常不需要额外 API Key + 小任务验证 + diff / 日志复核
输出层 -> 可复制结果 + 检查清单 + 下一步迭代
} Android E2E Testing for Expo Router
Use adb to manually test Expo Router screens and components on Android emulators.
When to Use
- After implementing or modifying native Android UI components (toolbars, tabs, menus)
- When verifying Jetpack Compose components (
@expo/ui/jetpack-compose) - When running the
native-navigationor other E2E apps on Android - Before opening a PR that touches Android-specific behavior
Prerequisites
An Android emulator must be running. Prefer Pixel emulators over tablet ones for standard phone-sized testing.
# Verify emulator is connected
adb devices
# Check which emulator is running
adb -s DEVICE_ID emu avd name
# Check screen resolution (important for coordinate calculations)
adb -s DEVICE_ID shell wm size
Step 1: Build and Launch
Router E2E apps
Package name: dev.expo.routere2e
Each app in apps/router-e2e/__e2e__/ has a corresponding yarn android:<name> script. Check apps/router-e2e/package.json for available scripts.
cd apps/router-e2e
yarn android:[APP_NAME] # e.g. yarn android:native-navigation
If the app is already built, relaunch it:
adb shell monkey -p dev.expo.routere2e -c android.intent.category.LAUNCHER 1
To find the package name of any installed app:
adb shell pm list packages | grep -i <keyword>
Step 2: Navigate Using UI Dump
CRITICAL: Always use uiautomator dump for element coordinates. Screenshot pixel coordinates have display scaling factors that make them unreliable for adb shell input tap. The UI dump provides actual device coordinates.
Dump the view hierarchy
adb shell uiautomator dump /sdcard/ui.xml && adb shell cat /sdcard/ui.xml
This returns XML with every UI element including:
text— displayed textcontent-desc— accessibility description (useful for icon buttons)bounds— position as[left,top][right,bottom]clickable— whether the element responds to tapsclass— Android view class
Find and tap an element
- Search the XML for your target element by
textorcontent-desc - Extract the
boundsattribute:bounds="[left,top][right,bottom]" - Calculate center:
x = (left + right) / 2,y = (top + bottom) / 2 - Tap:
adb shell input tap <x> <y>
Example: For bounds="[367,498][714,633]":
- x = (367 + 714) / 2 = 540
- y = (498 + 633) / 2 = 565
adb shell input tap 540 565
Wait for navigation to settle
After tapping a navigation element, wait before verifying:
sleep 1
For slow transitions or heavy screens, use sleep 2.
Step 3: Interact
Tap items
adb shell input tap <x> <y>
Scroll
# Scroll down
adb shell input swipe 540 1500 540 500 300
# Scroll up
adb shell input swipe 540 500 540 1500 300
# Scroll further (larger distance)
adb shell input swipe 540 1500 540 200 500
Type text
adb shell input text "hello%sworld" # %s = space
Press hardware buttons
adb shell input keyevent 4 # Back
adb shell input keyevent 3 # Home
adb shell input keyevent 82 # Menu / React Native dev menu
Long press
adb shell input swipe <x> <y> <x> <y> 1000
Step 4: Verify
Visual verification via screenshot
adb shell screencap -p /sdcard/screenshot.png && adb pull /sdcard/screenshot.png /tmp/screenshot.png
Then use the Read tool to view /tmp/screenshot.png. Screenshots are useful for:
- Confirming visual appearance (colors, layout, styling)
- Verifying toolbar/tab positioning
- Checking selection states and visual feedback
Note: Use screenshots for visual verification only. For element positions and tapping, always use uiautomator dump.
Programmatic verification via UI dump
adb shell uiautomator dump /sdcard/ui.xml && adb shell cat /sdcard/ui.xml
Search the XML for expected content:
- Verify text content appears
- Check
content-descfor accessibility labels - Confirm element presence after navigation
- Verify selection states (look for checkmarks, content-desc changes)
Check for errors
# React Native JS errors
adb logcat -d -s ReactNativeJS:E | tail -20
# Crash logs
adb logcat -b crash -d
# All recent errors
adb logcat -d *:E | tail -30
Step 5: Report Results
After testing, summarize results in a table:
| Test | Result |
|---|---|
| Navigation to screen | PASS/FAIL |
| Component renders correctly | PASS/FAIL |
| Interaction works | PASS/FAIL |
| No JS errors in logcat | PASS/FAIL |
Include details for any failures: what was expected vs what happened, relevant logcat output, and screenshots.
Preferably attach screenshots for features you tested.
Testing Jetpack Compose Components
Components from @expo/ui/jetpack-compose (like HorizontalFloatingToolbar, IconButton, Host) render as Compose views inside React Native. In UI dumps they appear as:
androidx.compose.ui.platform.ComposeView— the Compose containerandroid.widget.HorizontalScrollView— inside toolbar layoutsandroid.widget.Button— Compose buttonsandroid.view.Viewwithcontent-desc— icon buttons with accessibility labels
When testing Compose components:
- Look for
content-descattributes to identify buttons (e.g.,content-desc="Clear selection") - The
ComposeViewwrapper may have different bounds than the inner interactive elements - Tap the interactive element's bounds, not the container's
Troubleshooting
uiautomator dump fails or returns empty
This can happen during animations or transitions. Wait and retry:
sleep 2 && adb shell uiautomator dump /sdcard/ui.xml && adb shell cat /sdcard/ui.xml
Tap doesn't register
- Recalculate coordinates from a fresh UI dump — the layout may have shifted
- Ensure you're tapping a
clickable="true"element - Try tapping the parent element if the child isn't clickable
App navigated to wrong screen or went to home
- The Back button (
keyevent 4) can exit the app entirely if on the root screen - Use
monkeycommand to relaunch:adb shell monkey -p dev.expo.routere2e -c android.intent.category.LAUNCHER 1 - Wait 2 seconds after launch before interacting
Metro bundler not connecting
adb reverse tcp:8081 tcp:8081
App crashes on launch
# Check crash buffer
adb logcat -b crash -d
# Look for fatal exceptions
adb logcat -d | grep -A 10 "FATAL EXCEPTION"
Reload the app
# Open React Native dev menu and tap Reload
adb shell input keyevent 82
# Or force-stop and relaunch
adb shell am force-stop dev.expo.routere2e && adb shell monkey -p dev.expo.routere2e -c android.intent.category.LAUNCHER 1
Disable Animations (Recommended for Testing)
Disabling animations prevents flaky UI dumps and makes testing more reliable:
adb shell settings put global window_animation_scale 0
adb shell settings put global transition_animation_scale 0
adb shell settings put global animator_duration_scale 0
Re-enable when done:
adb shell settings put global window_animation_scale 1
adb shell settings put global transition_animation_scale 1
adb shell settings put global animator_duration_scale 1
Complete Example: Testing a Toolbar Screen
# 1. Launch app
adb shell monkey -p dev.expo.routere2e -c android.intent.category.LAUNCHER 1
sleep 2
# 2. Dump UI to find navigation button
adb shell uiautomator dump /sdcard/ui.xml && adb shell cat /sdcard/ui.xml
# Find: content-desc="Android Toolbar" bounds="[367,498][714,633]"
# Center: (540, 565)
# 3. Navigate to screen
adb shell input tap 540 565
sleep 1
# 4. Take screenshot to verify visual appearance
adb shell screencap -p /sdcard/screenshot.png && adb pull /sdcard/screenshot.png /tmp/screenshot.png
# 5. Dump UI to find toolbar buttons
adb shell uiautomator dump /sdcard/ui.xml && adb shell cat /sdcard/ui.xml
# Find buttons by content-desc: "Clear selection", "Select all", "Delete", "Add"
# 6. Test toolbar interactions
adb shell input tap 457 2233 # "Select all" button center
sleep 1
# 7. Verify state changed
adb shell screencap -p /sdcard/screenshot.png && adb pull /sdcard/screenshot.png /tmp/screenshot.png
# 8. Check for errors
adb logcat -d -s ReactNativeJS:E | tail -20
先判断是否适合
作者设计意图
作者的方法与取舍
边界和复核