hitoshura25/claude-devtools

android-test-structure

Create androidTest directory structure with base classes and utilities

First seen Jan 27, 2026

Installation

$ npx skills add hitoshura25/claude-devtools --skill android-test-structure

Similar popular skills

Related neighbors and high-traction skills in the same topics — useful to compare before installing.

Also in this package

Other skills from hitoshura25/claude-devtools · top by installs.

npx skills add hitoshura25/claude-devtools

Browse all from hitoshura25/claude-devtools

More details

Agent compatibility

Declared targets from SKILL.md / docs. Unmarked agents are not listed — the skill may still install via the CLI.

Claude Code Not declared
Cursor Not declared
Codex Not declared
GitHub Copilot Not declared
Windsurf Not declared
Gemini CLI Not declared
Cline Not declared
OpenCode Not declared

Repository health

Stars 3
License LICENSE
Default branch main
Open issues 0
Status Active

Skill metadata

Parsed from SKILL.md frontmatter.

Version1.0.0

Package contents

Files included with this skill beyond the listing page.

  • skill md SKILL.md 5,803 B
  • docs SUMMARY.md 100 B

History

  1. First seen on skills.sh
  2. First recorded snapshot · 8 installs

SKILL.md

Android Test Structure

Creates androidTest directory structure with base test class and utilities for Espresso testing.

Prerequisites

  • Android project with Gradle
  • Espresso dependencies added (run android-espresso-dependencies first)
  • Package name known

Inputs

Input Required Default Description
project_path Yes . Android project root
package_name Yes - App package (e.g., com.example.app)

Process

Step 1: Create Directory Structure

# Get package path from package name (com.example.app -> com/example/app)
PACKAGE_PATH=$(echo "${PACKAGE_NAME}" | tr '.' '/')

# Create androidTest directories
mkdir -p "app/src/androidTest/kotlin/${PACKAGE_PATH}/base"
mkdir -p "app/src/androidTest/kotlin/${PACKAGE_PATH}/utils"
mkdir -p "app/src/androidTest/kotlin/${PACKAGE_PATH}/screens"

Step 2: Create BaseTest.kt

Create app/src/androidTest/kotlin/${PACKAGE_PATH}/base/BaseTest.kt:

package ${PACKAGE_NAME}.base

import android.content.Context
import androidx.test.core.app.ApplicationProvider
import androidx.test.ext.junit.rules.ActivityScenarioRule
import org.junit.After
import org.junit.Before
import org.junit.Rule

/**
 * Base class for all instrumented tests.
 * Provides common setup, teardown, and utilities.
 */
abstract class BaseTest {

    protected val context: Context = ApplicationProvider.getApplicationContext()

    @Before
    open fun setUp() {
        // Common setup for all tests
        // Override in subclasses for specific setup
    }

    @After
    open fun tearDown() {
        // Common cleanup
        // Override in subclasses for specific cleanup
    }

    /**
     * Wait for idle state before proceeding
     */
    protected fun waitForIdle() {
        androidx.test.espresso.Espresso.onIdle()
    }
}

Step 3: Create TestUtils.kt

Create app/src/androidTest/kotlin/${PACKAGE_PATH}/utils/TestUtils.kt:

package ${PACKAGE_NAME}.utils

import android.view.View
import androidx.recyclerview.widget.RecyclerView
import androidx.test.espresso.UiController
import androidx.test.espresso.ViewAction
import androidx.test.espresso.matcher.ViewMatchers.isAssignableFrom
import org.hamcrest.Matcher

object TestUtils {

    /**
     * Custom action to get RecyclerView item count
     */
    fun getRecyclerViewItemCount(recyclerView: RecyclerView): Int {
        return recyclerView.adapter?.itemCount ?: 0
    }

    /**
     * Wait for a condition with timeout
     */
    fun waitForCondition(
        timeoutMs: Long = 5000,
        condition: () -> Boolean
    ): Boolean {
        val startTime = System.currentTimeMillis()
        while (System.currentTimeMillis() - startTime < timeoutMs) {
            if (condition()) return true
            Thread.sleep(100)
        }
        return false
    }

    /**
     * Custom ViewAction to perform click on specific position
     */
    fun clickOnViewChild(viewId: Int): ViewAction {
        return object : ViewAction {
            override fun getConstraints(): Matcher<View>? {
                return null
            }

            override fun getDescription(): String {
                return "Click on a child view with specified id."
            }

            override fun perform(uiController: UiController, view: View) {
                val v = view.findViewById<View>(viewId)
                v.performClick()
            }
        }
    }
}

Step 4: Create README for Tests

Create app/src/androidTest/README.md:

# Android E2E Tests

This directory contains end-to-end UI tests using Espresso.

## Structure

- `base/` - Base classes for all tests
- `utils/` - Test utilities and helpers
- `screens/` - Screen-specific test classes

## Running Tests

All tests

./gradlew connectedAndroidTest

Specific test class

./gradlew connectedAndroidTest -Pandroid.testInstrumentationRunnerArguments.class=com.example.app.screens.MainActivityTest


## Writing Tests

1. Extend `BaseTest` for common setup
2. Use utilities from `TestUtils`
3. Follow AAA pattern: Arrange, Act, Assert

Verification

MANDATORY: Run these commands:

# Verify directory structure exists
test -d app/src/androidTest && echo "✓ androidTest directory created"

# Verify base classes exist
test -f app/src/androidTest/kotlin/*/base/BaseTest.kt && echo "✓ BaseTest.kt created"

# Verify utils exist
test -f app/src/androidTest/kotlin/*/utils/TestUtils.kt && echo "✓ TestUtils.kt created"

Expected output:

  • ✓ androidTest directory created
  • ✓ BaseTest.kt created
  • ✓ TestUtils.kt created

Outputs

Output Location Description
Directory structure app/src/androidTest/ Test source directory
BaseTest class base/BaseTest.kt Common test setup
Test utilities utils/TestUtils.kt Helper functions
README README.md Test documentation

Troubleshooting

"Package path incorrect"

Cause: Package name format wrong Fix: Use format: com.example.app (not path format)

"Directory already exists"

Cause: androidTest directory already created Fix: Merge with existing structure, don't overwrite

Completion Criteria

  • app/src/androidTest/ directory exists
  • base/BaseTest.kt exists
  • utils/TestUtils.kt exists
  • screens/ directory exists
  • README.md created