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”.
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).
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.
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.
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?
Pingback: ¿Cómo hacer TDD en Android? Parte 3 – Mocking & Tests de Integración – Alberto Montes de Oca