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: , , , , , ,

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: , , , , , , , , ,

Monday, 28 May 2012

Using Safari Webdriver


Hi all:
Recently the selenium team has released the safaridriver extension than allows the communication between WebDriver and the browser.
However, this extension is only available for Safari 5+ and you need  tune up you browser before you can install it. In addition, you need to compile the extension from the sources.
Here are all the steps with a few screenshots to help you in all the process.
I hope these steps be useful
Cheers,



Requisites


Installation steps

Safari Extension:
Compiling
If you dont want to compile the extension, or if you have problems when compiling, you can use download a precompiled extension from here (look for the SafariDriver.safariextension.zip file)


  1. Checkout the 16670 version of the selenium project. Download all the project, not just the safariDriver folder. ~150Mb
  2. Build the extension. You need java properly set in your system's settings.





Installation:

  1. Register as an Apple Developer in https://developer.apple.com/programs/register/
  2. Join in the Safari development program https://developer.apple.com/devcenter/safari/renew/index.action
  3. Generate a Safari certificate https://developer.apple.com/certificates/index.action#safarilist
  4. Install the certificate
  5. Open Safari.
  6. In Safari, go to Preferences -> Advanced -> check the Show Development menu in menu bar.
  7. Go to develop -> show extension builder.
  8. Click on + (Add) -> Add extension
  9. Select the SafariDriver.safariExtension folder, located in 
  10. Click on install




Call:

/**
* Sets safari driver
*
* @param context
* Current test context
*/
private void setSafariDriver()
{
getLogger().log(Level.INFO, "Starting safari");
if (isSupportedPlatform())
{
driver = new SafariDriver();
getLogger().log(Level.INFO, "Safari started correctly");
}
else
{
getLogger().log(Level.INFO, "Platform not valid.");
}
}

private static boolean isSupportedPlatform()
{
Platform current = Platform.getCurrent();
return Platform.MAC.is(current) || Platform.WINDOWS.is(current);
}

Testing:

You can try with a JUnit class
In example:

@Test
public void StartSafariWD() {
browser.start("safariWD");
browser.stop();
}



Labels: , , , ,

Monday, 17 October 2011

QA Automation para Android

Buenas noches a todos =)
Aqui les traigo algo que estuve utilizando luego de jugar con el SDK de Android y mi celular (Defy MB525 con Cyanogenmod 7.1.0)
En sintesis, les voy a explicar como hacer para instalar WebDriver en el celular (o en un emulador) Android y poder correr pruebas automatizadas de paginas webs.

Requerimientos:

  • Eclipse funcionando (si tiene maven mejor :D )
  • Si no tienen un celular con android, necesitan el Android SDK. Es medio pesado para bajarlo con todas las tools y plataforms, aproximadamente 1.9Gb.
  • Si tienen un celu con android, recuerden habiltar la depuracion USB 
Aqui los pasos:

  1. Instalacion, configuracion y ejecucion de WebDriver en Android.
      • Bajamos android-server-2.6.0.apk desde la pagina de Selenium y lo instalamos en el celular. Para hacer las cosas un poco mas avanzadas, lo vamos a instalar utilizando un comando de Android Debug Bridge (adb). Este procedimiento aplica tanto para el emulador como para un dispositivo android con depuracion usb activa:

      1. ./adb install android-server.apk
      • Para ejecutar el programa, podemos ir al menu de aplicaciones y luego entrar en WebDriver. Un cartel nos avisara que jetty esta ejecutandose en background. Tambien tenemos una opcion mediante adb, pidiendole que levante el Activity Principal:

      1. $./adb shell am start -a android.intent.action.MAIN -n org.openqa.selenium.android.app/.MainActivity
        • Por defecto, esta aplicacion escucha conexiones en el puerto 8080. Ahora necesitamos hacer un port-fw  entre el dispositivo android y nuestro sistema:

        $./adb forward tcp:4444 tcp:8080
        En mi caso, configuro que las escuchas las realice en el puerto 4444 ya que estoy acostumbrado a la manera en la que trabaja selenium server.
      • Probamos si todo funciona correctamente ingresando a http://localhost:4444. Tienen que ver una pagina como la siguiente (no se preocupen por el 404 :D)
    1. Creacion y ejecucion de un proyecto de tests.
    • Creamos un proyecto nuevo en eclipse y una Clase llamada FirstTest:
    • Agregamos las librerias de selenium y sus dependencias al proyecto ( bajar selenium-java-2.8.0.zip) Aquellos que usen maven pueden resolver las dependencias automaticamente. 

    import junit.framework.TestCase;
    import org.openqa.selenium.By;
    import org.openqa.selenium.WebDriver;
    import org.openqa.selenium.WebElement;
    import org.openqa.selenium.android.AndroidDriver;
     
    public class FirstTest extends TestCase {
     
    public void testGoogle() throws Exception {
    WebDriver driver = new AndroidDriver("http://localhost:4444/wd/hub");
      //driver.get("https://blog.cristianmarquez.me");
      driver.get("http://www.google.com.ar");
      assertEquals("Google", driver.getTitle());
    driver.quit();
    }
    }
    Luego ejecutan el proyecto como JUnit Test y en su dispositivo tienen que ver como corren las pruebas

    Espero que este tutorial les haya servido, lo voy a ir fixeando y complementando en la semana.
    Saludos y que tengan buen dia!

    Screenshots:


    Corriendo desde el Defy
    Corriendo desde el emulador


    Labels: , , , ,