Cómo lograr mejores pruebas
-
Upload
andreina-romero -
Category
Software
-
view
571 -
download
0
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
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
Cómo lograr mejores pruebas
Simples y Expresivas
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
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
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
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
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
¿Dudas?