Token导航 LogoToken导航TokenDH.com
研究检索需要联网github未标认证来源可访问许可证需确认审计通过

android-e2e-testing-setupAndroid e2e 测试设置

Agent Skill

用于辅助测试设计、自动化测试、用例整理和回归验证。它适合让 Agent 编写单元测试、端到端测试、测试计划或根据失败日志定位问题。使用时需要确认项目测试框架、运行命令和夹具数据,避免为了通过测试而改坏真实逻辑;涉及浏览器或外部服务时,应区分本地模拟、测试环境和生产环境。

总安装

188

周安装

8

GitHub Stars

3

下载量

66
CodexClaudeCursorGemini CLI

安装说明

本站只整理中文说明和来源信息,不托管安装包,也不代用户安装。

GitHub

来源数

2

许可证

unknown

最后核验

2026-05-01

来源状态

来源可访问

安装方式

通过对话安装

复制提示词发给支持本地命令或 Skills 的 AI 助手,先确认命令和权限,再让它执行。

请帮我安装这个 Agent Skill:android-e2e-testing-setup(Android e2e 测试设置)
来源仓库:https://github.com/hitoshura25/claude-devtools
仓库路径:skills/android-e2e-testing-setup
安装命令:
npx skills add https://github.com/hitoshura25/claude-devtools --skill android-e2e-testing-setup
安装前请先检查当前环境是否支持对应 CLI,并向我确认将要执行的命令、安装目录、联网范围和文件读写权限;确认后再执行。

命令行安装

复制命令到本机终端执行。该命令会通过 npx skills 从第三方来源获取 Skill;本站只展示命令,不托管安装包,也不自动执行。

skills.shnpx skills
npx skills add https://github.com/hitoshura25/claude-devtools --skill android-e2e-testing-setup

简介

快速搭建基于 UI Automator 2.4 的轻量级冒烟测试,验证应用启动稳定性。

  • 兼容 debug 与 release 构建,无需开启调试模式即可执行外部交互。
  • 自动检测设备连接状态并添加必要测试依赖项。
  • 需确保设备/模拟器可用且最小 SDK 为 21+,避免因环境缺失导致测试失败。
  • android-e2e-testing-setup 属于研究检索类 Skill,可作为该场景下的辅助能力补充。

SKILL.md

Android E2E Testing Setup

Sets up a lightweight smoke test using UI Automator 2.4 to verify the app launches without crashing.

Works with BOTH debug and release builds because UI Automator interacts with apps externally (doesn't require debuggable builds).

Prerequisites

  • Android project with Gradle
  • Minimum SDK 21+
  • Device or emulator available (MANDATORY)

Process

Step 1: Add Dependencies

Update app/build.gradle.kts:

dependencies {
    // UI Automator 2.4 - Modern API with built-in waiting
    androidTestImplementation("androidx.test.uiautomator:uiautomator:2.4.0-alpha05")

    // AndroidX Test
    androidTestImplementation("androidx.test:core:1.5.0")
    androidTestImplementation("androidx.test:runner:1.5.2")
    androidTestImplementation("androidx.test.ext:junit:1.1.5")

    // Truth assertions
    androidTestImplementation("com.google.truth:truth:1.1.5")
}

Note: UI Automator 2.4 introduces a modern Kotlin DSL. See: https://developer.android.com/training/testing/other-components/ui-automator

Step 1b: Configure Test Build Type for Release Testing (Optional)

To run instrumented tests against the release build (for ProGuard validation), add this to app/build.gradle.kts:

android {
    // ... existing config ...

    // Change test build type from "debug" to "release"
    // This makes connectedAndroidTest run against release builds
    // IMPORTANT: Both app and test APK will be signed with release key
    testBuildType = "release"
}

What this does:

  • ./gradlew connectedAndroidTest now runs against release build
  • Both app APK and test APK are signed with the same (release) key
  • ProGuard/R8 runs on the app APK
  • Tests validate the actual release build

When to use this:

  • During release validation (before publishing)
  • To catch ProGuard/R8 issues
  • CI/CD release pipelines

When NOT to use this:

  • Day-to-day development (debug builds are faster)
  • When you don't have release signing configured locally

To toggle back to debug testing:

testBuildType = "debug"  // Or just remove the line (debug is default)

Step 2: Create Smoke Test

Create app/src/androidTest/kotlin/{package_path}/SmokeTest.kt:

package {PACKAGE_NAME}

import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.uiautomator.uiAutomator
import androidx.test.uiautomator.UiAutomatorTestScope
import com.google.common.truth.Truth.assertThat
import org.junit.Test
import org.junit.runner.RunWith

/**
 * Smoke test using modern UI Automator 2.4 API.
 *
 * This test works with BOTH debug and release APKs because UI Automator
 * interacts with the app externally (doesn't require debuggable build).
 *
 * Primary purpose: Validate app launches without crashing.
 * For release builds: Validates ProGuard/R8 didn't break critical code paths.
 *
 * @see https://developer.android.com/training/testing/other-components/ui-automator
 */
@RunWith(AndroidJUnit4::class)
class SmokeTest {

    companion object {
        private const val PACKAGE_NAME = "{PACKAGE_NAME}"
    }

    @Test
    fun appLaunches_doesNotCrash() = uiAutomator {
        // Start the app
        startApp(PACKAGE_NAME)

        // Wait for app to be visible
        waitForAppToBeVisible(PACKAGE_NAME)

        // Handle HealthConnect permission dialogs if they appear
        handleHealthConnectPermissions()

        // Verify app is running by checking for any element with our package
        val appElement = onElementOrNull(5000) {
            packageName == PACKAGE_NAME
        }

        assertThat(appElement).isNotNull()
    }

    @Test
    fun appLaunches_hasVisibleContent() = uiAutomator {
        // Start the app
        startApp(PACKAGE_NAME)
        waitForAppToBeVisible(PACKAGE_NAME)

        // Handle permissions
        handleHealthConnectPermissions()

        // Verify app has UI content (didn't crash to blank screen)
        val appStillRunning = onElementOrNull(2000) {
            packageName == PACKAGE_NAME
        }

        assertThat(appStillRunning).isNotNull()
    }

    // =========================================================================
    // HealthConnect Permission Handling
    // =========================================================================

    /**
     * Navigate through HealthConnect permission UI.
     *
     * HealthConnect has a multi-screen permission flow:
     * 1. Data permissions screen - toggle "Allow all" then click "Allow"
     * 2. Background access screen - click "Allow"
     */
    private fun UiAutomatorTestScope.handleHealthConnectPermissions() {
        // Screen 1: Data permissions ("fitness and wellness data")
        val dataPermScreen = onElementOrNull(3000) {
            text?.contains("fitness and wellness data") == true
        }

        if (dataPermScreen != null) {
            // Click "Allow all" toggle to enable all permissions
            onElementOrNull(1000) { text == "Allow all" }?.click()

            // Click "Allow" button at bottom
            onElement {
                text == "Allow" && className == "android.widget.Button"
            }.click()
        }

        // Screen 2: Background access ("access data in the background")
        val backgroundScreen = onElementOrNull(2000) {
            text?.contains("access data in the background") == true
        }

        if (backgroundScreen != null) {
            // Click "Allow" button
            onElement {
                text == "Allow" && className == "android.widget.Button"
            }.click()
        }
    }

    // =========================================================================
    // Standard Runtime Permissions (Optional)
    // =========================================================================

    /**
     * Handle standard Android runtime permission dialogs.
     */
    private fun UiAutomatorTestScope.handleRuntimePermissions() {
        val allowButton = onElementOrNull(1000) {
            text?.matches(Regex("(?i)allow|while using the app")) == true
        }
        allowButton?.click()
    }
}

Replace {PACKAGE_NAME} with the actual package name (e.g., com.hitoshura25.healthsync).

To find the package name:

grep "applicationId" app/build.gradle.kts
# Or check AndroidManifest.xml
grep "package=" app/src/main/AndroidManifest.xml

Note: The UiAutomatorTestScope extension functions allow accessing the scope's methods like onElement from within helper functions.

Verification (MANDATORY)

DO NOT SKIP THIS STEP

Prerequisite: Device/Emulator Required

First, verify a device or emulator is available:

adb devices

If no devices listed:

  1. Start an emulator: # List available AVDs emulator -list-avds # Start an emulator (replace with actual AVD name) emulator -avd Pixel_6_API_34 & # Wait for device to be ready adb wait-for-device
  2. Or connect a physical device with USB debugging enabled
  3. Re-run adb devices to confirm

If no device/emulator available, STOP. Inform user this skill cannot complete without a device.

Run Tests

# Run debug tests
./gradlew connectedDebugAndroidTest

If tests fail:

  1. Read the error message carefully
  2. Fix compilation errors (usually import issues)
  3. Fix test failures (adjust permission handling if needed)
  4. Re-run until tests pass

Only proceed to completion when tests pass.

Expected Output

> Task :app:connectedDebugAndroidTest
Tests on Pixel_6_API_34 - 14

SmokeTest > appLaunches_doesNotCrash PASSED
SmokeTest > appLaunches_hasVisibleContent PASSED

2 tests, 2 passed, 0 failed

Completion Criteria

Do NOT mark complete unless ALL are verified:

  • UI Automator 2.4 dependency in app/build.gradle.kts
  • SmokeTest.kt exists using modern uiAutomator {} API
  • ./gradlew connectedDebugAndroidTest executes successfully
  • At least 2 tests pass
  • Device/emulator was used (tests cannot run without one)

If tests fail, fix them before marking complete.

Troubleshooting

No device found

Cause: No connected device or running emulator Fix: Start emulator or connect physical device (see Verification section)

Tests fail to compile

Cause: Incorrect package name in SmokeTest.kt Fix: Verify package name matches AndroidManifest.xml

Permission dialog blocks test

Cause: App requires permissions not handled in handleHealthConnectPermissions() Fix: See PERMISSION_DEBUGGING.md for guide on debugging UI Automator selectors

"waitForAppToBeVisible timed out"

Cause: App crashed or took too long to start Fix: Check logcat: adb logcat -d | grep -i crash

UI Automator 2.4 API Benefits

The modern API provides several advantages over the old approach:

Old API (deprecated)New API (UI Automator 2.4)
UiDevice.getInstance(...)uiAutomator {} scope
device.waitForIdle()waitForAppToBeVisible()
device.findObject(UiSelector().text("X"))onElement {text == "X"}
Manual timeout loopsBuilt-in timeout: onElement(5000) {}
element.exists() + clickonElementOrNull {}?.click()
device.findObject(By.pkg(...))onElement {packageName == "..."}

Key benefits:

  • Cleaner Kotlin DSL
  • Built-in waiting (no more waitForIdle() everywhere)
  • More readable predicates
  • Better null handling with onElementOrNull
  • Works with non-debuggable APKs (can test actual release builds)

Next Steps

After smoke tests pass:

  1. For release testing: Install release APK and run tests against it (see android-release-validation)
  2. Add more comprehensive tests if needed (use android-additional-tests skill)
  3. Integrate with CI/CD pipeline

适合场景

01

用户想查找某类 Agent Skill 时

02

需要根据任务场景推荐可安装能力包时

03

需要对比不同来源的安装命令和来源信息时

能力概览

能力 1

按任务关键词查找相关 Skills

能力 2

展示可复制的安装命令

能力 3

保留来源站点、仓库和原始说明,方便继续核验

能力 4

展示第三方安全扫描或审计结果

安装后应在对应宿主中按原始 README 的触发条件使用;具体调用方式请以来源页面和 README 为准。

平台分布

Codex

38.7%
按下载量换算26

Claude

28.99%
按下载量换算19

Cursor

20.15%
按下载量换算13

Gemini CLI

9.08%
按下载量换算6

安全审计

Gen Agent Trust Hub

通过

Socket

通过

Snyk

通过

权限和风险

需要联网

该 Skill 可能需要联网访问来源站点、仓库或外部 API;具体网络访问范围需要结合源码和 README 复核。

安装前确认

本站仅展示第三方公开信息,不托管安装包,不提供自动安装或运行环境。安装前应自行审查源码、依赖和命令行为。当前只有一个来源,正式发布前建议补源仓库或其他目录站核验。

来源信息

继续浏览同类 Skills