Pruebas funcionales en Android con Robotium

jueves, 27 de noviembre de 2014

Android Robotium


En el anterior artículo vimos como podemos hacer pruebas unitarias en Android con Mockito, en este artículo vamos a ver otro tipo de pruebas como son pruebas funcionales utilizando Robotium.

Introducción a Robotium

Robotium es un libería que permite realizar pruebas de interfaz de usuario sobre aplicaciones nativas e hibridas en android. Si alguno habéis utilizado Selenium en aplicaciones web, la idea es la misma.

En Android Studio vamos a necesitar añadir la dependencia a Robotium en el fichero build.gradle de nuestro modulo de Android Studio.

    androidTestCompile ('com.jayway.android.robotium:robotium-solo:5.2.1')


También tenemos que crear los paquetes androidTest/java al mismo nivel que main/java, esta es la ruta por defecto donde debemos ubicar los test.

Prototipo de clase de test con Robotium

Cuando utilizamos Robotium, lo normal es que las clases donde tenemos los test tengan un código inicial parecido a este.
public class MainTest extends
        ActivityInstrumentationTestCase2 {

    private Solo solo;

    public MainTest() {
        super(MainActivity.class);
    }

    public void setUp() throws Exception {
        solo = new Solo(getInstrumentation(), getActivity());
    }

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

    public void test1(){

    }

    public void test2(){

    }
}


Como podemos ver, la clase hereda de ActivityInstrumentationTestCase2, en el método setUp, que se invoca antes de iniciar cada test, creamos el objeto solo, que es el objeto que centraliza todas las operaciones en Robotium, si necesitamos insertar un texto, hacer click en un elemento etc... todo pasa por este objeto. También es interesate que en el método tearDown, invocado al finalizar cada test, finalicemos todas las activities abiertas.

Ejemplo

Para realizar el ejemplo nos vamos a basar el codigo fuente de una aplicación slide menu de este tutorial, Android Sliding Menu using Navigation Drawer. Esta aplicación es un ejemplo de como realizar un menu lateral utilizando Drawerlayout.

Este es el video de demo de la aplicación que nos servira para entender las pruebas de interfaz de usuario que vamos a realizar como ejemplo de uso de Robotium.



Abriendo el Drawerlayout deslizando desde la parte izquierda de la pantalla

Vamos a realizar un test para verificar que al realizar una accion de drag desde la parte izquierda se abre el DrawerLayout. Esa acción simula al usuario deslizando el dedo desde la parte izquierda para sacar el menu lateral.

public void testOpenDrawerFromDragAction() throws InterruptedException {
    Point deviceSize = new Point();
    getActivity().getWindowManager().getDefaultDisplay().getSize(deviceSize);

    int screenWidth = deviceSize.x;
    int screenHeight = deviceSize.y;
    int fromX = 0;
    int toX = screenWidth / 2;
    int fromY = screenHeight / 2;
    int toY = fromY;

    solo.drag(fromX, toX, fromY, toY, 1);

    solo.waitForView(ListView.class);

    DrawerLayout drawerLayout = (DrawerLayout) solo.getView(R.id.drawer_layout);

    Assert.assertTrue(drawerLayout.isDrawerOpen(Gravity.LEFT));
}


Es cierto que en Robotium existe el metodo setNavigationDrawer que en teoria sirve para abrir el Drawer pero no he conseguido que me funcione y el método drag me funciona bastante bien. Si alguien lo ha conseguido por favor os agradecería que lo pongáis en los comentarios de post.

Verificando que se abre una vista concreta desde su menu del drawerlayout

En este test vamos a abrir el Drawer para selecionar un item y verificaremos que se ha abierto la vista esperada.

    private void OpenDrawer() {
        Point deviceSize = new Point();
        getActivity().getWindowManager().getDefaultDisplay().getSize(deviceSize);

        int screenWidth = deviceSize.x;
        int screenHeight = deviceSize.y;
        int fromX = 0;
        int toX = screenWidth / 2;
        int fromY = screenHeight / 2;
        int toY = fromY;

        solo.drag(fromX, toX, fromY, toY, 1);
    }
    
    public void testVerifyFindPeopleOpenedFromDrawer() throws InterruptedException {
        OpenDrawer();

        solo.waitForView(ListView.class);

        solo.clickInList(2);

        Assert.assertTrue(solo.waitForText("Find People View",1,500));
    }


Fijaros que para seleccionar el item he utilizado el método clickInList pasando el índice que quiero seleccionar. También se puede utilizar el método clickOnText según las necesidades y características de nuestra vista, en caso de tener una lista con muchos elementos puede ser más interesante este segundo método porque realiza scroll si es necesario buscando el texto donde hacer click.

Para verrificar el test he utilizado la función waitForText con un timeout, en caso de que se cumpla el tiempo sin encontrar el texto, la función devuelve false, si lo encuentra dentro del tiempo devuelve true.

Código disponible en GitHub.

Libros relacionados

Robotium Automated Testing for Android

2 comentarios:

  1. Muy buen post, solo recomiendo que se explique la ejecución de las mismas y la visualización de reportes una vez ya creadas ;)

    ResponderEliminar
  2. Gracias Wilmary, me anoto las recomendaciones.

    ResponderEliminar