Workshop: Testeando nuestra aplicaciones.

85
Testeando nuestras aplicaciones Chema Android Developer

Transcript of Workshop: Testeando nuestra aplicaciones.

Page 1: Workshop: Testeando nuestra aplicaciones.

Testeando nuestras aplicaciones

ChemaAndroid Developer

Page 2: Workshop: Testeando nuestra aplicaciones.

O2O DIGITAL BUSINESS

ÍNDICEIntroducción

Conceptos sobre testing

Inyección de Dependencias

Arquitectura Clean o Arquitectura por

Capas

Testing en el módulo de Dominio

Testing en el módulo del Presentador

Testing en el módulo de Datos

Testing en el módulo de la Vista

Test de Integración

1

2

3

4

5

6

7

8

9

Page 3: Workshop: Testeando nuestra aplicaciones.

1 O2O INTRODUCCIÓN

¿Otra charla de testing?

Experiencia en proyectos reales.

Unificar criterios para hacer testing.

Adaptada a nuestros proyectos: arquitectura, código, librerías, etc.

Page 4: Workshop: Testeando nuestra aplicaciones.

1 O2O INTRODUCCIÓN

¿Por qué hacer testing?

Ser profesionales en nuestro trabajo y responsables de lo que hacemos.

Proyectos complicados de probar manualmente. Ej: estados cronológicos.

Aporta calidad al producto.

Page 5: Workshop: Testeando nuestra aplicaciones.

1 O2O INTRODUCCIÓN

Beneficios en nuestro código al hacer testingVerifica que nuestro código hace lo que se espera de el.

Se reducen las incidencias de regresión.

Desarrollar sólo el código necesario para pasar el test.

Una guía para cumplir los principios SOLID.

Protocolo para poner en producción la aplicación.

Ayuda a estimar viendo los test afectados por el cambio.

Page 6: Workshop: Testeando nuestra aplicaciones.

1 O2O INTRODUCCIÓN

Mitos sobre testingHacer tests implica un incremento de tiempo en el desarrollo del código.Hacer tests implica un código sin errores.Los tests son responsabilidad de otros (QA).Si el proyectó no comenzó desarrollandose con test, ya no puedo meterlo en los evolutivos o correciones de incidencias.Si no haces TDD no sirve de nada hacer test.

Page 7: Workshop: Testeando nuestra aplicaciones.

Conceptos sobre Testing2

Page 8: Workshop: Testeando nuestra aplicaciones.

2 O2O CONCEPTOS

System Under Test (SUT) & Depend On Component (DOC) SUT

DOC

Page 9: Workshop: Testeando nuestra aplicaciones.

O2O CONCEPTOS

Tipos de tests según su estructura

2

Caja Blanca

Entrada Salida

Caja Negra

Entrada Salida

Se centran en cómo se trata las entradas para

producir las salidas

Se centran en las entradas y salidas

Page 10: Workshop: Testeando nuestra aplicaciones.

O2O CONCEPTOS

Tipos de tests según su alcance

2

Test Unitarios Test de Integración Test de Aceptación

Presenter PresenterView Login

Page 11: Workshop: Testeando nuestra aplicaciones.

O2O CONCEPTOS

Técnicas de desarrollo de pruebas

2

Test Driven Development Test First Test Last

Relacionado con TDD. Puede no refactorizarse.

1. Test.2. Código para pasar test.3. Refactorizar.

El programador realiza test según el código escrito.

Page 12: Workshop: Testeando nuestra aplicaciones.

O2O CONCEPTOS

Dobles de Pruebas o Double TestPruebas Dobles o Double Test Un doble de test es simplemente un objeto que utilizamos en sustitución de otro cuando queremos realizar un test y no queremos romper o ir más allá del SUT (Martín Fowler).

Dummy Es un tipo de doble de test y es un objeto que se usa para poder crear otros objetos. Se pasa como argumento y se usan sólo para rellenar listas de parámetros.

Stubs Es un tipo de doble de test que devuelve datos predefinidos a una llamada hecha durante un test.

Fake Es un tipo de doble de test que funciona como si fuera real pero su implementación interna está adaptada a un entorno de test y no de producción. Ej: base de datos en memoria.

Mock Objeto preprogramado que permite especificar qué se quiere recibir cuando se realiza una llamada determinada.

Spy Es como un mock pero además permite ir guardando las llamadas a los métodos que se van realizando.

2

Page 13: Workshop: Testeando nuestra aplicaciones.

O2O CONCEPTOS

LibreríasjUnit Es una librería que permite realizar la ejecución de clases Java de manera controlada, para poder evaluar si el funcionamiento de cada uno de los métodos de la clase se comporta como se espera. Desarrollado por Erich Gamma y Kent Beck.

Mockito Es una librería que permite la creación de test dobles (objetos). Permite verificar sus estados, llamadas a métodos, etc.

Espresso Es un framework para realizar test en aplicaciones Android. Nos permite realizar pruebas sobre la interfaz de usuario.

MockWebServer Es una librería que permite emular (fake) un servidor web. Gracias a esta librería podemos ver el comportamiento de nuestra aplicación ante determinadas respuesta del servidor.

DaggerMock Es una librería que automatiza la creación de módulos (Dagger 2) para realizar test. Crea una regla jUnit y sobreescribe los objetos creados con Dagger 2.

Robolectric librería que nos permite hacer test con el sdk de Android sin necesidad de emulador o dispositivo físico.

2

Page 14: Workshop: Testeando nuestra aplicaciones.

O2O CONCEPTOS

Librerías - MockWebServer

2

Page 15: Workshop: Testeando nuestra aplicaciones.

Inyección de Dependencias3

Page 16: Workshop: Testeando nuestra aplicaciones.

3 O2O INYECCIÓN DE DEPENDENCIAS

Conceptos

Page 17: Workshop: Testeando nuestra aplicaciones.

3 O2O INYECCIÓN DE DEPENDENCIAS

Inversión de ControlMartín Fowler

Page 18: Workshop: Testeando nuestra aplicaciones.

3 O2O INYECCIÓN DE DEPENDENCIAS

Principio de Inversión de Dependencias

El Caso de Uso depende de las clases instanciadas en el constructor.Complicado saber de qué depende nuestro módulo. En métodos más difícil aún.Complicado testear. Se dependen de esos módulos. Imposibilidad de reemplazar por test dobles.

Robert C. Martin

Page 19: Workshop: Testeando nuestra aplicaciones.

3 O2O INYECCIÓN DE DEPENDENCIAS

Principio de Inversión de Dependencias

Depende de una abstracción.La relación con otros módulo se indica por constructor.Posibilidad de hacer test dobles.

Robert C. Martin

Page 20: Workshop: Testeando nuestra aplicaciones.

3 O2O INYECCIÓN DE DEPENDENCIAS

Inyección de DependenciasMartín Fowler

Patrón de diseño.Se suministran objetos a una clase en lugar de ser la propia clase quien cree el objetoEl Inyector de dependencias se encarga de sumistrar estos objetos

Dagger 2

Page 21: Workshop: Testeando nuestra aplicaciones.

Arquitectura Clean4

Page 22: Workshop: Testeando nuestra aplicaciones.

4 O2O ARQUITECTURA CLEAN O ARQUITECTURA POR CAPAS

Definición de la Arquitectura

Android

Java

Capa de Presentación

Views

Presenters

Capa de Dominio

Use Case

Models

Capa de Datos

RepositoryGateway

DataBase API

Page 23: Workshop: Testeando nuestra aplicaciones.

4 O2O ARQUITECTURA CLEAN O ARQUITECTURA POR CAPAS

Módulos de la App

MóduloDominio

MóduloPresentación

MóduloApp

MóduloDatos

Módulo de App y Datos

Módulo de Presentación

Módulo de Dominio

Directo

Interfaz

Page 24: Workshop: Testeando nuestra aplicaciones.

4 O2O ARQUITECTURA CLEAN O ARQUITECTURA POR CAPAS

Estructura del Proyecto en módulos

apply plugin: 'com.android.application'

apply plugin: ’java'

compile project(path: ':presentation')compile project(path: ':domain')compile project(path: ':data')

Módulo App Módulo Data

compile project(path: ':domain’)

Módulo Presentation

compile project(path: ':domain')

Módulo Dominio

Page 25: Workshop: Testeando nuestra aplicaciones.

Testing en el Módulo del Dominio

5

Page 26: Workshop: Testeando nuestra aplicaciones.

5 O2O TESTING EN EL MÓDULO DEL DOMINIO

Módulo del Dominio

Android

Java

Capa de Presentación

Views

Presenters

Capa de Dominio

Use Case

Models

Capa de Datos

RepositoryGateway

DataBase API

Page 27: Workshop: Testeando nuestra aplicaciones.

5 O2O TESTING EN EL MODULO DEL DOMINIO

Contexto del problema

El caso de uso obtiene una receta.

Si la receta existe en local (base de datos) se devuelve.

Si la receta no existe en local, se obtiene desde una API.

Si la receta se ha obtenido desde la API, se persiste en local.

Si se produce un error al persistir, se ignora y se devuelve la receta.

Page 28: Workshop: Testeando nuestra aplicaciones.

5 O2O TESTING EN EL MODULO DEL DOMINIO

Definición de Test Dobles

Page 29: Workshop: Testeando nuestra aplicaciones.

5 O2O TESTING EN EL MODULO DEL DOMINIO

Contexto del problema

El caso de uso obtiene una receta.

Si la receta existe en local (base de datos) se devuelve.

Si la receta no existe en local, se obtiene desde una API.

Si la receta se ha obtenido desde la API, se persiste en local.

Si se produce un error al persistir, se ignora y se devuelve la receta.

Page 30: Workshop: Testeando nuestra aplicaciones.

5 O2O TESTING EN EL MODULO DEL DOMINIO

Definición del Test

Page 31: Workshop: Testeando nuestra aplicaciones.

5 O2O TESTING EN EL MODULO DEL DOMINIO

Contexto del problema

El caso de uso obtiene una receta.

Si la receta existe en local (base de datos) se devuelve.

Si la receta no existe en local, se obtiene desde una API.

Si la receta se ha obtenido desde la API, se persiste en local.

Si se produce un error al persistir, se ignora y se devuelve la receta.

Page 32: Workshop: Testeando nuestra aplicaciones.

5 O2O TESTING EN EL MODULO DEL DOMINIO

Definición del Test

Page 33: Workshop: Testeando nuestra aplicaciones.

5 O2O TESTING EN EL MODULO DEL DOMINIO

Contexto del problema

El caso de uso obtiene una receta.

Si la receta existe en local (base de datos) se devuelve.

Si la receta no existe en local, se obtiene desde una API.

Si la receta se ha obtenido desde la API, se persiste en local.

Si se produce un error al persistir, se ignora y se devuelve la receta.

Page 34: Workshop: Testeando nuestra aplicaciones.

5 O2O TESTING EN EL MODULO DEL DOMINIO

Definición del Test

Page 35: Workshop: Testeando nuestra aplicaciones.

5 O2O TESTING EN EL MODULO DEL DOMINIO

Contexto del problema

El caso de uso obtiene una receta.

Si la receta existe en local (base de datos) se devuelve.

Si la receta no existe en local, se obtiene desde una API.

Si la receta se ha obtenido desde la API, se persiste en local.

Si se produce un error al persistir, se ignora y se devuelve la receta.

Page 36: Workshop: Testeando nuestra aplicaciones.

5 O2O TESTING EN EL MODULO DEL DOMINIO

Definición del Test

Page 37: Workshop: Testeando nuestra aplicaciones.

5 O2O TESTING EN EL MODULO DEL DOMINIO

Resultado sin refactorizar

Page 38: Workshop: Testeando nuestra aplicaciones.

5 O2O TESTING EN EL MODULO DEL DOMINIO

Resultado final (refactorización)

Page 39: Workshop: Testeando nuestra aplicaciones.

5 O2O TESTING EN EL MODULO DEL DOMINIO

Resultado final (refactorización)

Page 40: Workshop: Testeando nuestra aplicaciones.

Testing en el Módulo del Presenter

6

Page 41: Workshop: Testeando nuestra aplicaciones.

6 O2O TESTING EN EL MÓDULO DEL PRESENTER

Modulo del Presenter

Android

Java

Capa de Presentación

Views

Presenters

Capa de Dominio

Use Case

Models

Capa de Datos

RepositoryGateway

DataBase API

Page 42: Workshop: Testeando nuestra aplicaciones.

6 O2O TESTING EN EL MÓDULO DEL PRESENTER

El presentador se encarga de realizar una petición al dominio para obtener una receta y manda a la vista que la muestre.

Para dar feedback al usuario de que la aplicación está realizando algo, se mostrará un spinner.

El presentador será el encargado de indicarle a la vista que error deberá mostrar.

El presentador recoge los errores producidos al ejecutarse el caso de uso (desde el dominio)

Contexto del problema

Page 43: Workshop: Testeando nuestra aplicaciones.

6 O2O TESTING EN EL MÓDULO DEL PRESENTER

Definición de los Test Dobles

Page 44: Workshop: Testeando nuestra aplicaciones.

6 O2O TESTING EN EL MÓDULO DEL PRESENTER

Contexto del problema

El presentador se encarga de realizar una petición al dominio para obtener una receta y manda a la vista que la muestre.

Para dar feedback al usuario de que la aplicación está realizando algo, se mostrará un spinner.

El presentador será el encargado de indicarle a la vista que error deberá mostrar.

El presentador recoge los errores producidos al ejecutarse el caso de uso (desde el dominio)

Page 45: Workshop: Testeando nuestra aplicaciones.

6 O2O TESTING EN EL MÓDULO DEL PRESENTER

Definición del Test

Page 46: Workshop: Testeando nuestra aplicaciones.

6 O2O TESTING EN EL MÓDULO DEL PRESENTER

Contexto del problema

El presentador se encarga de realizar una petición al dominio para obtener una receta y manda a la vista que la muestre.

Para dar feedback al usuario de que la aplicación está realizando algo, se mostrará un spinner.

El presentador será el encargado de indicarle a la vista que error deberá mostrar.

El presentador recoge los errores producidos al ejecutarse el caso de uso (desde el dominio)

Page 47: Workshop: Testeando nuestra aplicaciones.

6 O2O TESTING EN EL MÓDULO DEL PRESENTER

Definición del Test

Page 48: Workshop: Testeando nuestra aplicaciones.

6 O2O TESTING EN EL MÓDULO DEL PRESENTER

Contexto del problema

El presentador se encarga de realizar una petición al dominio para obtener una receta y manda a la vista que la muestre.

Para dar feedback al usuario de que la aplicación está realizando algo, se mostrará un spinner.

El presentador será el encargado de indicarle a la vista que error deberá mostrar.

El presentador recoge los errores producidos al ejecutarse el caso de uso (desde el dominio)

Page 49: Workshop: Testeando nuestra aplicaciones.

6 O2O TESTING EN EL MÓDULO DEL PRESENTER

Definición del Test

Page 50: Workshop: Testeando nuestra aplicaciones.

Testing en el Módulo de Datos

7

Page 51: Workshop: Testeando nuestra aplicaciones.

7 O2O TESTING EN EL MÓDULO DE DATOS

Modulo de Datos

Android

Java

Capa de Presentación

Views

Presenters

Capa de Dominio

Use Case

Models

Capa de Datos

RepositoryGateway

DataBase API

Page 52: Workshop: Testeando nuestra aplicaciones.

7 O2O TESTING EN EL MÓDULO DE DATOS

La clase Local debería devolver el valor que indica si es la primera vez o no que se lanza la app.

La clase local debería persistir un valor que indica que no es la primera vez que se ejectura.

Contexto del problema

Page 53: Workshop: Testeando nuestra aplicaciones.

7 O2O TESTING EN EL MÓDULO DE DATOS

Definición de los Test Dobles

Page 54: Workshop: Testeando nuestra aplicaciones.

7 O2O TESTING EN EL MÓDULO DE DATOS

La clase Local debería devolver el valor que indica si es la primera vez o no que se lanza la app.

La clase local debería persistir un valor que indica que no es la primera vez que se ejectura.

Contexto del problema

Page 55: Workshop: Testeando nuestra aplicaciones.

7 O2O TESTING EN EL MÓDULO DE DATOS

Definición del Test

Page 56: Workshop: Testeando nuestra aplicaciones.

7 O2O TESTING EN EL MÓDULO DE DATOS

La clase Local debería devolver el valor que indica si es la primera vez o no que se lanza la app.

La clase local debería persistir un valor que indica que no es la primera vez que se ejectura.

Contexto del problema

Page 57: Workshop: Testeando nuestra aplicaciones.

7 O2O TESTING EN EL MÓDULO DE DATOS

Definición del Test

Page 58: Workshop: Testeando nuestra aplicaciones.

Testing en la Vista8

Page 59: Workshop: Testeando nuestra aplicaciones.

8 O2O TESTING EN EL MÓDULO DE LA VISTA

Modulo de la Vista

Android

Java

Capa de Presentación

Views

Presenters

Capa de Dominio

Use Case

Models

Capa de Datos

RepositoryGateway

DataBase API

Page 60: Workshop: Testeando nuestra aplicaciones.

8 O2O TESTING EN EL MÓDULO DE LA VISTA

Contexto del problema

Siempre que se inicie la actividad, debemos asegurarnos que es la única activa.

Su Layout definido es R.layout.activity_login.

Debería inicializarse el presentador con la interfaz de la vista.

Al inicializarse la vista, el Alias Input y Password Input debe estar vacío y con unos hint establecidos.

Si el login es correcto, se cambia de actividad ReceiptActivity.

Page 61: Workshop: Testeando nuestra aplicaciones.

8 O2O TESTING EN EL MÓDULO DE LA VISTA

Definición de los Test Dobles

Page 62: Workshop: Testeando nuestra aplicaciones.

8 O2O TESTING EN EL MÓDULO DE LA VISTA

Contexto del problema

Siempre que se inicie la actividad, debemos asegurarnos que es la única activa.

Su Layout definido es R.layout.activity_login.

Debería inicializarse el presentador con la interfaz de la vista.

Al inicializarse la vista, el Alias Input y Password Input debe estar vacío y con unos hint establecidos.

Si el login es correcto, se cambia de actividad ReceiptActivity.

Page 63: Workshop: Testeando nuestra aplicaciones.

8 O2O TESTING EN EL MÓDULO DE LA VISTA

Definición del Test

Page 64: Workshop: Testeando nuestra aplicaciones.

8 O2O TESTING EN EL MÓDULO DE LA VISTA

Contexto del problema

Siempre que se inicie la actividad, debemos asegurarnos que es la única activa.

Su Layout definido es R.layout.activity_login.

Debería inicializarse el presentador con la interfaz de la vista.

Al inicializarse la vista, el Alias Input y Password Input debe estar vacío y con unos hint establecidos.

Si el login es correcto, se cambia de actividad ReceiptActivity.

Page 65: Workshop: Testeando nuestra aplicaciones.

8 O2O TESTING EN EL MÓDULO DE LA VISTA

Definición del Test

Page 66: Workshop: Testeando nuestra aplicaciones.

8 O2O TESTING EN EL MÓDULO DE LA VISTA

Contexto del problema

Siempre que se inicie la actividad, debemos asegurarnos que es la única activa.

Su Layout definido es R.layout.activity_login.

Debería inicializarse el presentador con la interfaz de la vista.

Al inicializarse la vista, el Alias Input y Password Input debe estar vacío y con unos hint establecidos.

Si el login es correcto, se cambia de actividad ReceiptActivity.

Page 67: Workshop: Testeando nuestra aplicaciones.

8 O2O TESTING EN EL MÓDULO DE LA VISTA

Definición del Test

Page 68: Workshop: Testeando nuestra aplicaciones.

8 O2O TESTING EN EL MÓDULO DE LA VISTA

Contexto del problema

Siempre que se inicie la actividad, debemos asegurarnos que es la única activa.

Su Layout definido es R.layout.activity_login.

Debería inicializarse el presentador con la interfaz de la vista.

Al inicializarse la vista, el Alias Input y Password Input debe estar vacío y con unos hint establecidos.

Si el login es correcto, se cambia de actividad ReceiptActivity.

Page 69: Workshop: Testeando nuestra aplicaciones.

8 O2O TESTING EN EL MÓDULO DE LA VISTA

Definición del Test

Page 70: Workshop: Testeando nuestra aplicaciones.

8 O2O TESTING EN EL MÓDULO DE LA VISTA

Contexto del problema

Siempre que se inicie la actividad, debemos asegurarnos que es la única activa.

Su Layout definido es R.layout.activity_login.

Debería inicializarse el presentador con la interfaz de la vista.

Al inicializarse la vista, el Alias Input y Password Input debe estar vacío y con unos hint establecidos.

Si el login es correcto, se cambia de actividad ReceiptActivity.

Page 71: Workshop: Testeando nuestra aplicaciones.

8 O2O TESTING EN EL MÓDULO DE LA VISTA

Definición del Test

Page 72: Workshop: Testeando nuestra aplicaciones.

8 O2O TESTING EN EL MÓDULO DE LA VISTA

Otros contextos del problema

La actividad no debería tener Toolbar – ActionBar.

El EditText del password debería ser ‘tipo password’.

El botón del Login debería ser visible y desactivado al iniciar la actividad.

Los textos que deberían llevar los hint de Alias y Password y la etiqueta del botón Login.

Número de páginas del ViewPager.

Imagen según la página del View Pager.

Ocultar/Mostrar Spinner o Notificaciones.

Page 73: Workshop: Testeando nuestra aplicaciones.

Test de Integración9

Page 74: Workshop: Testeando nuestra aplicaciones.

9 O2O TEST DE INTEGRACIÓN

Test de Integración

Hacer Login. El usuario introduce un alias y un password y valida sus credenciales pulsando en el botón de Aceptar:

Si al hacer login las credenciales son incorrectas, se muestra un error.

Si al hacer login las credenciales son correctas, se cambia de actividad.

Si se produce un TimeOut en el servidor, se debe mostrar un mensaje de error de red.

Page 75: Workshop: Testeando nuestra aplicaciones.

9 O2O TEST DE INTEGRACIÓN

PageObject (Martín Fowler)Clase que contiene todas las acciones que se pueden hacer en la vista.

Beneficios en la reutilización de acciones entre actividades.

Page 76: Workshop: Testeando nuestra aplicaciones.

9 O2O TEST DE INTEGRACIÓN

Definición del Test

Page 77: Workshop: Testeando nuestra aplicaciones.

9 O2O TEST DE INTEGRACIÓN

Definición del Test

Page 78: Workshop: Testeando nuestra aplicaciones.

9 O2O TEST DE INTEGRACIÓN

Definición del Test

Page 79: Workshop: Testeando nuestra aplicaciones.

9 O2O TEST DE INTEGRACIÓN

Test de Integración

Hacer Login. El usuario introduce un alias y un password y valida sus credenciales pulsando en el botón de Aceptar:

Si al hacer login las credenciales son incorrectas, se muestra un error.

Si al hacer login las credenciales son correctas, se cambia de actividad.

Si se produce un TimeOut en el servidor, se debe mostrar un mensaje de error de red.

Page 80: Workshop: Testeando nuestra aplicaciones.

9 O2O TEST DE INTEGRACIÓN

Definición del Test

Page 81: Workshop: Testeando nuestra aplicaciones.

9 O2O TEST DE INTEGRACIÓN

Test de Integración

Hacer Login. El usuario introduce un alias y un password y valida sus credenciales pulsando en el botón de Aceptar:

Si al hacer login las credenciales son incorrectas, se muestra un error.

Si al hacer login las credenciales son correctas, se cambia de actividad.

Si se produce un TimeOut en el servidor, se debe mostrar un mensaje de error de red.

Page 82: Workshop: Testeando nuestra aplicaciones.

9 O2O TEST DE INTEGRACIÓN

Definición del Test

Page 83: Workshop: Testeando nuestra aplicaciones.

9 O2O TEST DE INTEGRACIÓN

Test de Integración

Hacer Login. El usuario introduce un alias y un password y valida sus credenciales pulsando en el botón de Aceptar:

Si al hacer login las credenciales son incorrectas, se muestra un error.

Si al hacer login las credenciales son correctas, se cambia de actividad.

Si se produce un TimeOut en el servidor, se debe mostrar un mensaje de error de red.

Page 84: Workshop: Testeando nuestra aplicaciones.

9 O2O TEST DE INTEGRACIÓN

Definición del Test

Page 85: Workshop: Testeando nuestra aplicaciones.

ChemaAndroid Developer

___________________________________________________

MO2OAvda. De Burgos 8 – Pl. 16 – Edif. Bronce . Madrid 28036

910 609 514 - 609 242 417