cómo lograr mejores pruebas

53
Cómo lograr mejores pruebas Andreína Romero @andreinaromero

Upload: andreina-romero

Post on 13-Apr-2017

572 views

Category:

Software


0 download

TRANSCRIPT

Page 1: Cómo lograr mejores pruebas

Cómo lograr mejores pruebas

Andreína Romero@andreinaromero

Page 2: Cómo lograr mejores pruebas

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

Page 3: Cómo lograr mejores pruebas

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
Page 4: Cómo lograr mejores pruebas

Cómo lograr mejores pruebas

Pruebas Funcionales

 

Puede volar

La cámara se mantiene estable Direcciona correctamente

Se maneja a control remoto

Page 5: Cómo lograr mejores pruebas

Cómo lograr mejores pruebas

 

Escenario de implementación de pruebas7:00 am

 

4:45 pm 5:00 pm

Tests“Quick and dirty”

Page 6: Cómo lograr mejores pruebas

Código LimpioPráctica I

Page 7: Cómo lograr mejores pruebas

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
Page 8: Cómo lograr mejores pruebas

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
Page 9: Cómo lograr mejores pruebas

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

Page 10: Cómo lograr mejores pruebas

Cómo lograr mejores pruebas

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

Legible

Page 11: Cómo lograr mejores pruebas

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

Page 12: Cómo lograr mejores pruebas

Cómo lograr mejores pruebas

F   astI    ndependentR   epeatableS   elf-ValidatingT   imely

Page 13: Cómo lograr mejores pruebas

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

Page 14: Cómo lograr mejores pruebas

Cómo lograr mejores pruebas

public class ProductoAlmacen {

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

No repetible

Page 15: Cómo lograr mejores pruebas

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

Page 16: Cómo lograr mejores pruebas

Cómo lograr mejores pruebas

public class ProductoAlmacen {

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

//.....

Repetible

Page 17: Cómo lograr mejores pruebas

Patrón AAAPráctica 3

Page 18: Cómo lograr mejores pruebas

Cómo lograr mejores pruebas

ArrangeActAssert

Page 19: Cómo lograr mejores pruebas

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

Page 20: Cómo lograr mejores pruebas

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

Page 21: Cómo lograr mejores pruebas

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
Page 22: Cómo lograr mejores pruebas

Cómo lograr mejores pruebas

Un Blog

Validador Ortografía

Publicador

Formateador texto

Page 23: Cómo lograr mejores pruebas

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

Page 24: Cómo lograr mejores pruebas

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
Page 25: Cómo lograr mejores pruebas

1 Concepto x TestPráctica 5

Page 26: Cómo lograr mejores pruebas

Cómo lograr mejores pruebas

Sostenga LíquidoSe pueda

sostener sin quemarse

Sostenga líquido caliente

Se pueda tomar sin derramar

Page 27: Cómo lograr mejores pruebas

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

Page 28: Cómo lograr mejores pruebas

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
Page 29: Cómo lograr mejores pruebas

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

Page 30: Cómo lograr mejores pruebas

¿Cómo vamos hasta aquí?

Page 31: Cómo lograr mejores pruebas

Datos exclusivos para pruebasPráctica 6

Page 32: Cómo lograr mejores pruebas

Cómo lograr mejores pruebas

Única base de datos

PedroDiana

Page 33: Cómo lograr mejores pruebas

Cómo lograr mejores pruebas

Jenkins

Única base de datos

Page 34: Cómo lograr mejores pruebas

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 35: Cómo lograr mejores pruebas

Page ObjectPráctica 7

Page 36: Cómo lograr mejores pruebas

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

Page 37: Cómo lograr mejores pruebas

Criterios de Aceptación Bien DefinidosPráctica 8

Page 38: Cómo lograr mejores pruebas

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

Page 39: Cómo lograr mejores pruebas

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"

Page 40: Cómo lograr mejores pruebas

Pruebas que aportan valor

Page 41: Cómo lograr mejores pruebas

Bootstrap

Código legacy

Pruebas que aportan valor

Page 42: Cómo lograr mejores pruebas

Cómo lograr mejores pruebas

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

No aporta valor al negocio

Page 43: Cómo lograr mejores pruebas

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

Page 44: Cómo lograr mejores pruebas

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

Page 45: Cómo lograr mejores pruebas

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

Page 46: Cómo lograr mejores pruebas

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

Page 47: Cómo lograr mejores pruebas

Cómo lograr mejores pruebas

Enfocarse en la lógica de negocio

Page 48: Cómo lograr mejores pruebas

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

Page 49: Cómo lograr mejores pruebas

¿Qué podemos concluir?

Page 50: Cómo lograr mejores pruebas

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

Page 51: Cómo lograr mejores pruebas

Cómo lograr mejores pruebas

 

Tomarse un tiempo para las pruebas

 

Page 52: Cómo lograr mejores pruebas

Cómo lograr mejores pruebas

 

¡Gracias!Bienvenido el feedback:

@andreinaromero

[email protected]

Page 53: Cómo lograr mejores pruebas

Cómo lograr mejores pruebas

 

¿Dudas?