Sunday, 27 October 2013

Como mockear un servicio http en Android

Hace un tiempo encontré una librería que permite mockear servicios http en java y android, muy útil para cuando nuestro proyecto hace llamadas a consultas por WebServices y necesitamos mockearlos.
Se llama MockWebServer, y para utilizarla solamente debemos bajarla desde el sitio oficial y dejar el jar en la carpeta libs de nuestro proyecto.
ADT, por defecto, agrega todos los jars que estén en esa carpeta a nuestro buildpath.
En https://github.com/cristian04/mockwebserverdemo pueden encontrar un proyecto demo que prueba dos cosas: correr un test contra un servicio real y correr el mismo test contra un mock.
A continuación un pequeño detalle para ese proyecto:
El método sendRequest() se encarga de dos cosas. En primer lugar se conecta a una URL que es pasada por parámetro y obtiene la respuesta en formato JSON. En segundo lugar, realiza varias verificaciones con la respuesta: verifica el status code recibido y los datos de la respuesta.

Este es un test básico que hace uso de la función que nombré anteriormente y que funciona contra el servicio real (en este caso, un sitio de jsontest.com)
En este ultimo test, se pueden ver dos diferencias más: En primer lugar estamos creando una respuesta que el servidor nos tiene que devolver, dentro de MockResponse. Luego seteamos esa respuesta en el servidor y lo prendemos con server.play().
El método sendRequest() es quien hace la conexión al servidor web y quien realiza las verificaciones de la respuesta recibida.
Por ultimo, para verificar si nuestro request estuvo OK, le pedimos a nuestro mock que nos brinde los request que enviamos, mediante server.takeRequest(). Con esto podemos verificar si nuestro cliente http envió lo que realmente queríamos, verificar si el método http es correcto, si los headers están OK, si los parámetros están OK, etc.


Labels: , , , , , ,

Thursday, 19 September 2013

Android QA Automation Architecture

Después de haber participado de varios proyectos con JAVA y otros tantos en ANDROID, logre armar una arquitectura estable de desarrollo  usando integración continua. (tanto para apps, librerias y tests automáticos)
Lo que propongo con esta arquitectura es lo siguiente:

  • Correr los tests en diferentes versiones de android, tanto en emuladores como en dispositivos reales.
  • Para proyectos del tipo librería, guardar el jar con la info de sus dependencias. Para proyectos de aplicaciones o tests, guardar el apk, también con la info de sus dependencias. Tanto los jars como los apks son guardados en Artifactory, un repositorio de dependencias.
  • Permitir la resolución de dependencias propias y de terceros.
  • Mejora en el manejo de dependencias para evitar conflictos
  • Uso de arquetipos existentes para cumplir con estándares.

La arquitectura es masomenos así:



Click para ver mas grande
Para poder llevar a cabo estas features, implementé android-maven-plugin. Este plugin, nos brinda varias tareas definidas para trabajar. Entre ellas destaco las siguientes:
android:apk
  Creates the apk file. By default signs it with debug keystore.
  Change that by setting configuration parameter
  <sign><debug>false</debug></sign>.

android:apklib
  Creates the apklib file.
  apklib files do not generate deployable artifacts.

android:deploy
  Deploys the built apk file, or another specified apk, to a connected device.
  Automatically performed when running mvn integration-test (or mvn install) on
  a project with instrumentation tests.

android:devices
  DevicesMojo lists all attached devices and emulators found with the android
  debug bridge. It uses the same naming convention for the emulator as used in
  other places in the Android Maven Plugin and adds the status of the device in
  the list. TODO The goal is very simple and could be enhanced for better
  display, a verbose option to display and to take the android.device paramter
  into account.

android:emma
  After compiled Java classes use emma tool

android:emulator-start
  EmulatorStartMojo can start the Android Emulator with a specified Android
  Virtual Device (avd).

android:emulator-stop
  EmulatorStartMojo can stop the Android Emulator with a specified Android
  Virtual Device (avd).

android:emulator-stop-all
  EmulatorStopeAllMojo will stop all attached devices.

android:generate-sources
  Generates R.java based on resources specified by the resources configuration
  parameter. Generates java files based on aidl files.

android:lint
  LintMojo can run the lint command against the project. Implements parsing
  parameters from pom or command line arguments and sets useful defaults as
  well. Warning, if you use android.lint.enableClasspath and/or
  android.lint.enableLibraries the behavior of this goal will vary depending on
  the phase where this goal is executed. See
  android.lint.classpath/lintClassPath and android.lint.libraries/lintLibraries
  for more details.

android:pull
  Copy file or directory from all the attached (or specified) devices/emulators.

android:push
  Copy file to all the attached (or specified) devices/emulators.

Labels: , , , , ,

Wednesday, 10 July 2013

Android QA Automation

Hace mas o menos 3 años arranque con desarrollo de aplicaciones en Android. Hoy quiero aprovechar mi experiencia e introducirlos en otra rama, el testing.
Primeramente, necesitamos definir que tipo de test vamos a realizar, y que tipo de proyecto tenemos.
Básicamente, puedo agrupar dos tipos de proyectos Android:

  1. Lib: Se tratan de proyectos que, generalmente, no tienen interfaz gráfica y que son necesarios para otros proyectos. Por ejemplo: la librería de compatibilidad o librerias como AndEngine son proyectos librerias. Las librerias no se pueden instalar sino que deben ser usadas por proyectos del tipo aplicación. Para testear este tipo de proyectos se puede recurrir a hacer test unitario y, también a crear una aplicación "DEMO" que demuestre como funciona la librería. La automatización se hace sobre la aplicacion "DEMO" como si se tratase de un proyecto del tipo APP, pero verificando y validando la implementacion de la libreria.
  2. App: Estan compuestas por varios activities y generalmente usan librerias externas. Ademas de ejecutar unit test, se puede automatizar la UI mediante ADT o Robotium. Aqui vamos a tratar sobre este último

Robotium:

Como bien dice el sitio oficial del proyecto, Robotium es un framework de automatización de pruebas para aplicaciones nativas e híbridas. ( Uno de los problemas con los que me encontré a lo largo de mi experiencia en QA Android fue automatizar algunas webviews de aplicaciones híbridas con el framework oficial. En estos casos, Robotium pudo resolver mis problemas.)
Tip: Para desbloquear el emulador usando adb, se puede hacer mediante: adb shell input keyevent 82

Robotium hace en Android lo que Selenium hace en los Browsers (aunque el mapeo de elementos es mucho menos complicado que en selenium). Hasta tenemos un Robotium RC!!
Si bien seguimos usando el mismo framework para trabajar (ADT) estamos utilizamos otro instrumentador con el cual correr los tests (definido en el manifest)
La estructura de la clase de un test es la siguiente, conservando la nomenclatura de Junit3.

public class EditorTest extends
               
ActivityInstrumentationTestCase2<EditorActivity> {

 
private Solo solo;

 
public EditorTest() {
               
super(EditorActivity.class);
 
}

 
public void setUp() throws Exception {
        solo
= new Solo(getInstrumentation(), getActivity());
 
}
 
 
public void testPreferenceIsSaved() throws Exception {
 
                solo
.sendKey(Solo.MENU);
                solo
.clickOnText("More");
                solo
.clickOnText("Preferences");
                solo
.clickOnText("Edit File Extensions");
               
Assert.assertTrue(solo.searchText("rtf"));
               
                solo
.clickOnText("txt");
                solo
.clearEditText(2);
                solo
.enterText(2, "robotium");
                solo
.clickOnButton("Save");
                solo
.goBack();
                solo
.clickOnText("Edit File Extensions");
               
Assert.assertTrue(solo.searchText("application/robotium"));
               
 
}

   
@Override
   
public void tearDown() throws Exception {
        solo
.finishOpenedActivities();
 
}
}

Si quieren tener un poco mas de informacion, pueden visitar el sitio oficial https://code.google.com/p/robotium/wiki/Getting_Started o bajar el PDF con las instruciones aqui: -> https://robotium.googlecode.com/files/AndroidCalculatorTest.pdf 

Labels: , , , , , , , , ,