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 estadoRecyclerViewActionspara interactuar con listasIdlingResourcepara 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
- Pruebas unitarias con JUnit
- Mocking con Mockito
- Pruebas de interfaz con Espresso
- Depuración y profiling