Las actividades sirven como contenedores para cada interacción del usuario dentro de tu app. es importante probar cómo se comportan las actividades de tu app durante eventos como los siguientes:
- Otra app, como la app de teléfono del dispositivo, interrumpe la actividad de tu app.
- El sistema elimina y vuelve a crear tu actividad.
- El usuario coloca tu actividad en un nuevo entorno de renderización en ventanas, como pantalla en pantalla (PIP) o multiventana.
En particular, es importante que te asegures de que tu actividad se comporte correctamente en respuesta a los eventos descritos en La actividad ciclo de vida.
En esta guía, se describe cómo evaluar la capacidad de tu app para mantener datos integridad y una buena experiencia del usuario a medida que se cambian las actividades de la app a través de diferentes estados en sus ciclos de vida.
Cómo administrar el estado de una actividad
Un aspecto clave al probar las actividades de tu aplicación consiste en ubicar los componentes
actividades en estados particulares. Para definir este “dado” parte de tus pruebas, usa
instancias de ActivityScenario
,
parte del
Biblioteca de prueba de AndroidX. Con esta clase, puedes hacer lo siguiente:
colocar tu actividad en estados que simulan eventos a nivel del dispositivo.
ActivityScenario
es una API multiplataforma que puedes usar en pruebas de unidades locales.
y de integración en el dispositivo. En un dispositivo real o virtual,
ActivityScenario
brinda seguridad de subprocesos, ya que sincroniza eventos entre tus
el subproceso de instrumentación de la prueba y el subproceso que ejecuta la actividad que estás probando.
La API es particularmente adecuada para evaluar cómo una actividad en el comportamiento del modelo cuando se destruye o crea. En esta sección, se presentan las vulnerabilidades los casos de uso asociados a esta API.
Cómo crear una actividad
Para crear la actividad que se está probando, agrega el código que se muestra en el siguiente fragmento:
@RunWith(AndroidJUnit4::class) class MyTestSuite { @Test fun testEvent() { launchActivity<MyActivity>().use { } } }
Después de crear la actividad, ActivityScenario
realiza la transición de esta a la
RESUMED
. Este estado indica que tu actividad se está ejecutando y está
visibles para los usuarios. En este estado, tienes la libertad de interactuar con el archivo
Elementos View
con pruebas de IU de Espresso.
Google recomienda que llames a close
en la actividad cuando se realice la prueba.
de datos completados. Esto limpia los recursos asociados y mejora el
la estabilidad de las pruebas. ActivityScenario
implementa Closeable
, por lo que puedes
aplica la extensión use
, o try-with-resources
en la clase de programación de Java
idioma, de modo que la actividad se cierre automáticamente.
También puedes usar ActivityScenarioRule
para llamar automáticamente
ActivityScenario.launch
antes de cada prueba y ActivityScenario.close
en el desmontaje de la prueba. En el siguiente ejemplo, se muestra cómo definir una regla y obtener un
de una situación a partir de él:
@RunWith(AndroidJUnit4::class) class MyTestSuite { @get:Rule var activityScenarioRule = activityScenarioRule<MyActivity>() @Test fun testEvent() { val scenario = activityScenarioRule.scenario } }
Cómo pasar la actividad a un nuevo estado
Para llevar la actividad a un estado diferente, como CREATED
o STARTED
, llama
moveToState()
Esta acción simula una situación en la que tu actividad es
detenida o pausada, respectivamente, porque la interrumpe otra app o un
acción del sistema.
En el siguiente fragmento de código, se muestra un ejemplo del uso de moveToState()
:
@RunWith(AndroidJUnit4::class) class MyTestSuite { @Test fun testEvent() { launchActivity<MyActivity>().use { scenario -> scenario.moveToState(State.CREATED) } } }
Cómo determinar el estado actual de la actividad
Para determinar el estado actual de una actividad que se está probando, obtén el valor de la
Campo state
en el objeto ActivityScenario
. Es particularmente útil
para comprobar el estado de una actividad que se está probando si esta redirige a
otra actividad o se finaliza a sí misma, como se muestra en el siguiente código
snippet:
@RunWith(AndroidJUnit4::class) class MyTestSuite { @Test fun testEvent() { launchActivity<MyActivity>().use { scenario -> scenario.onActivity { activity -> startActivity(Intent(activity, MyOtherActivity::class.java)) } val originalActivityState = scenario.state } } }
Cómo volver a crear la actividad
Cuando un dispositivo tiene pocos recursos, el sistema puede destruir una actividad,
requerir que tu app vuelva a crear esa actividad cuando el usuario regrese a ella
Para simular estas condiciones, llama a recreate()
:
@RunWith(AndroidJUnit4::class) class MyTestSuite { @Test fun testEvent() { launchActivity<MyActivity>().use { scenario -> scenario.recreate() } } }
La clase ActivityScenario
mantiene el estado de instancia guardado de la actividad y
cualquier objeto anotado con @NonConfigurationInstance
Estos objetos cargan
a la nueva instancia de la actividad que estás probando.
Cómo obtener los resultados de la actividad
Para obtener el código de resultado o los datos asociados con una actividad finalizada, obtén la
del campo result
en tu objeto ActivityScenario
, como se muestra en
el siguiente fragmento de código:
@RunWith(AndroidJUnit4::class) class MyTestSuite { @Test fun testResult() { launchActivity<MyActivity>().use { onView(withId(R.id.finish_button)).perform(click()) // Activity under test is now finished. val resultCode = scenario.result.resultCode val resultData = scenario.result.resultData } } }
Cómo activar acciones en la actividad
Todos los métodos dentro de ActivityScenario
bloquean llamadas, por lo que la API requiere
para ejecutarlas en el subproceso de instrumentación.
Para activar acciones en la actividad que estás probando, usa los comparadores de vistas de Espresso para interactuar con los elementos de tu vista:
@RunWith(AndroidJUnit4::class) class MyTestSuite { @Test fun testEvent() { launchActivity<MyActivity>().use { onView(withId(R.id.refresh)).perform(click()) } } }
Sin embargo, si necesitas llamar a un método en la actividad en sí, puedes hacerlo.
de forma segura implementando ActivityAction
:
@RunWith(AndroidJUnit4::class) class MyTestSuite { @Test fun testEvent() { launchActivity<MyActivity>().use { scenario -> scenario.onActivity { activity -> activity.handleSwipeToRefresh() } } } }