Test Unitarios Diseño al cubo : Plan TDD Donostia, 06/05/2011
Plan TDD Test unitarios Plan TDD Donewtech: Formación test unitarios Formación TDD Dojo newtech Coaching Carlos Blé a primeros de octubre
Formación test unitarios Test unitarios Agenda : Tipos de test  Test unitarios Mocks y Stubs Tareas / etxeko-lanak
Formación test unitarios Test unitarios Tipos de test : Test funcionales o aceptación Test que garantiza que el software hace lo que desea el usuario. Test de integración Test que garantizan que el software se integra correctamente con  los recursos externos: BBDD, LDAP, API externas, etc. Test de rendimiento Test que garantizan el rendimiento del software en las situaciones  requeridas por el usuario.  Test unitarios Test que prueba la correcta funcionalidad de las clases y garantizan la mantenibilidad del software.
Formación test unitarios Test unitarios Tipos de test : Frente Frente Frente Frente Test de aceptación Test de integración Test de rendimiento  Test unitarios Software
Formación test unitarios Test unitarios Agenda : Tipos de test  Test unitarios Mocks y Stubs Tareas / etxeko-lanak
Formación test unitarios Test unitarios Test Unitarios: Qué es una prueba unitaria? Una prueba unitaria es una pieza de código escrito por un desarrollador  que prueba una pequeña área específica de la funcionalidad del código
Formación test unitarios Test unitarios Test Unitarios:
Formación test unitarios Test unitarios Test Unitarios: Escusas para no hacer test unitario - Cuesta mucho tiempo hacer los test  - Cuesta mucho tiempo ejecutar los test - No es mi trabajo testear mi código  - Ya compila... no vale?  - Cuesta mucho tiempo hacer los test  - A mi me pagan por escribir código, no por  escribir tests
Formación test unitarios Test unitarios Test Unitarios: Beneficios de hacer test unitarios - Mejora el diseño de la implementación  - Reduce el tiempo invertido debuggeando  - Se gana “seguridad” en los cambios  -  Te hace la vida más fácil y tranquila  - Ayuda a documentar el código  - Se pone el código en situaciones extremas
Formación test unitarios Test unitarios Test Unitarios: Estructura de un test - Preparar y configurar el estado necesario para realizar el test - Realizar la llamada al método que se quiere testear - Verificar el resultado obtenido A rrange A ct A ssert
Formación test unitarios Test unitarios Test Unitarios: Propiedades de un buen test -  A utomatic:  los tests se deben ejecutar automáticamente -  T horough:  exaustivos, se prueba todo que sea sensible al fallo -  R epeatable:  ejecutar el test una y otra vez, con el mismo resultado  -  I ndependent:  Independiente entre los otros test y del entorno -  P rofessional:  Debe ser código como si fuera producción
Formación test unitarios Test unitarios Test Unitarios: Qué testear? -  Right :  Si el código se ejecuta correctamente, ¿cómo lo sé? Right-BICEP -  B oundary :  Probar condiciones límite, muchos “bugs” viven allí -  I nverse :  Testear la lógica inversa si es posible -  C ross-check :  Cotejar los resultados utilizando diferentes medios   -  E rror conditions :  Forzar las situaciones de error  -  P erformance :  Probar las características de rendimiento si requiere
Formación test unitarios Test unitarios Ejemplo  de clase :
Formación test unitarios Test unitarios Ejemplo de test:
Formación test unitarios Test unitarios Ejemplo de test:
Formación test unitarios Test unitarios Agenda : Tipos de test  Test unitarios Mocks y Stubs Tareas / etxeko-lanak
Plan TDD Dobles de prueba Un doble de prueba es un objeto que no es el real y  que usamos para poder probar una funcionalidad aislándonos del resto de los objetos del sistema ¿Qué son los doble de prueba?
Plan TDD Tipos de doble de prueba (o roles) Stub Mock Spy Fake dummy Dobles de prueba
Plan TDD Dobles de prueba Frameworks para trabajar con dobles de prueba Java mockito easyMock Jmock … JavaScript JsTestDriver Jsmockito JsHamcrest Sinon.JS Qunit
Plan TDD Dobles de prueba Un  stub  es un objeto que programamos para que nos devuelva lo que nos de la gana y poder probar cómo reacciona nuestro código ante los distintos valores de respuesta del colaborador en cuestión Stubs
Plan TDD Dobles de prueba Ejemplo de stub  (usando mockito) public class CompraTest { Producto unProductoStub =  mock (Producto.class); Producto otroProductoStub =  mock (Producto.class); PasarelaDePago pasarelaDePagoStub =  mock (PasarelaDePago.class); Compra compra = new Compra(pasarelaDePagoStub); @Test public void  si_el_cliente_tiene_fondos_para_realizar_la_compra_la_puedo_confirmar() { when (unProductoStub.precio()). thenReturn (50); when (otroProductoStub.precio()). thenReturn (25); when (pasarelaDePagoStub.tieneElUsuarioFondosPorValorDe(75)). thenReturn (true); compra.anadir(unProductoStub); compra.anadir(otroProductoStub); assertTrue(compra.confirmar()); } }
Plan TDD public class Compra { private final List<Producto> productos = new ArrayList(); private final PasarelaDePago pasarelaDePago; public Compra(PasarelaDePago pasarelaDePagoStub) { this.pasarelaDePago = pasarelaDePagoStub; } public void anadir(Producto producto) { productos.add(producto); } public int precio() { int precioTotalCompra = 0; for (Producto producto : productos) { precioTotalCompra+=producto.precio(); } return precioTotalCompra; } boolean confirmar() { return pasarelaDePago.tieneElUsuarioFondosPorValorDe(precio()); } } Dobles de prueba
Plan TDD Dobles de prueba Mocks Un  mock  es un doble que nos sirve para verificar salidas indirectas del objeto que estamos probando
Plan TDD Dobles de prueba Ejemplo de mock  (usando easyMock) public class CompraTestMocks { PasarelaDePago pasarelaDePagoMock = createMock(PasarelaDePago.class); Producto unProductoStub = createMock(Producto.class); Compra compra = new Compra(pasarelaDePagoMock); @Test public void  si_el_cliente_tiene_fondos_para_realizar_la_compra_tengo_que_cobrarle_a_traves_de_la_pasarela_de_pago() { expect (unProductoStub.precio()). andReturn (50); expect (pasarelaDePagoMock.tieneElUsuarioFondosPorValorDe(50)). andReturn (true); pasarelaDePagoMock.cobrar(50); replay (pasarelaDePagoMock); replay (unProductoStub); compra.anadir(unProductoStub); compra.confirmar(); verify (pasarelaDePagoMock); } }
Plan TDD boolean confirmar() { int elPrecioDeLaCompra = precio(); boolean tieneElUsuarioFondos = pasarelaDePago.tieneElUsuarioFondosPorValorDe(elPrecioDeLaCompra); if (tieneElUsuarioFondos){ pasarelaDePago.cobrar(elPrecioDeLaCompra); } return tieneElUsuarioFondos; } Dobles de prueba
Plan TDD Dobles de prueba Spies Al igual que los  mocks , los  spies  sirven para hacer comprobaciones sobre salidas indirectas. La diferencia es que con un  Spy  lo que hacemos es después de ejecutar el método a probar verificar si sobre el doble se ha invocado a tal o cual método
Plan TDD Dobles de prueba Ejemplo de Spy  (usando mockito) public class CompraTestSpies { PasarelaDePago pasarelaDePagoSpy =  mock (PasarelaDePago.class); Producto unProductoStub =  mock (Producto.class); Compra compra = new Compra(pasarelaDePagoSpy); @Test public void si_el_cliente_tiene_fondos_para_realizar_la_compra_tengo_que_cobrarle_a_traves_de_la_pasarela_de_pago() { when (unProductoStub.precio()). thenReturn (50); when (pasarelaDePagoSpy.tieneElUsuarioFondosPorValorDe(50)). thenReturn (false); compra.anadir(unProductoStub); compra.confirmar(); verify (pasarelaDePagoSpy).cobrar(50); } }
Plan TDD Dobles de prueba Entonces ¿Mocks o Spies?
Plan TDD Dobles de prueba Fakes Un  fake  es una implementación falsa de un determinado interfaz, más simple normalmente, con el objetivo de hacer que el test se pueda ejecutar más rápido o sin dependencias de un sistema externo.  Por ejemplo un  fake  de un objeto que acceda a la persistencia podría ser una implementación en memoria del mismo objeto.
Plan TDD Dobles de prueba Dummy Un  dummy  es simplemente cuando el objeto a probar tiene algún colaborador que no vamos a utilizar en este test, entonces se le pasa un  dummy  que puede ser simplemente un nulo
Plan TDD Webs de referencia Mock Sucks http://www.testingtv.com/2010/12/20/mocks-suck-and-what-to-do-about-it/ Java Mock Frameworks Comparison http://www.sizovpoint.com/2009/03/java-mock-frameworks-comparison.html Diferencias entre mocks y stubs http://theproc.es/2009/5/21/658/diferencias-entre-mocks-y-stubs Escribiendo mejores tests http://weblogs.javahispano.org/artesanodeprimera/entry/escribiendo_mejores_test_iii_mocking Dobles de prueba
Formación test unitarios Test unitarios Agenda : Tipos de test  Test unitarios Mocks y Stubs Tareas / etxeko-lanak
Formación test unitarios Test unitarios Tarea: Descargar proyecto “ encryptor ” (//dominio/proyectos/dnt) Realizar test unitarios de los métodos públicos
Formación test unitarios Test unitarios Tarea : Crear un tarea/job en el servidor CI Jenkins  http://192.168.0.21:9090
Formación test unitarios Test unitarios Tarea : Empezar a crear test unitarios en los proyectos  Programar la ejecución de los test en Jenkins CI
Formación test unitarios Test unitarios ¡Nos vemos en 15 días!
Ruben Egiluz Software Engineer Ivan Rodriguez Software Engineer Donewtech Solutions, S.L. Zubiberri Bidea 31 Edificio Urumea 20018 Donostia – San Sebastián +34 943 223 031 www.donewtech.com ¡¡Gracias!!

Test unitarios

  • 1.
    Test Unitarios Diseñoal cubo : Plan TDD Donostia, 06/05/2011
  • 2.
    Plan TDD Testunitarios Plan TDD Donewtech: Formación test unitarios Formación TDD Dojo newtech Coaching Carlos Blé a primeros de octubre
  • 3.
    Formación test unitariosTest unitarios Agenda : Tipos de test Test unitarios Mocks y Stubs Tareas / etxeko-lanak
  • 4.
    Formación test unitariosTest unitarios Tipos de test : Test funcionales o aceptación Test que garantiza que el software hace lo que desea el usuario. Test de integración Test que garantizan que el software se integra correctamente con los recursos externos: BBDD, LDAP, API externas, etc. Test de rendimiento Test que garantizan el rendimiento del software en las situaciones requeridas por el usuario. Test unitarios Test que prueba la correcta funcionalidad de las clases y garantizan la mantenibilidad del software.
  • 5.
    Formación test unitariosTest unitarios Tipos de test : Frente Frente Frente Frente Test de aceptación Test de integración Test de rendimiento Test unitarios Software
  • 6.
    Formación test unitariosTest unitarios Agenda : Tipos de test Test unitarios Mocks y Stubs Tareas / etxeko-lanak
  • 7.
    Formación test unitariosTest unitarios Test Unitarios: Qué es una prueba unitaria? Una prueba unitaria es una pieza de código escrito por un desarrollador que prueba una pequeña área específica de la funcionalidad del código
  • 8.
    Formación test unitariosTest unitarios Test Unitarios:
  • 9.
    Formación test unitariosTest unitarios Test Unitarios: Escusas para no hacer test unitario - Cuesta mucho tiempo hacer los test - Cuesta mucho tiempo ejecutar los test - No es mi trabajo testear mi código - Ya compila... no vale? - Cuesta mucho tiempo hacer los test - A mi me pagan por escribir código, no por escribir tests
  • 10.
    Formación test unitariosTest unitarios Test Unitarios: Beneficios de hacer test unitarios - Mejora el diseño de la implementación - Reduce el tiempo invertido debuggeando - Se gana “seguridad” en los cambios - Te hace la vida más fácil y tranquila - Ayuda a documentar el código - Se pone el código en situaciones extremas
  • 11.
    Formación test unitariosTest unitarios Test Unitarios: Estructura de un test - Preparar y configurar el estado necesario para realizar el test - Realizar la llamada al método que se quiere testear - Verificar el resultado obtenido A rrange A ct A ssert
  • 12.
    Formación test unitariosTest unitarios Test Unitarios: Propiedades de un buen test - A utomatic: los tests se deben ejecutar automáticamente - T horough: exaustivos, se prueba todo que sea sensible al fallo - R epeatable: ejecutar el test una y otra vez, con el mismo resultado - I ndependent: Independiente entre los otros test y del entorno - P rofessional: Debe ser código como si fuera producción
  • 13.
    Formación test unitariosTest unitarios Test Unitarios: Qué testear? - Right : Si el código se ejecuta correctamente, ¿cómo lo sé? Right-BICEP - B oundary : Probar condiciones límite, muchos “bugs” viven allí - I nverse : Testear la lógica inversa si es posible - C ross-check : Cotejar los resultados utilizando diferentes medios - E rror conditions : Forzar las situaciones de error - P erformance : Probar las características de rendimiento si requiere
  • 14.
    Formación test unitariosTest unitarios Ejemplo de clase :
  • 15.
    Formación test unitariosTest unitarios Ejemplo de test:
  • 16.
    Formación test unitariosTest unitarios Ejemplo de test:
  • 17.
    Formación test unitariosTest unitarios Agenda : Tipos de test Test unitarios Mocks y Stubs Tareas / etxeko-lanak
  • 18.
    Plan TDD Doblesde prueba Un doble de prueba es un objeto que no es el real y que usamos para poder probar una funcionalidad aislándonos del resto de los objetos del sistema ¿Qué son los doble de prueba?
  • 19.
    Plan TDD Tiposde doble de prueba (o roles) Stub Mock Spy Fake dummy Dobles de prueba
  • 20.
    Plan TDD Doblesde prueba Frameworks para trabajar con dobles de prueba Java mockito easyMock Jmock … JavaScript JsTestDriver Jsmockito JsHamcrest Sinon.JS Qunit
  • 21.
    Plan TDD Doblesde prueba Un stub es un objeto que programamos para que nos devuelva lo que nos de la gana y poder probar cómo reacciona nuestro código ante los distintos valores de respuesta del colaborador en cuestión Stubs
  • 22.
    Plan TDD Doblesde prueba Ejemplo de stub (usando mockito) public class CompraTest { Producto unProductoStub = mock (Producto.class); Producto otroProductoStub = mock (Producto.class); PasarelaDePago pasarelaDePagoStub = mock (PasarelaDePago.class); Compra compra = new Compra(pasarelaDePagoStub); @Test public void si_el_cliente_tiene_fondos_para_realizar_la_compra_la_puedo_confirmar() { when (unProductoStub.precio()). thenReturn (50); when (otroProductoStub.precio()). thenReturn (25); when (pasarelaDePagoStub.tieneElUsuarioFondosPorValorDe(75)). thenReturn (true); compra.anadir(unProductoStub); compra.anadir(otroProductoStub); assertTrue(compra.confirmar()); } }
  • 23.
    Plan TDD publicclass Compra { private final List<Producto> productos = new ArrayList(); private final PasarelaDePago pasarelaDePago; public Compra(PasarelaDePago pasarelaDePagoStub) { this.pasarelaDePago = pasarelaDePagoStub; } public void anadir(Producto producto) { productos.add(producto); } public int precio() { int precioTotalCompra = 0; for (Producto producto : productos) { precioTotalCompra+=producto.precio(); } return precioTotalCompra; } boolean confirmar() { return pasarelaDePago.tieneElUsuarioFondosPorValorDe(precio()); } } Dobles de prueba
  • 24.
    Plan TDD Doblesde prueba Mocks Un mock es un doble que nos sirve para verificar salidas indirectas del objeto que estamos probando
  • 25.
    Plan TDD Doblesde prueba Ejemplo de mock (usando easyMock) public class CompraTestMocks { PasarelaDePago pasarelaDePagoMock = createMock(PasarelaDePago.class); Producto unProductoStub = createMock(Producto.class); Compra compra = new Compra(pasarelaDePagoMock); @Test public void si_el_cliente_tiene_fondos_para_realizar_la_compra_tengo_que_cobrarle_a_traves_de_la_pasarela_de_pago() { expect (unProductoStub.precio()). andReturn (50); expect (pasarelaDePagoMock.tieneElUsuarioFondosPorValorDe(50)). andReturn (true); pasarelaDePagoMock.cobrar(50); replay (pasarelaDePagoMock); replay (unProductoStub); compra.anadir(unProductoStub); compra.confirmar(); verify (pasarelaDePagoMock); } }
  • 26.
    Plan TDD booleanconfirmar() { int elPrecioDeLaCompra = precio(); boolean tieneElUsuarioFondos = pasarelaDePago.tieneElUsuarioFondosPorValorDe(elPrecioDeLaCompra); if (tieneElUsuarioFondos){ pasarelaDePago.cobrar(elPrecioDeLaCompra); } return tieneElUsuarioFondos; } Dobles de prueba
  • 27.
    Plan TDD Doblesde prueba Spies Al igual que los mocks , los spies sirven para hacer comprobaciones sobre salidas indirectas. La diferencia es que con un Spy lo que hacemos es después de ejecutar el método a probar verificar si sobre el doble se ha invocado a tal o cual método
  • 28.
    Plan TDD Doblesde prueba Ejemplo de Spy (usando mockito) public class CompraTestSpies { PasarelaDePago pasarelaDePagoSpy = mock (PasarelaDePago.class); Producto unProductoStub = mock (Producto.class); Compra compra = new Compra(pasarelaDePagoSpy); @Test public void si_el_cliente_tiene_fondos_para_realizar_la_compra_tengo_que_cobrarle_a_traves_de_la_pasarela_de_pago() { when (unProductoStub.precio()). thenReturn (50); when (pasarelaDePagoSpy.tieneElUsuarioFondosPorValorDe(50)). thenReturn (false); compra.anadir(unProductoStub); compra.confirmar(); verify (pasarelaDePagoSpy).cobrar(50); } }
  • 29.
    Plan TDD Doblesde prueba Entonces ¿Mocks o Spies?
  • 30.
    Plan TDD Doblesde prueba Fakes Un fake es una implementación falsa de un determinado interfaz, más simple normalmente, con el objetivo de hacer que el test se pueda ejecutar más rápido o sin dependencias de un sistema externo. Por ejemplo un fake de un objeto que acceda a la persistencia podría ser una implementación en memoria del mismo objeto.
  • 31.
    Plan TDD Doblesde prueba Dummy Un dummy es simplemente cuando el objeto a probar tiene algún colaborador que no vamos a utilizar en este test, entonces se le pasa un dummy que puede ser simplemente un nulo
  • 32.
    Plan TDD Websde referencia Mock Sucks http://www.testingtv.com/2010/12/20/mocks-suck-and-what-to-do-about-it/ Java Mock Frameworks Comparison http://www.sizovpoint.com/2009/03/java-mock-frameworks-comparison.html Diferencias entre mocks y stubs http://theproc.es/2009/5/21/658/diferencias-entre-mocks-y-stubs Escribiendo mejores tests http://weblogs.javahispano.org/artesanodeprimera/entry/escribiendo_mejores_test_iii_mocking Dobles de prueba
  • 33.
    Formación test unitariosTest unitarios Agenda : Tipos de test Test unitarios Mocks y Stubs Tareas / etxeko-lanak
  • 34.
    Formación test unitariosTest unitarios Tarea: Descargar proyecto “ encryptor ” (//dominio/proyectos/dnt) Realizar test unitarios de los métodos públicos
  • 35.
    Formación test unitariosTest unitarios Tarea : Crear un tarea/job en el servidor CI Jenkins http://192.168.0.21:9090
  • 36.
    Formación test unitariosTest unitarios Tarea : Empezar a crear test unitarios en los proyectos Programar la ejecución de los test en Jenkins CI
  • 37.
    Formación test unitariosTest unitarios ¡Nos vemos en 15 días!
  • 38.
    Ruben Egiluz SoftwareEngineer Ivan Rodriguez Software Engineer Donewtech Solutions, S.L. Zubiberri Bidea 31 Edificio Urumea 20018 Donostia – San Sebastián +34 943 223 031 www.donewtech.com ¡¡Gracias!!