2010-01-18 25 views
16

Estoy en el proceso de trabajar en un conjunto de pruebas automatizadas para nuestra aplicación Android, y tengo problemas para esperar a que las actividades se carguen por completo. Puedo llamar a getActivity, pero solo porque muestra la actividad que espero ver en mi prueba no siempre significa que los componentes de la actividad estén listos para su uso (completamente cargados). Mirar a través de la API de actividad no resultó en nada, y otros métodos parecen demasiado invasivos y han arruinado el estado inicial de las pruebas. ¿Alguien sabe si hay una manera de preguntarle a la aplicación o al VM si la actividad actual está cargada?¿cómo puedes saber cuándo se terminó de cargar una actividad de Android?

Respuesta

0

Puede haber una manera más elegante, pero ¿intentó configurar un booleano al final de su método OnCreate()?

+2

Después de onCreate hay onStart y onResume ... –

+0

Eso es más elegante que mi método actual "tocar todo lo que se puede tocar/leer todo lo que se pueda leer", pero ¿onCreate significa realmente que se ha creado realmente? Al observar el flujo del proceso de actividades, parece que onResume podría ser incluso mejor. Intentaré ambos y veré si todavía tengo problemas. ¡Gracias por la inspiración rápida! Les dejaré saber todos los resultados. Hasta entonces, si alguien más conoce una forma de consultar el ActivityManager (o cualquier otra cosa) para esto, hágamelo saber. – Derrick

+0

No use onCreate sure –

1

Si crea un método setUp() así en el caso de test que se extiende ActivityInstrumentationTestCase2<MyActivity>

@Override 
protected void setUp() throws Exception { 
    super.setUp(); 

    final MyActivity activity = getActivity(); 

    tv1 = (EditNumber)activity.findViewById(resId1); 
    tv2 = (EditNumber)activity.findViewById(resId2); 
} 

su actividad estará en pleno funcionamiento y el diseño cargado, se demuestra en este caso por el hecho de que se puede acceder a las vistas y su contenido

@SmallTest 
public void testSimpleCreate() { 
    final MyActivity activity = getActivity(); 
    assertNotNull(activity); 

    assertNotNull(tv1); 
    assertEquals("mystr1", tv1.getText().toString()); 
    assertNotNull(tv1); 
    assertEquals("mystr2", tv2.getText().toString()); 
} 
+0

Esta sugerencia anterior es la clave de mi problema. Actualmente puedo consultar la aplicación para la actividad actual, pero incluso después de que la actividad actual coincida con la que estoy esperando, la llamada a findViewById a menudo fallará (aparentemente porque aunque la actividad está en la parte superior de la pila de actividades, no todas las vistas están cargadas.) Nuestra solución inmediata fue colocar el código de prueba en la pantalla, pero esto también es frágil ya que de vez en cuando, nuestro sueño no es suficiente. – Derrick

+0

Aunque sí veo en el registro de logcat que el ActivityManager responde para decir que la actividad dada ahora se "muestra". No sé si eso significa que la actividad ahora está completamente cargada y lista para ser abusada o no, y tampoco sé cómo obtener esa información programáticamente. Gracias a todos por su ayuda con esto. Por favor, avíseme si me falta algo del ejemplo expuesto anteriormente por dtmilano (¡no sería la primera vez!) – Derrick

+0

Después de 'setContentView()', todo debería estar accesible en su jerarquía de vistas. Diría que la única excepción son las vistas que se cargan de forma asíncrona, como las filas individuales de un 'ListView' que está vinculado a una fuente de datos. –

3

Como ya he mencionado en a comment, su jerarquía de vistas debería estar trabajando después de su llamada a setContentView() temprano en onCreate(). Nunca he tenido ningún problema como este con ninguna actividad o clase de prueba.

No estoy seguro de que esto sea de alguna ayuda para este caso específico, pero en general puede determinar cuándo la cola de eventos de la interfaz de usuario está vacía llamando al getInstrumentation().waitForIdleSync(). Eso bloqueará hasta que no haya más eventos de UI que procesar.

+0

Creo que nuestro problema fue con los elementos tostados lanzando una llave en el tiempo. Su segunda sugerencia es algo en lo que me gustaría profundizar más, pero parece que requerirá que nos extiendamos desde la clase InstrumentationTestCase. ¿Hay alguna otra forma de obtener beneficios de instrumentación sin extender lo que sabes? – Derrick

+0

¿Dónde se llamaban tus tostadas? ¿Qué clase estás extendiendo en este momento? –

+0

Nuestros brindis se llaman principalmente de actividades a través de clases internas anónimas que implementan una clase de tarea asíncrona abstracta para mensajes simples de error/éxito.Nuestras clases de prueba se extienden desde una clase principal que importa desde junit y hamcrest sin extensión, y creo que esperábamos dejarlo sin fijar de esa manera. No veo otra manera de conectarme a la funcionalidad de instrumentación. Si hay, házmelo saber. De lo contrario, si hay otra manera de usar tostadas que evitará que cause este problema, eso sería bueno también. Gracias:) – Derrick

Cuestiones relacionadas