Cómo lograr mejores pruebas

Post on 13-Apr-2017

572 views 0 download

Transcript of Cómo lograr mejores pruebas

Cómo lograr mejores pruebas

Andreína Romero@andreinaromero

Cómo lograr mejores pruebas

Agenda• Pruebas Unitarias• Pruebas Funcionales• Buenas prácticas • Sobre pruebas unitarias • Sobre pruebas funcionales

• Pruebas que aportan valor al negocio

Cómo lograr mejores pruebas

Pruebas Unitarias

Andreina del Valle Romero Parra - Ceiba Software
Si quiero leer un poco más del tema puedo leer este post http://dronecenter.blogspot.com.co/p/construye-tu-drone.html

Cómo lograr mejores pruebas

Pruebas Funcionales

 

Puede volar

La cámara se mantiene estable Direcciona correctamente

Se maneja a control remoto

Cómo lograr mejores pruebas

 

Escenario de implementación de pruebas7:00 am

 

4:45 pm 5:00 pm

Tests“Quick and dirty”

Código LimpioPráctica I

Cómo lograr mejores pruebas

Código de implementación de las pruebas LIMPIO

Que sea legible

Que sea legible

Que sea legible

Andreina del Valle Romero Parra - Ceiba Software
Porqué debe ser limpio y legible porque debe ser fácil de mantener

Cómo lograr mejores pruebas

Simples y Expresivas

Andreina del Valle Romero Parra - Ceiba Software
Una prueba legible es una pruebla simple y expresiva, el nombre de la prueba también debe ser expresivo, porque debe transmitir el objetivo de dicha verificación

Cómo lograr mejores pruebas

@Testpublic void pruebaDirty() { EmployeeDao employeeDao = mock(EmployeeDao.class); Employee e = new Employee(); e.setName("Andreína"); e.setLastName("Romero"); e.setMiddleName("del Valle"); e.setCity("Medelin"); e.setOccupation("Computación"); EmployeeService s = new EmployeeService(); s.createEmployee(e); verify(employeeDao).saveEmployee(e);}

No legible

Cómo lograr mejores pruebas

@Testpublic void pruebaClean() { Employee anEmployee = anEmployee().build(); employeeService.createEmployee(anEmployee); verify(employeeDao).saveEmployee(anEmployee);}

Legible

Principio F.I.R.S.T.Práctica 2

Cómo lograr mejores pruebas

F   astI    ndependentR   epeatableS   elf-ValidatingT   imely

Cómo lograr mejores pruebas

@Testpublic void pruebaNoRepetible() { ProductoAlmacen producto = new ProductoAlmacen(); producto.setFechaVencimiento("24/10/2015"); Boolean estaVencido = producto.estaVencido(); assertTrue(estaVencido);}

No repetible

Cómo lograr mejores pruebas

public class ProductoAlmacen {

public Boolean estaVencido() {Calendar calendar = Calendar.getInstance(); return calendar.getTime().equals(this.getFechaVencimiento());}//.....

No repetible

Cómo lograr mejores pruebas

@Testpublic void pruebaRepetible() { ProductoAlmacen producto = new ProductoAlmacen(); producto.setFechaVencimiento("24/10/2015"); Timer timer = mock(Timer.class); when(timer.getFechaHoy()).thenReturn("24/10/2015"); Boolean estaVencido = producto.estaVencido(); assertTrue(estaVencido);}

Repetible

Cómo lograr mejores pruebas

public class ProductoAlmacen {

public Boolean estaVencido() { Date fechaHoy = convertirDateAString(this.timer.getFechaHoy()); return fechaHoy.equals(this.getFechaVencimiento());}

//.....

Repetible

Patrón AAAPráctica 3

Cómo lograr mejores pruebas

ArrangeActAssert

Cómo lograr mejores pruebas

String macroP = "cotizaciones";String microP = "informacionFinanciera";String sec = "informacionBasicaCotizacion";String campo = "label_informacion_cotizacion";List<String> dato = new ArrayList<String>();dato.add(macroP);dato.add(microP);dato.add(sec);dato.add(campo);StringBuilder sb = new StringBuilder();int j = dato.size() - 1;for (int i = 0; i < j; i++) { sb.append(dato.get(i)); if ((dato.size()-1) > (i)){ sb.append("_"); } }Facade fac = new FacadeCotizacion();fac.filtrarCotizaciones("es", sb.toString());

Sin patrón AAA

Cómo lograr mejores pruebas

@Testpublic void pruebaConPatronAAA() { // Arrange StringBuilder filtroBusquedaCotizacion = obtenerFiltroBusquedaCotizacion(); // Act OperacionBusquedaFachada fachada = new OperacionBusquedaFachada(); List<String> resultadosFiltro = fachada.filtrarOpcionesBusqueda("es", filtroBusquedaCotizacion); // Assert assertEquals(5, resultadosFiltro.size());}

Con patrón AAA

API de dominioPráctica 4

Andreina del Valle Romero Parra - Ceiba Software
Utilizar un api de dominio en la implementación de las pruebas, esto con la finalidad de ocultar detalles de implementación que hacen poco legiible la prueba

Cómo lograr mejores pruebas

Un Blog

Validador Ortografía

Publicador

Formateador texto

Cómo lograr mejores pruebas

Parrafo parrafo1 = new Parrafo();parrafo1.addLinea("Las pruebas deben tener un código limpio.");parrafo1.addLinea("Las pruebas deben ser simples y expresivas.");Parrafo parrafo2 = new Parrafo();parrafo1.addLinea("Las pruebas deben cumplir el principio FIRST");parrafo1.addLinea("Las pruebas unitarias deben ejecutarse rapidamente");Parrafo parrafo3 = new Parrafo(); //..List<Parrafo> parrafos = new ArrayList<Parrafo>();parrafos.add(parrafo1);parrafos.add(parrafo2);parrafos.add(parrafo3);//..ValidadorOrtografia validadorOrtografia= new ValidadorOrtografia();List<Error> errores = validadorOrtografia.detectarErroresOrtografia(parrafos);assertEquals("error1", errores.get(0));//..

Sin API de Dominio

Cómo lograr mejores pruebas

@Testpublic void pruebaConApiDominio() { List<Parrafo> parrafos = crearEntradaBlog(); ValidadorOrtografia validadorOrtografia = new ValidadorOrtografia(); List<Error> errores = validadorOrtografia.detectarErroresOrtografia(parrafos); verificarErroresEnEntradaBlog(errores);}

Usando API de Dominio

Andreina del Valle Romero Parra - Ceiba Software
La ventaja de utilizar un api de dominio es que permite concentrarnos en la carnita de la prueba y no en la salsa

1 Concepto x TestPráctica 5

Cómo lograr mejores pruebas

Sostenga LíquidoSe pueda

sostener sin quemarse

Sostenga líquido caliente

Se pueda tomar sin derramar

Cómo lograr mejores pruebas

Se validan todas las funcionalidades

Verificar que el líquido no se derrame

Verificar que sostenga líquido caliente

Verificar que al sostener la taza no se pase el calor

Verificar que se puede tomar de ella sin que se derrame

Cómo lograr mejores pruebas

Se validan por separadoVerificar que el líquido no se derrame

Verificar que sostenga líquido caliente

No se sienta el calor

No se derrame al tomar de ella

Andreina del Valle Romero Parra - Ceiba Software
Una prueba debería tener sólo una razón para fallar

Cómo lograr mejores pruebas

@Testpublic void pruebaConDosConceptos() { CarreraService service = new CarreraService(); Carrera carrera = new Carrera(); String codigoCarrera = service.createCarrera(carrera); assertEquals("24102015", codigoCarrera); Carrera carreraEncontrada = service.consultarCarrera(codigoCarrera); assertEquals("Pruebas Ágiles", carreraEncontrada.getNombre());}

Dos conceptos en la prueba

¿Cómo vamos hasta aquí?

Datos exclusivos para pruebasPráctica 6

Cómo lograr mejores pruebas

Única base de datos

PedroDiana

Cómo lograr mejores pruebas

Jenkins

Única base de datos

Cómo lograr mejores pruebas

Datos exclusivos para pruebas

Base de datos Desarrollo Base de datos Pruebas

Andreina del Valle Romero Parra - Ceiba Software
Buscar el término que debo usar para manener actualizada la base de datos de prueba, migración? o qué?

Page ObjectPráctica 7

Cómo lograr mejores pruebas

Patrón Page Object

Nombre Paciente:

Documento:

Buscar Cita

public class BusquedaCitaPage {public void ingresarNombrePaciente() { //...}

public void ingresarDocumentoIdentidad() { //...}public void clicBuscarCita() { //...}}

CLASE TEST

Criterios de Aceptación Bien DefinidosPráctica 8

Cómo lograr mejores pruebas

Escenario acoplado a la interfazGiven Estoy en la pagina de Condiciones de Uso

When Hago clic en el botón "btn_LeerTerminos"  

And Hago scroll down

And Hago touch en el enlace "Aceptar Terminos"    

And Hago touch en el enlace "Imprimir en PDF" nombrado "link_print_pdf" en la posición 1

Then Se muestra el pdf TerminosYCondiciones.pdf

Cómo lograr mejores pruebas

Escenario definido en términos de negocio

Given Estoy en la pagina de Aceptación de la Aplicación Cuadrantes

When Acepto los Términos y Condiciones

And Selecciono la opción "Imprimir en PDF"

Then Se muestra el pdf "TerminosYCondiciones.pdf"

Pruebas que aportan valor

Bootstrap

Código legacy

Pruebas que aportan valor

Cómo lograr mejores pruebas

@Testpublic void pruebaNoAportaMuchoValor() { assertNotNull(Calendar.getInstance().getTime());}

No aporta valor al negocio

Cómo lograr mejores pruebas

public class BuscadorServlet extends HttpServlet { public void doPost(HttpServletRequest request, HttpServletResponse res) throws ServletException, IOException { String forwardTo = null; forwardTo = getUrlForward(request); res.sendRedirect(forwardTo); } public String getUrlForward(HttpServletRequest request) { String forwardTo = null; int codigoMapeoMenu = getCodigoUsuario(request); switch (codigoMapeoMenu) { case CodigoMenu.BUSCADOR_PERSONANATURAL: forwardTo = "/servlet/" + BuscadorPersonaNaturalServlet.class.getName(); break; case CodigoMenu.BUSCADOR_PERSONAJURIDICA: forwardTo = "/servlet/" + BuscadorPersonaJuridicaServlet.class.getName(); break; case CodigoMenu.BUSCADOR_BENEFICIARIO: forwardTo = "/servlet/" + BuscadorBeneficiarioServlet.class.getName(); break; } return forwardTo;}

Un servlet

Cómo lograr mejores pruebas

@Testpublic void pruebaForwardCodigo001() { BuscadorServlet servlet= new BuscadorServlet(); HttpServletRequest req = Mockito.mock(HttpServletRequest.class); Mockito.when(req.getParameter("id_codigo:_usuario")).thenReturn("001"); assertEquals("/servlet/BuscadorPersonaNaturalServlet", servlet.getUrlForward(req));}

No aporta valor al negocio

Cómo lograr mejores pruebas

function validarFormulario(evObject) { evObject.preventDefault(); var todoCorrecto = true; var formulario = document.formularioContacto; for (var i=0; i<formulario.length; i++) { if(formulario[i].type =='text') { if (formulario[i].value == null || formulario[i].value.length == 0 || /^\s*$/.test(formulario[i].value)) { alert (formulario[i].name + ' no puede estar vacío o contener sólo espacios en blanco'); todoCorrecto=false; } } if (todoCorrecto ==true) { formulario.submit(); }}

Validaciones en javascript

Cómo lograr mejores pruebas

public Taxi(String nombreCiudad, String valorMatricula, String valorTipoMotor) { this.setCiudad("México D.F."); this.setMatricula(valorMatricula); this.setTipoMotor(valorTipoMotor);}

Prueba de constructores

Cómo lograr mejores pruebas

Enfocarse en la lógica de negocio

Cómo lograr mejores pruebas

¿Cuáles pruebas aportan valor? Las pruebas que validen las reglas de negocio.

Se puede comenzar por la funcionalidad principal y así sucesivamente ir cubriendo funcionalidades

AGILE

¿Qué podemos concluir?

Cómo lograr mejores pruebas

Conclusión

Pruebas “Quick and Dirty”

Equipo estimará mayor tiempo

Product Owner forzado a obviar

las pruebas

El equipo temerá refactorizar

Código de producción deteriorado

Cómo lograr mejores pruebas

 

Tomarse un tiempo para las pruebas

 

Cómo lograr mejores pruebas

 

¡Gracias!Bienvenido el feedback:

@andreinaromero

andreina.romero@ceiba.com.co

Cómo lograr mejores pruebas

 

¿Dudas?