SlideShare una empresa de Scribd logo
1 de 53
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 pruebas
7:00 am
4:45 pm 5:00 pm
Tests
“Quick and dirty”
Código Limpio
Prá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
@Test
public 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
@Test
public 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 ast
I ndependent
R epeatable
S elf-Validating
T imely
Cómo lograr mejores pruebas
@Test
public 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
@Test
public 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 AAA
Práctica 3
Cómo lograr mejores pruebas
Arrange
Act
Assert
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
@Test
public 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 dominio
Prá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
@Test
public 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 Test
Práctica 5
Cómo lograr mejores pruebas
Sostenga Líquido
Se 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 separado
Verificar 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
@Test
public 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 pruebas
Práctica 6
Cómo lograr mejores pruebas
Única base de datos
Pedro
Diana
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 Object
Prá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 Definidos
Práctica 8
Cómo lograr mejores pruebas
Escenario acoplado a la interfaz
Given 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
@Test
public 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
@Test
public 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?

Más contenido relacionado

Similar a Cómo escribir pruebas unitarias que aporten valor

Conexion sql server 2005 java netbeans
Conexion sql server 2005 java netbeansConexion sql server 2005 java netbeans
Conexion sql server 2005 java netbeansjbersosa
 
Unit Testing - Trovit
Unit Testing - TrovitUnit Testing - Trovit
Unit Testing - TrovitJordi Gerona
 
REVIEWCLEANCODE9-11_GROUP4_FINAL.pptx
REVIEWCLEANCODE9-11_GROUP4_FINAL.pptxREVIEWCLEANCODE9-11_GROUP4_FINAL.pptx
REVIEWCLEANCODE9-11_GROUP4_FINAL.pptxHacheLOrtega
 
Unit Testing - GTUG
Unit Testing - GTUGUnit Testing - GTUG
Unit Testing - GTUGJordi Gerona
 
Lecciones aprendidas creando una red social
Lecciones aprendidas creando una red socialLecciones aprendidas creando una red social
Lecciones aprendidas creando una red socialRoberto Luis Bisbé
 
Introducción a Unit Testing y TDD
Introducción a Unit Testing y TDDIntroducción a Unit Testing y TDD
Introducción a Unit Testing y TDDFernando Perez
 
Ejercicio de automatizacion IntelliJ+reporte.docx
Ejercicio de automatizacion IntelliJ+reporte.docxEjercicio de automatizacion IntelliJ+reporte.docx
Ejercicio de automatizacion IntelliJ+reporte.docxssuser2e6b96
 
UTPL-PROGRAMACIÓN AVANZADA-II-BIMESTRE-(OCTUBRE 2011-FEBRERO 2012)
UTPL-PROGRAMACIÓN AVANZADA-II-BIMESTRE-(OCTUBRE 2011-FEBRERO 2012)UTPL-PROGRAMACIÓN AVANZADA-II-BIMESTRE-(OCTUBRE 2011-FEBRERO 2012)
UTPL-PROGRAMACIÓN AVANZADA-II-BIMESTRE-(OCTUBRE 2011-FEBRERO 2012)Videoconferencias UTPL
 
7090112 Clase Transact Sql Server
7090112 Clase Transact Sql Server7090112 Clase Transact Sql Server
7090112 Clase Transact Sql ServerCorfapo
 
Taller desarrollo de apis
Taller desarrollo de apisTaller desarrollo de apis
Taller desarrollo de apisCloudAppi
 
¿En qué la estamos regando en pruebas de software?
¿En qué la estamos regando en pruebas de software?¿En qué la estamos regando en pruebas de software?
¿En qué la estamos regando en pruebas de software?Agustin Ramos
 
Tdd y clean code SG campus
Tdd y clean code SG campusTdd y clean code SG campus
Tdd y clean code SG campusSoftware Guru
 

Similar a Cómo escribir pruebas unitarias que aporten valor (20)

Conexion sql server 2005 java netbeans
Conexion sql server 2005 java netbeansConexion sql server 2005 java netbeans
Conexion sql server 2005 java netbeans
 
Unit Testing - Trovit
Unit Testing - TrovitUnit Testing - Trovit
Unit Testing - Trovit
 
REVIEWCLEANCODE9-11_GROUP4_FINAL.pptx
REVIEWCLEANCODE9-11_GROUP4_FINAL.pptxREVIEWCLEANCODE9-11_GROUP4_FINAL.pptx
REVIEWCLEANCODE9-11_GROUP4_FINAL.pptx
 
Unit Testing - GTUG
Unit Testing - GTUGUnit Testing - GTUG
Unit Testing - GTUG
 
Lab7-POO
Lab7-POOLab7-POO
Lab7-POO
 
Taller 080364 sgbd-0102 - java&amp;postgre sql
Taller 080364 sgbd-0102 - java&amp;postgre sqlTaller 080364 sgbd-0102 - java&amp;postgre sql
Taller 080364 sgbd-0102 - java&amp;postgre sql
 
Lecciones aprendidas creando una red social
Lecciones aprendidas creando una red socialLecciones aprendidas creando una red social
Lecciones aprendidas creando una red social
 
Unidad 3 AJAX
Unidad 3 AJAX Unidad 3 AJAX
Unidad 3 AJAX
 
Unidad3ajax
Unidad3ajaxUnidad3ajax
Unidad3ajax
 
Introducción a Unit Testing y TDD
Introducción a Unit Testing y TDDIntroducción a Unit Testing y TDD
Introducción a Unit Testing y TDD
 
Jquery para principianes
Jquery para principianesJquery para principianes
Jquery para principianes
 
J M E R L I N P H P
J M E R L I N P H PJ M E R L I N P H P
J M E R L I N P H P
 
Ejercicio de automatizacion IntelliJ+reporte.docx
Ejercicio de automatizacion IntelliJ+reporte.docxEjercicio de automatizacion IntelliJ+reporte.docx
Ejercicio de automatizacion IntelliJ+reporte.docx
 
UTPL-PROGRAMACIÓN AVANZADA-II-BIMESTRE-(OCTUBRE 2011-FEBRERO 2012)
UTPL-PROGRAMACIÓN AVANZADA-II-BIMESTRE-(OCTUBRE 2011-FEBRERO 2012)UTPL-PROGRAMACIÓN AVANZADA-II-BIMESTRE-(OCTUBRE 2011-FEBRERO 2012)
UTPL-PROGRAMACIÓN AVANZADA-II-BIMESTRE-(OCTUBRE 2011-FEBRERO 2012)
 
7090112 Clase Transact Sql Server
7090112 Clase Transact Sql Server7090112 Clase Transact Sql Server
7090112 Clase Transact Sql Server
 
Taller desarrollo de apis
Taller desarrollo de apisTaller desarrollo de apis
Taller desarrollo de apis
 
Symfony parte 16
Symfony parte 16Symfony parte 16
Symfony parte 16
 
¿En qué la estamos regando en pruebas de software?
¿En qué la estamos regando en pruebas de software?¿En qué la estamos regando en pruebas de software?
¿En qué la estamos regando en pruebas de software?
 
Tdd y clean code SG campus
Tdd y clean code SG campusTdd y clean code SG campus
Tdd y clean code SG campus
 
06 validación
06 validación06 validación
06 validación
 

Último

Unidad_3_T1_AutomatasFinitos presentacion
Unidad_3_T1_AutomatasFinitos presentacionUnidad_3_T1_AutomatasFinitos presentacion
Unidad_3_T1_AutomatasFinitos presentacionarmando_cardenas
 
PARTES DEL TECLADO Y SUS FUNCIONES - EJEMPLO
PARTES DEL TECLADO Y SUS FUNCIONES - EJEMPLOPARTES DEL TECLADO Y SUS FUNCIONES - EJEMPLO
PARTES DEL TECLADO Y SUS FUNCIONES - EJEMPLOSelenaCoronadoHuaman
 
Introducción a Funciones LENGUAJE DART FLUTTER
Introducción a Funciones LENGUAJE DART FLUTTERIntroducción a Funciones LENGUAJE DART FLUTTER
Introducción a Funciones LENGUAJE DART FLUTTEREMMAFLORESCARMONA
 
Caso de éxito de Hervian con el ERP Sage 200
Caso de éxito de Hervian con el ERP Sage 200Caso de éxito de Hervian con el ERP Sage 200
Caso de éxito de Hervian con el ERP Sage 200Opentix
 
BREEAM ES Urbanismo como herramienta para un planeamiento sostenible - Miguel...
BREEAM ES Urbanismo como herramienta para un planeamiento sostenible - Miguel...BREEAM ES Urbanismo como herramienta para un planeamiento sostenible - Miguel...
BREEAM ES Urbanismo como herramienta para un planeamiento sostenible - Miguel...ITeC Instituto Tecnología Construcción
 
Segmentacion Segmantica_Modelos UNET and DEEPLABV3
Segmentacion Segmantica_Modelos UNET and DEEPLABV3Segmentacion Segmantica_Modelos UNET and DEEPLABV3
Segmentacion Segmantica_Modelos UNET and DEEPLABV3AlexysCaytanoMelndez1
 
Manual de Usuario APPs_AppInventor-2023.pdf
Manual de Usuario APPs_AppInventor-2023.pdfManual de Usuario APPs_AppInventor-2023.pdf
Manual de Usuario APPs_AppInventor-2023.pdfmasogeis
 

Último (7)

Unidad_3_T1_AutomatasFinitos presentacion
Unidad_3_T1_AutomatasFinitos presentacionUnidad_3_T1_AutomatasFinitos presentacion
Unidad_3_T1_AutomatasFinitos presentacion
 
PARTES DEL TECLADO Y SUS FUNCIONES - EJEMPLO
PARTES DEL TECLADO Y SUS FUNCIONES - EJEMPLOPARTES DEL TECLADO Y SUS FUNCIONES - EJEMPLO
PARTES DEL TECLADO Y SUS FUNCIONES - EJEMPLO
 
Introducción a Funciones LENGUAJE DART FLUTTER
Introducción a Funciones LENGUAJE DART FLUTTERIntroducción a Funciones LENGUAJE DART FLUTTER
Introducción a Funciones LENGUAJE DART FLUTTER
 
Caso de éxito de Hervian con el ERP Sage 200
Caso de éxito de Hervian con el ERP Sage 200Caso de éxito de Hervian con el ERP Sage 200
Caso de éxito de Hervian con el ERP Sage 200
 
BREEAM ES Urbanismo como herramienta para un planeamiento sostenible - Miguel...
BREEAM ES Urbanismo como herramienta para un planeamiento sostenible - Miguel...BREEAM ES Urbanismo como herramienta para un planeamiento sostenible - Miguel...
BREEAM ES Urbanismo como herramienta para un planeamiento sostenible - Miguel...
 
Segmentacion Segmantica_Modelos UNET and DEEPLABV3
Segmentacion Segmantica_Modelos UNET and DEEPLABV3Segmentacion Segmantica_Modelos UNET and DEEPLABV3
Segmentacion Segmantica_Modelos UNET and DEEPLABV3
 
Manual de Usuario APPs_AppInventor-2023.pdf
Manual de Usuario APPs_AppInventor-2023.pdfManual de Usuario APPs_AppInventor-2023.pdf
Manual de Usuario APPs_AppInventor-2023.pdf
 

Cómo escribir pruebas unitarias que aporten valor

  • 1. Cómo lograr mejores pruebas Andreína Romero @andreinaromero
  • 2. 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
  • 3. Cómo lograr mejores pruebas Pruebas Unitarias
  • 4. Cómo lograr mejores pruebas Pruebas Funcionales  Puede volar  La cámara se mantiene estable  Direcciona correctamente  Se maneja a control remoto
  • 5. Cómo lograr mejores pruebas Escenario de implementación de pruebas 7:00 am 4:45 pm 5:00 pm Tests “Quick and dirty”
  • 7. Cómo lograr mejores pruebas Código de implementación de las pruebas LIMPIO  Que sea legible  Que sea legible  Que sea legible
  • 8. Cómo lograr mejores pruebas Simples y Expresivas
  • 9. Cómo lograr mejores pruebas @Test public 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
  • 10. Cómo lograr mejores pruebas @Test public void pruebaClean() { Employee anEmployee = anEmployee().build(); employeeService.createEmployee(anEmployee); verify(employeeDao).saveEmployee(anEmployee); } Legible
  • 12. Cómo lograr mejores pruebas F ast I ndependent R epeatable S elf-Validating T imely
  • 13. Cómo lograr mejores pruebas @Test public void pruebaNoRepetible() { ProductoAlmacen producto = new ProductoAlmacen(); producto.setFechaVencimiento("24/10/2015"); Boolean estaVencido = producto.estaVencido(); assertTrue(estaVencido); } No repetible
  • 14. Cómo lograr mejores pruebas public class ProductoAlmacen { public Boolean estaVencido() { Calendar calendar = Calendar.getInstance(); return calendar.getTime().equals(this.getFechaVencimiento()); } //..... No repetible
  • 15. Cómo lograr mejores pruebas @Test public 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
  • 16. Cómo lograr mejores pruebas public class ProductoAlmacen { public Boolean estaVencido() { Date fechaHoy = convertirDateAString(this.timer.getFechaHoy()); return fechaHoy.equals(this.getFechaVencimiento()); } //..... Repetible
  • 18. Cómo lograr mejores pruebas Arrange Act Assert
  • 19. 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
  • 20. Cómo lograr mejores pruebas @Test public 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
  • 22. Cómo lograr mejores pruebas Un Blog Validador Ortografía Publicador Formateador texto
  • 23. 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
  • 24. Cómo lograr mejores pruebas @Test public void pruebaConApiDominio() { List<Parrafo> parrafos = crearEntradaBlog(); ValidadorOrtografia validadorOrtografia = new ValidadorOrtografia(); List<Error> errores = validadorOrtografia.detectarErroresOrtografia(parrafos); verificarErroresEnEntradaBlog(errores); } Usando API de Dominio
  • 25. 1 Concepto x Test Práctica 5
  • 26. Cómo lograr mejores pruebas Sostenga Líquido Se pueda sostener sin quemarse Sostenga líquido caliente Se pueda tomar sin derramar
  • 27. 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
  • 28. Cómo lograr mejores pruebas Se validan por separado Verificar 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
  • 29. Cómo lograr mejores pruebas @Test public 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
  • 31. Datos exclusivos para pruebas Práctica 6
  • 32. Cómo lograr mejores pruebas Única base de datos Pedro Diana
  • 33. Cómo lograr mejores pruebas Jenkins Única base de datos
  • 34. Cómo lograr mejores pruebas Datos exclusivos para pruebas Base de datos Desarrollo Base de datos Pruebas
  • 36. 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
  • 37. Criterios de Aceptación Bien Definidos Práctica 8
  • 38. Cómo lograr mejores pruebas Escenario acoplado a la interfaz Given 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
  • 39. 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"
  • 42. Cómo lograr mejores pruebas @Test public void pruebaNoAportaMuchoValor() { assertNotNull(Calendar.getInstance().getTime()); } No aporta valor al negocio
  • 43. 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
  • 44. Cómo lograr mejores pruebas @Test public 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
  • 45. 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
  • 46. 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
  • 47. Cómo lograr mejores pruebas Enfocarse en la lógica de negocio
  • 48. 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
  • 50. 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
  • 51. Cómo lograr mejores pruebas Tomarse un tiempo para las pruebas
  • 52. Cómo lograr mejores pruebas ¡Gracias! Bienvenido el feedback: @andreinaromero andreina.romero@ceiba.com.co
  • 53. Cómo lograr mejores pruebas ¿Dudas?