test unit a rios

Upload: yesenia-garcia-hernandez

Post on 30-Oct-2015

40 views

Category:

Documents


0 download

TRANSCRIPT

  • *

    Formacin test unitariosTest unitariosTipos de test :

    Test funcionales o aceptacinTest que garantiza que el software hace lo que desea el usuario.Test de integracinTest que garantizan que el software se integra correctamente con los recursos externos: BBDD, LDAP, API externas, etc.Test de rendimientoTest que garantizan el rendimiento del software en las situaciones requeridas por el usuario. Test unitariosTest que prueba la correcta funcionalidad de las clases y garantizan la mantenibilidad del software.

    *

    Formacin test unitariosTest unitariosTipos de test :

    FrenteFrenteFrenteFrenteTest de aceptacinTest de integracinTest de rendimiento Test unitarios

    *

    Formacin test unitariosTest unitarios

    Tipos de test

    Test unitarios

    Mocks y Stubs

    Tareas / etxeko-lanak

    *

    Formacin test unitariosTest unitariosTest Unitarios:

    Qu es una prueba unitaria?Una prueba unitaria es una pieza de cdigo escrito por un desarrollador que prueba una pequea rea especfica de la funcionalidad del cdigo

    *

    Formacin test unitariosTest unitariosTest Unitarios:

    Excusas para no hacer test unitario- Cuesta mucho tiempo hacer los test - Cuesta mucho tiempo ejecutar los test- No es mi trabajo testear mi cdigo - Ya compila... no vale? - Cuesta mucho tiempo hacer los test - A mi me pagan por escribir cdigo, no por escribir tests

    *

    Formacin test unitariosTest unitariosTest Unitarios:

    Beneficios de hacer test unitarios- Mejora el diseo de la implementacin - Reduce el tiempo invertido debuggeando - Se gana seguridad en los cambios - Te hace la vida ms fcil y tranquila - Ayuda a documentar el cdigo - Se pone el cdigo en situaciones extremas

    *

    Formacin test unitariosTest unitariosTest Unitarios:

    Estructura de un test- Preparar y configurar el estado necesario para realizar el test- Realizar la llamada al mtodo que se quiere testear- Verificar el resultado obtenidoArrangeActAssert

    *

    Formacin test unitariosTest unitariosTest Unitarios:

    Propiedades de un buen test- Automatic: los tests se deben ejecutar automticamente- Thorough: exaustivos, se prueba todo que sea sensible al fallo- Repeatable: ejecutar el test una y otra vez, con el mismo resultado - Independent: Independiente entre los otros test y del entorno- Professional: Debe ser cdigo como si fuera produccin

    *

    Formacin test unitariosTest unitariosTest Unitarios:

    Qu testear?- Right: Si el cdigo se ejecuta correctamente, cmo lo s?Right-BICEP- Boundary: Probar condiciones lmite, muchos bugs viven all- Inverse: Testear la lgica inversa si es posible- Cross-check: Cotejar los resultados utilizando diferentes medios - Error conditions: Forzar las situaciones de error - Performance: Probar las caractersticas de rendimiento si requiere

    *

    Formacin test unitariosTest unitariosEjemplo de clase :

    *

    Formacin test unitariosTest unitariosEjemplo de test:

    *

    Formacin test unitariosTest unitariosEjemplo de test:

    *

    Plan TDDDobles de pruebaUn doble de prueba es un objeto que no es el real y que usamos para poder probar una funcionalidad aislndonos del resto de los objetos del sistemaQu son los doble de prueba?

    *

    Plan TDDTipos de doble de prueba (o roles) Stub Mock Spy Fake dummyDobles de prueba

    *

    Plan TDDDobles de pruebaFrameworks para trabajar con dobles de pruebaJavamockitoeasyMockJmock

    JavaScriptJsTestDriverJsmockitoJsHamcrestSinon.JSQunit

    *

    Plan TDDDobles de pruebaUn stub es un objeto que programamos para que nos devuelva lo que deseemos y poder probar cmo reacciona nuestro cdigo ante los distintos valores de respuesta del colaborador en cuestinStubs

    *

    Plan TDDDobles de pruebaEjemplo 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 TDDpublic class Compra { private final List 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 TDDDobles de pruebaMocksUn mock es un doble que nos sirve para verificar salidas indirectas del objeto que estamos probando

    *

    Plan TDDDobles de pruebaEjemplo 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 TDDboolean confirmar() { int elPrecioDeLaCompra = precio(); boolean tieneElUsuarioFondos = pasarelaDePago.tieneElUsuarioFondosPorValorDe(elPrecioDeLaCompra); if (tieneElUsuarioFondos){ pasarelaDePago.cobrar(elPrecioDeLaCompra); } return tieneElUsuarioFondos;}Dobles de prueba

    *

    Plan TDDDobles de pruebaSpiesAl igual que los mocks, los spies sirven para hacer comprobaciones sobre salidas indirectas. La diferencia es que con un Spy lo que hacemos es despus de ejecutar el mtodo a probar verificar si sobre el doble se ha invocado a tal o cual mtodo

    *

    Plan TDDDobles de pruebaEjemplo 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 TDDDobles de pruebaEntonces Mocks o Spies?

    *

    Plan TDDDobles de pruebaFakesUn fake es una implementacin falsa de un determinado interfaz, ms simple normalmente, con el objetivo de hacer que el test se pueda ejecutar ms rpido o sin dependencias de un sistema externo.

    Por ejemplo un fake de un objeto que acceda a la persistencia podra ser una implementacin en memoria del mismo objeto.

    *

    Plan TDDDobles de pruebaDummyUn dummy es simplemente cuando el objeto a probar tiene algn colaborador que no vamos a utilizar en este test, entonces se le pasa un dummy que puede ser simplemente un nulo

    *

    Plan TDDWebs de referenciaMock Suckshttp://www.testingtv.com/2010/12/20/mocks-suck-and-what-to-do-about-it/

    Java Mock Frameworks Comparisonhttp://www.sizovpoint.com/2009/03/java-mock-frameworks-comparison.html

    Diferencias entre mocks y stubshttp://theproc.es/2009/5/21/658/diferencias-entre-mocks-y-stubs

    Escribiendo mejores testshttp://weblogs.javahispano.org/artesanodeprimera/entry/escribiendo_mejores_test_iii_mocking

    Dobles de prueba

    *

    Formacin test unitariosTest unitariosAgenda :

    Tipos de test

    Test unitarios

    Mocks y Stubs

    Tareas / etxeko-lanak

    *

    Formacin test unitariosTest unitariosTarea:

    Descargar proyecto encryptor (//dominio/proyectos/dnt)

    Realizar test unitarios de los mtodos pblicos

    *

    Formacin test unitariosTest unitariosTarea :

    Crear un tarea/job en el servidor CI Jenkins http://192.168.0.21:9090

    *

    Formacin test unitariosTest unitariosTarea :

    Empezar a crear test unitarios en los proyectos Programar la ejecucin de los test en Jenkins CI

  • Ruben EgiluzSoftware Engineer

    Ivan RodriguezSoftware Engineer Donewtech Solutions, S.L.Zubiberri Bidea 31 Edificio Urumea 20018 Donostia San Sebastin +34 943 223 031www.donewtech.comGracias!!

    ***********************************