0Pricing
Android Academy · Lección

Pruebas de interfaz con Espresso

Escriba pruebas automatizadas de interfaz con Espresso. Busque vistas con onView(), interactúe con perform(), compruebe el estado con check() y pruebe las interacciones con RecyclerView.

Pruebas de interfaz con Espresso es una lección gratuita de Android Academy en CoddyKit. Esta es la lección 3 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de Android Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de Android Academy incluye 4 lecciones en total.

¿Qué es Espresso?

Espresso es el framework oficial de Android para probar interfaces de usuario. Permite escribir pruebas que interactúan con la interfaz de su aplicación: tocar botones, escribir texto, desplazarse por listas y comprobar lo que se muestra en pantalla.

Espresso se ejecuta en un dispositivo o emulador (prueba instrumentada) y se sincroniza automáticamente con el hilo de la interfaz; no necesita llamadas inestables a sleep().

Configuración

Espresso se incluye en el conjunto de herramientas de pruebas de Android. Añada estas dependencias a app/build.gradle:

// app/build.gradle:
android {
    defaultConfig {
        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    }
}

dependencies {
    androidTestImplementation 'androidx.test.ext:junit:1.1.5'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1'
    androidTestImplementation 'androidx.test.espresso:espresso-contrib:3.5.1'  // RecyclerView
}

ActivityScenarioRule

Use ActivityScenarioRule para iniciar una Activity antes de cada prueba y cerrarla después:

@RunWith(AndroidJUnit4::class)
class LoginActivityTest {

    @get:Rule
    val activityRule = ActivityScenarioRule(LoginActivity::class.java)

    @Test
    fun `login button is displayed`() {
        onView(withId(R.id.btnLogin))
            .check(matches(isDisplayed()))
    }
}

onView() y ViewMatchers

onView(matcher) busca una vista en la jerarquía actual. Combine matchers para obtener mayor precisión:

// Match by ID:
onView(withId(R.id.tvTitle))

// Match by text:
onView(withText("Submit"))

// Match by content description (for accessibility):
onView(withContentDescription("Close dialog"))

// Combine matchers:
onView(allOf(withId(R.id.btnSave), isEnabled()))

// Inside a specific parent:
onView(withId(R.id.btnSave)).inRoot(isDialog())

ViewActions: interacción con vistas

Después de encontrar una vista, realice una acción con .perform():

// Tap a button:
onView(withId(R.id.btnLogin)).perform(click())

// Type into an EditText:
onView(withId(R.id.etEmail))
    .perform(typeText("alice@example.com"), closeSoftKeyboard())

// Clear text and retype:
onView(withId(R.id.etPassword))
    .perform(clearText(), typeText("secret123"), closeSoftKeyboard())

// Scroll to a view:
onView(withId(R.id.btnSubmit)).perform(scrollTo(), click())

// Long press:
onView(withId(R.id.ivImage)).perform(longClick())

ViewAssertions: comprobación del estado

Compruebe lo que se muestra en pantalla con .check():

// View is displayed:
onView(withId(R.id.tvError)).check(matches(isDisplayed()))

// View has specific text:
onView(withId(R.id.tvTitle)).check(matches(withText("Welcome!")))

// View is not displayed (GONE or INVISIBLE):
onView(withId(R.id.progressBar)).check(matches(not(isDisplayed())))

// View is enabled:
onView(withId(R.id.btnSave)).check(matches(isEnabled()))

// View does not exist:
onView(withId(R.id.tvError)).check(doesNotExist())

Prueba completa de inicio de sesión

Una prueba completa que escribe las credenciales y toca el botón de inicio de sesión:

@Test
fun `successful login shows home screen`() {
    // Type email
    onView(withId(R.id.etEmail))
        .perform(typeText("alice@example.com"), closeSoftKeyboard())

    // Type password
    onView(withId(R.id.etPassword))
        .perform(typeText("password123"), closeSoftKeyboard())

    // Tap login button
    onView(withId(R.id.btnLogin)).perform(click())

    // Assert welcome message is shown
    onView(withId(R.id.tvWelcome))
        .check(matches(withText("Welcome, Alice!")))
}

Pruebas de RecyclerView

Use RecyclerViewActions de espresso-contrib para interactuar con los elementos de una lista:

import androidx.test.espresso.contrib.RecyclerViewActions

@Test
fun `clicking item opens detail screen`() {
    // Scroll to position 5 and click:
    onView(withId(R.id.recyclerView))
        .perform(RecyclerViewActions.actionOnItemAtPosition<RecyclerView.ViewHolder>(
            5, click()
        ))

    // Assert detail screen is shown:
    onView(withId(R.id.tvDetailTitle)).check(matches(isDisplayed()))
}

Pruebas de validación de entrada

Compruebe que aparecen mensajes de error cuando la entrada no es válida:

@Test
fun `empty email shows error message`() {
    // Leave email blank, tap login
    onView(withId(R.id.btnLogin)).perform(click())

    // Assert error is shown
    onView(withId(R.id.tilEmail))
        .check(matches(hasDescendant(withText("Email is required"))))
}

@Test
fun `short password shows error`() {
    onView(withId(R.id.etPassword))
        .perform(typeText("123"), closeSoftKeyboard())
    onView(withId(R.id.btnLogin)).perform(click())
    onView(withId(R.id.tilPassword))
        .check(matches(hasDescendant(withText("Minimum 6 characters"))))
}

Recursos de inactividad

Espresso espera automáticamente a que el hilo de la interfaz esté inactivo, pero no espera las llamadas de red ni las corrutinas. Use IdlingResource para indicar a Espresso que espere a su trabajo asíncrono:

// CountingIdlingResource: increment before async work, decrement when done
val idlingResource = CountingIdlingResource("NetworkCall")

// In your ViewModel/Repository:
idlingResource.increment()
viewModelScope.launch {
    loadData()
    idlingResource.decrement()
}

// In test setUp:
@Before
fun setUp() {
    IdlingRegistry.getInstance().register(idlingResource)
}

@After
fun tearDown() {
    IdlingRegistry.getInstance().unregister(idlingResource)
}

Ejecución de pruebas de Espresso

Ejecute pruebas instrumentadas en un dispositivo o emulador conectado:

  • En Android Studio: haga clic con el botón derecho en una clase de prueba → Ejecutar
  • Desde la terminal: ./gradlew connectedAndroidTest
  • Los resultados aparecen en app/build/reports/androidTests/

Use Android Emulator con API 28 o posterior para obtener ejecuciones de pruebas estables y rápidas. Desactive las animaciones en las opciones de desarrollador para evitar inestabilidad.

Comprobación rápida

¿Cuál es el patrón correcto de Espresso para buscar una vista y comprobar su texto?

Repaso: pruebas de interfaz de usuario con Espresso

Las pruebas automatizadas de interfaz detectan regresiones antes que los usuarios:

  • onView(matcher) — busca una vista
  • .perform(action) — toca, escribe y desplaza
  • .check(matches(...)) — comprueba la visibilidad, el texto y el estado
  • RecyclerViewActions para interactuar con listas
  • IdlingResource para operaciones asíncronas
  • Desactive las animaciones del sistema para evitar pruebas inestables

A continuación: depure y analice el rendimiento de su aplicación como un profesional.

Preguntas frecuentes

¿La lección «Pruebas de interfaz con Espresso» es gratis?

Sí — el texto completo de «Pruebas de interfaz con Espresso» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de Android Academy, actualiza a CoddyKit PRO. El curso de Android Academy incluye 4 lecciones en total.

¿Qué aprenderé en «Pruebas de interfaz con Espresso»?

Escriba pruebas automatizadas de interfaz con Espresso. Busque vistas con onView(), interactúe con perform(), compruebe el estado con check() y pruebe las interacciones con RecyclerView. Practicas Android Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.

¿Necesito experiencia previa para empezar Android Academy?

No se requiere experiencia previa. Android Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 3 de 4.

¿Cuánto tiempo toma la lección «Pruebas de interfaz con Espresso»?

La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.

¿Puedo escribir y ejecutar código en esta lección de Android Academy?

Sí. Cada lección de Android Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.

Todas las lecciones de este curso

  1. Pruebas unitarias con JUnit
  2. Mocking con Mockito
  3. Pruebas de interfaz con Espresso
  4. Depuración y profiling
← Volver a Android Academy