Arquitectura de Aplicaciones · 2012. 5. 14. · • Trabajar con el sistema de ficheros del...
Transcript of Arquitectura de Aplicaciones · 2012. 5. 14. · • Trabajar con el sistema de ficheros del...
Especialista Universitario en Desarrollo de Aplicaciones para Dispositivos Móviles
© 2011-2012 Depto. Ciencia de la Computación e IA
Android avanzado
Sesión 4: Depuración y pruebas
Especialista Universitario en Desarrollo de Aplicaciones para Dispositivos Móviles
© 2011-2012 Depto. Ciencia de la Computación e IADepuración y pruebas Android avanzado - 2
Puntos a tratar
• Depuración con Eclipse• Log y LogCat• Dalvik Debug Monitor Server (DDMS)
• Pruebas unitarias con JUnit para Android• Pruebas de regresión con Robotium• Pruebas de estrés con Monkey
Especialista Universitario en Desarrollo de Aplicaciones para Dispositivos Móviles
© 2011-2012 Depto. Ciencia de la Computación e IADepuración y pruebas Android avanzado - 3
Log
• El logging es el sistema de depuración más ampliamente utilizado.
• Android clasifica los mensajes de log por:• Etiqueta (tag)• Prioridad• Fecha / hora • Aplicación que los lanza (PID)
private static final String TAG = "MiActivity";//... en los métodos:
Log.i(TAG, "Mensaje de ejemplo: indice=" + i);
Especialista Universitario en Desarrollo de Aplicaciones para Dispositivos Móviles
© 2011-2012 Depto. Ciencia de la Computación e IADepuración y pruebas Android avanzado - 4
Log
• Según el nivel de depuración utilizaremos una llamada de las siguientes:• Log.v(): Verbose• Log.d(): Debug• Log.i(): Info• Log.w(): Warning• Log.e(): Error
• Con esta información el Log podrá ser mostrado filtrando los mensajes menos importantes
Especialista Universitario en Desarrollo de Aplicaciones para Dispositivos Móviles
© 2011-2012 Depto. Ciencia de la Computación e IADepuración y pruebas Android avanzado - 5
Log y LogCat
• En Eclipse contamos con la vista LogCat • Si no se muestra por defecto se puede añadir• Podemos realizar filtrado por etiquetas para ver sólo los mensajes
que nos interesan. • Los mensajes van apareciendo en tiempo real, tanto si estamos
con un emulador como si estamos con un dispositivo móvil conectado por USB.
• Se recomienda eliminar todas las llamadas a Log cuando se publica un programa en el Android Market, a pesar de que en los dispositivos de los usuarios no se vería ningún log ni salida estándar.
Especialista Universitario en Desarrollo de Aplicaciones para Dispositivos Móviles
© 2011-2012 Depto. Ciencia de la Computación e IADepuración y pruebas Android avanzado - 6
Dalvik Debug Monitor Server (DDMS)
• DDMS: Servidor de depuración ejecutable desde terminal o desde Eclipse
• Cada aplicación se ejecuta en su propia VM• Cada VM tiene un puerto al que el debugger se conecta• Cuando conectamos un dispositivo se crea un servicio de
monitorización entre adb y DDMS, que notifica a DDMS cuando una VM del dispositivo arranca o termina
• DDMS recoge su PID a través de adb y abre una conexión con el debugger de la VM
• DDMS maneja múltiples depuradores conectados cada uno a una VM
Especialista Universitario en Desarrollo de Aplicaciones para Dispositivos Móviles
© 2011-2012 Depto. Ciencia de la Computación e IADepuración y pruebas Android avanzado - 7
Funcionalidades de DDMS
• Visualización del uso de memoria heap• Seguimiento de reservas de memoria para objetos• Trabajar con el sistema de ficheros del emulador o del
dispositivo• Examinar la información de hilos• Profiling de métodos: seguimiento de medidas tales como
número de llamadas, tiempo de ejecución, etc.• LogCat• Emulación de operaciones de telefonía y localización• Cambiar el estado de red y simular red lenta
Especialista Universitario en Desarrollo de Aplicaciones para Dispositivos Móviles
© 2011-2012 Depto. Ciencia de la Computación e IADepuración y pruebas Android avanzado - 8
Funcionalidades de DDMS - Eclipse
Especialista Universitario en Desarrollo de Aplicaciones para Dispositivos Móviles
© 2011-2012 Depto. Ciencia de la Computación e IADepuración y pruebas Android avanzado - 9
Pruebas con JUnit
• Pruebas unitarias: pruebas de métodos aislados• Pruebas de regresión: pruebas de los componentes en
conjunto a lo largo de la evolución del software• JUnit para Android permite programar distintos tipos de
pruebas agrupados en casos de prueba, a su vez agrupables en suites de pruebas.
• Se pueden incluir las pruebas dentro del mismo proyecto o en un proyecto aparte
Especialista Universitario en Desarrollo de Aplicaciones para Dispositivos Móviles
© 2011-2012 Depto. Ciencia de la Computación e IADepuración y pruebas Android avanzado - 10
Crear un proyecto de pruebas
Especialista Universitario en Desarrollo de Aplicaciones para Dispositivos Móviles
© 2011-2012 Depto. Ciencia de la Computación e IADepuración y pruebas Android avanzado - 11
Crear un caso de prueba
• Se crea una clase que herede de ActivityInstrumentationTestCase2<Activity>
• Debe estar en un (sub)paquete del paquete donde está el código (aunque esté en un proyecto aparte)
• Incluirá constructor y métodos setUp( ) y tearDown( )• Las pruebas serán métodos cuyo nombre empieza por
“test”• Se utilizan sentencias assert para invalidar pruebas:
assertEquals( ), assertTrue( ), assertNotNull( ) ...
Especialista Universitario en Desarrollo de Aplicaciones para Dispositivos Móviles
© 2011-2012 Depto. Ciencia de la Computación e IADepuración y pruebas Android avanzado - 12
Crear un caso de prueba
Especialista Universitario en Desarrollo de Aplicaciones para Dispositivos Móviles
© 2011-2012 Depto. Ciencia de la Computación e IADepuración y pruebas Android avanzado - 13
Crear un caso de pruebapackage es.ua.jtech.av.suma.test;import android.test.ActivityInstrumentationTestCase2;import es.ua.jtech.av.suma.MainActivity; public class MainActivityTest extends ActivityInstrumentationTestCase2<MainActivity> { public MainActivityTest() { super("es.ua.jtech.av.suma", MainActivity.class); } protected void setUp() throws Exception { super.setUp(); } public void test1(){ // asserts } protected void tearDown() throws Exception { super.tearDown(); }}
Especialista Universitario en Desarrollo de Aplicaciones para Dispositivos Móviles
© 2011-2012 Depto. Ciencia de la Computación e IADepuración y pruebas Android avanzado - 14
Obtener referencias a componentes
• Se pueden declarar como campos de la clase• Se obtienen a través de getActivity().findViewById(id)
private Button bt; protected void setUp() throws Exception { super.setUp(); MainActivity activity = getActivity(); bt = (Button)activity.findViewById(
es.ua.jtech.av.suma.R.id.button1);}
Especialista Universitario en Desarrollo de Aplicaciones para Dispositivos Móviles
© 2011-2012 Depto. Ciencia de la Computación e IADepuración y pruebas Android avanzado - 15
Trabajar con los componentes
• Se pueden cambiar valores• Se pueden obtener y comprobar valores• Ejemplo de evaluación de un resultado
assertEquals("32.3", miTextView.getText().toString());
Especialista Universitario en Desarrollo de Aplicaciones para Dispositivos Móviles
© 2011-2012 Depto. Ciencia de la Computación e IADepuración y pruebas Android avanzado - 16
Simular eventos de usuario
• Clase TouchUtils
TouchUtils.tapView(this, miEditText);sendKeys("S");sendKeys("i");sendKeys("NUMPAD_DOT");TouchUtils.clickView(this, bt);
Especialista Universitario en Desarrollo de Aplicaciones para Dispositivos Móviles
© 2011-2012 Depto. Ciencia de la Computación e IADepuración y pruebas Android avanzado - 17
Ejecutar las pruebas
• Run as / Android JUnit Test• Resultados mostrados en una vista de Eclipse:
Especialista Universitario en Desarrollo de Aplicaciones para Dispositivos Móviles
© 2011-2012 Depto. Ciencia de la Computación e IADepuración y pruebas Android avanzado - 18
Otros tipos de pruebas
• Aparte de ActivityInstrumentationTestCase2 hay otras alternativas que también heredan de las clases de JUnit:• AndroidTestCase que sólo ofrece el contexto local y no el de la
aplicación.• ServiceTestCase que se usa para probar servicios.• ActivityUnitTestCase que crea la actividad pero no la conecta al
entorno, de manera que se puede utilizar un contexto o aplicación mock.
• ApplicationTestCase para probar subclases propias de Application.
Especialista Universitario en Desarrollo de Aplicaciones para Dispositivos Móviles
© 2011-2012 Depto. Ciencia de la Computación e IADepuración y pruebas Android avanzado - 19
Robotium
• "Robotium es como Selenium pero para Android" • Robotium no permite grabar las acciones del usuario sino
que la secuencia de acciones debe ser programada a través de sencillas llamadas a los métodos de Robotium.
• Soporta• Activity• Dialog• Toast• Menu• ContextMenu
Especialista Universitario en Desarrollo de Aplicaciones para Dispositivos Móviles
© 2011-2012 Depto. Ciencia de la Computación e IADepuración y pruebas Android avanzado - 20
Robotium
• Ventajas• Desarrollar casos de prueba sin necesidad de conocer el
funcionamiento interno de la aplicación probada.• Automatizar el manejo múltiples actividades de Android.• Pruebas realistas, al realizarse sobre los componentes GUI en
tiempo de ejecución• Integración con Maven y Ant para ejecutar pruebas como parte de
una integración continua.
• Desarrollado sobre JUnit
Especialista Universitario en Desarrollo de Aplicaciones para Dispositivos Móviles
© 2011-2012 Depto. Ciencia de la Computación e IADepuración y pruebas Android avanzado - 21
Crear pruebas con Robotium
• Incluir robotium-solo-3.1.jar en el proyecto
Especialista Universitario en Desarrollo de Aplicaciones para Dispositivos Móviles
© 2011-2012 Depto. Ciencia de la Computación e IADepuración y pruebas Android avanzado - 22
Crear pruebas con Robotiumpackage es.ua.jtech.av.miproyecto.test;import android.test.ActivityInstrumentationTestCase2;import es.ua.jtech.av.miproyecto.MainActivity;import com.jayway.android.robotium.solo.Solo; public class TestMainActivity extends ActivityInstrumentationTestCase2<MainActivity> { private Solo solo; public TestMainActivity(){ super("es.ua.jtech.av.miproyecto", MainActivity.class); } @Override protected void setUp() throws Exception { super.setUp(); solo = new Solo(getInstrumentation(), getActivity()); } @Override protected void tearDown() throws Exception { solo.finishOpenedActivities(); }}
Especialista Universitario en Desarrollo de Aplicaciones para Dispositivos Móviles
© 2011-2012 Depto. Ciencia de la Computación e IADepuración y pruebas Android avanzado - 23
Métodos de Robotium
• Una prueba de ejemplo usando la clase Solo de Robotium:
public void test1(){ solo.enterText(0,"10"); solo.enterText(1,"22.4"); solo.clickOnButton("+"); assertTrue(solo.searchText("32.4"));}
Especialista Universitario en Desarrollo de Aplicaciones para Dispositivos Móviles
© 2011-2012 Depto. Ciencia de la Computación e IADepuración y pruebas Android avanzado - 24
Métodos de Robotium
• Otros ejemplos:• getView(id)• getCurrentTextViews(textView)• setActivityOrientation(Solo.LANDSCAPE)• sendKey(Solo.MENU)• clickOnButton(text)• clickOnText(text)• clickOnEditText(text)• clearText(text)• enterText(text)• goBack()• sleep(millis)
Especialista Universitario en Desarrollo de Aplicaciones para Dispositivos Móviles
© 2011-2012 Depto. Ciencia de la Computación e IADepuración y pruebas Android avanzado - 25
Pruebas de estrés con Monkey
• Simula input del usuario aleatorio• Probar que haga lo que haga el usuario con la GUI, la
aplicación no tendrá un comportamiento inesperado• No tiene por qué tener sentido• Simula eventos de teclado, tanto qwerty como teclas
hardware especializadas, movimientos de trackball, apertura y cierre del teclado, rotaciones de la pantalla
• Ejemplo: solicitamos 1000 eventos simulados cada 100 milisegundos obteniendo la lista de ellos (opción -v) y afectará a las aplicaciones del paquete es.ua.jtech.av
adb shell monkey -p es.ua.jtech.av -v --throttle 100 1000
Especialista Universitario en Desarrollo de Aplicaciones para Dispositivos Móviles
© 2011-2012 Depto. Ciencia de la Computación e IADepuración y pruebas Android avanzado - 26
Reproducir prueba de Monkey
• Fijar la semilla aleatoria para reproducir la misma secuencia de acciones aleatorias. Opción -s
• Sirve para reproducir un problema encontrado tantas veces como sea necesario
• Por otro lado se puede obtener la secuencia de acciones
Especialista Universitario en Desarrollo de Aplicaciones para Dispositivos Móviles
© 2011-2012 Depto. Ciencia de la Computación e IADepuración y pruebas Android avanzado - 27
¿Preguntas...?