andoid_testing

¿Cómo hacer TDD en Android? Parte 2 – Tests Unitarios

Continuamos con esta nueva entrega sobre TDD en Android, en la que realizaremos los primeros tests unitarios.

Como ya vimos en la primera parte de esta serie de artículos ¿Cómo hacer TDD en Android? Parte 1 – Resumen y configuración” tenemos creado nuestro proyecto y vamos a usar un patrón MVP (Model – View – Presenter).

El proyecto consistirá en una pantalla de login con un funcionamiento típico:

  • Un máximo 3 intentos para logarse
  • Control de usuario/contraseña correctos.

Creación de la capa de Presentación

Lo primero que haremos será crear el package login dentro de nuestro proyecto y a su vez la clase LoginPresenter

public class LoginPresenter {
    
}

Situándonos sobre el nombre de la clase pulsamos la combinación de teclas SHIFT + CTRL + T y nos aparecerá una nueva ventana donde le indicaremos que crearemos un nuevo test llamado “LoginPresenterTest”.

crear_clase_test

Con esto tenemos creada nuestra capa de presentación (LoginPresenter) y su test correspondiente (LoginPresenterTest).

Empecemos a desarrollar los test.

Empecemos a desarrollar los tests

Lo primero que debemos hacer es saber que queremos testear, en nuestro caso empezaremos por comprobar si sobrepasamos el número máximo de intentos para logarnos.

Para ello usaremos el siguiente código dentro de la clase LoginPresenterTest

@Test
public void checkIfLoginAttemptIsExceeded(){
     LoginPresenter loginPresenter = new LoginPresenter();
     Assert.assertEquals(1,loginPresenter.newLoginAttempt());
     Assert.assertEquals(2,loginPresenter.newLoginAttempt());
     Assert.assertEquals(3,loginPresenter.newLoginAttempt());
     Assert.assertTrue(loginPresenter.isLoginAttemptExceeded());
}

Como podremos comprobar los métodos newLoginAttempt y isLoginAttemptExceeded se nos han marcado en rojo.
Si recordamos el mantra de TDD este es el primer paso (rojo – refactorizar – verde).

tests_rojos

El siguiente paso es crear los métodos que nos dan error en la clase LoginPresenter, quedando esta de la siguiente manera:

public class LoginPresenter {
    public int newLoginAttempt() {
        return 0;
    }

    public boolean isLoginAttemptExceeded() {
        return false;
    }
}

Ya tenemos nuestro primer test realizado, si lo ejecutamos veremos como nos da error, por lo que el siguiente paso será dotar de contenido los nuevos métodos creados para que el test funcione correctamente.

tests_no_ok

Una implementación para ello podría ser la siguiente:

public class LoginPresenter {
    private int currentLoginAttempt = 0;
    private static final int MAX_LOGIN_ATTEMPT = 3;

    public int newLoginAttempt() {
        return ++currentLoginAttempt;
    }

    public boolean isLoginAttemptExceeded() {
        return currentLoginAttempt >= MAX_LOGIN_ATTEMPT;
    }
}

Si ahora volvemos a ejecutar el test comprobaremos que nos lo marca como OK y en verde.

tests_ok

No perder nunca de vista el verde – Jorge Barroso – Karumi

Te propongo como ejercicio que desarrolles tu mismo el siguiente test para comprobar si no hemos sobrepasado el número máximo de intentos para logarnos:

@Test
public void checkIfLoginAttemptIsNotExceeded(){
    
}

Comprobación de usuario y contraseña

A continuación vamos a comprobar si el usuario y contraseña introducidos son correctos, para ello implementaremos el siguiente test:

@Test
public void checkUserAndPasswordIsCorrect(){
    LoginPresenter loginPresenter = new LoginPresenter();
    Assert.assertTrue(loginPresenter.checkUserPassword("user","password"));
}

Tal como nos pasó anteriormente, el método checkUserPassword está marcado en rojo, por lo que procederemos a implementarlo.

public boolean checkUserPassword(String user, String password) {
    boolean ret = true;
    if (isLoginAttemptExceeded()) {
        ret = false;
    } else if (user.equals(USER) && password.equals(PASSWORD)) {
        ret = true;
    } else {
        ret = false;
        newLoginAttempt();
    }
    return ret;
}

La clase completa quedaría:

public class LoginPresenter {
    private int currentLoginAttempt = 0;
    private static final int MAX_LOGIN_ATTEMPT = 3;
    private static final String USER = "user";
    private static final String PASSWORD = "password";

    public int newLoginAttempt() {
        return ++currentLoginAttempt;
    }

    public boolean isLoginAttemptExceeded() {
        return currentLoginAttempt >= MAX_LOGIN_ATTEMPT;
    }

    public boolean checkUserPassword(String user, String password) {
        boolean ret = true;
        if (isLoginAttemptExceeded()) {
            ret = false;
        } else if (user.equals(USER) && password.equals(PASSWORD)) {
            ret = true;
        } else {
            ret = false;
            newLoginAttempt();
        }
        return ret;
    }
}

Con esto ya tenemos nuestros primeros test unitarios implementados.

Si te has fijado bien, al usar un patrón MVP ya tenemos implementada y comprobada la lógica de una pantalla de login de la cual aún no hemos desarrollado su capa visual.

Puedes descargarte el estado actual del proyecto del siguiente enlace de github: https://github.com/jamontes79/TDD_Ejemplo/tree/f7549820c11db027fc70196c828ccb8bcb5e33ac

Y hasta aquí esta entrega sobre TDD para Android, en la próxima implementaremos la interfaz gráfica y trabajaremos con Mockito.

¿Que te está pareciendo TDD? ¿Lo ves útil?

 

 

Publicado en Android, Desarrollo.

Ingeniero Técnico en Informática de Sistemas. Apasionado de la tecnología y enfocado al desarrollo móvil

Un comentario

  1. Pingback: ¿Cómo hacer TDD en Android? Parte 3 – Mocking & Tests de Integración – Alberto Montes de Oca

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.