Test unitarios

38
Test Unitarios Diseño al cubo : Plan TDD Donostia, 06/05/2011

description

Introduction to software unit testing and the differents type of mocks

Transcript of Test unitarios

Page 1: Test unitarios

Test Unitarios

Diseño al cubo : Plan TDD

Donostia, 06/05/2011

Page 2: Test unitarios

2

Plan TDDTest unitarios

Plan TDD Donewtech:Plan TDD Donewtech:

– Formación test unitariosFormación test unitarios

– Formación TDDFormación TDD

– Dojonewtech

– Coaching Carlos Blé a primeros de octubreCoaching Carlos Blé a primeros de octubre

Page 3: Test unitarios

3

Formación test unitariosTest unitarios

Agenda :Agenda :

– Tipos de test Tipos de test

– Test unitariosTest unitarios

– Mocks y StubsMocks y Stubs

– Tareas / etxeko-lanakTareas / etxeko-lanak

Page 4: Test unitarios

4

Formación test unitariosTest unitarios

Tipos de test :Tipos de test :

– Test funcionales o aceptaciónTest funcionales o aceptación

Test que garantiza que el software hace lo que desea el usuario.– Test de integraciónTest de integración

Test que garantizan que el software se integra correctamente con los recursos externos: BBDD, LDAP, API externas, etc.

– Test de rendimientoTest de rendimiento

Test que garantizan el rendimiento del software en las situaciones requeridas por el usuario.

– Test unitariosTest unitarios

Test que prueba la correcta funcionalidad de las clases y garantizan la mantenibilidad del software.

Page 5: Test unitarios

5

Formación test unitariosTest unitarios

Tipos de test :Tipos de test :

Software

FrenteFrente

Frente

Frente

Test de aceptaciónTest de aceptación Test de integraciónTest de integración

Test de rendimiento Test de rendimiento

Test unitariosTest unitarios

Page 6: Test unitarios

6

Formación test unitariosTest unitarios

Agenda :Agenda :

– Tipos de test Tipos de test

– Test unitariosTest unitarios

– Mocks y StubsMocks y Stubs

– Tareas / etxeko-lanakTareas / etxeko-lanak

Page 7: Test unitarios

7

Formación test unitariosTest unitarios

Test Unitarios:Test Unitarios:

Qué es una prueba unitaria?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

Page 8: Test unitarios

8

Formación test unitariosTest unitarios

Test Unitarios:Test Unitarios:

Page 9: Test unitarios

9

Formación test unitariosTest unitarios

Test Unitarios:Test Unitarios:

Escusas para no hacer test unitarioEscusas 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

Page 10: Test unitarios

10

Formación test unitariosTest unitarios

Test Unitarios:Test Unitarios:

Beneficios de hacer test unitariosBeneficios 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 Te hace la vida más fácil y tranquila

- Ayuda a documentar el código

- Se pone el código en situaciones extremas

Page 11: Test unitarios

11

Formación test unitariosTest unitarios

Test Unitarios:Test Unitarios:

Estructura de un testEstructura 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

Arrange Act Assert

Page 12: Test unitarios

12

Formación test unitariosTest unitarios

Test Unitarios:Test Unitarios:

Propiedades de un buen testPropiedades de un buen test

- Automatic: los tests se deben ejecutar automáticamente

- 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 código como si fuera producción

Page 13: Test unitarios

13

Formación test unitariosTest unitarios

Test Unitarios:Test Unitarios:

Qué testear?Qué testear?- Right: Si el código se ejecuta correctamente, ¿cómo lo sé?

Right-BICEPRight-BICEP

- Boundary: Probar condiciones límite, muchos “bugs” viven allí

- Inverse: Testear la lógica inversa si es posible

- Cross-check: Cotejar los resultados utilizando diferentes medios

- Error conditions: Forzar las situaciones de error

- Performance: Probar las características de rendimiento si requiere

Page 14: Test unitarios

14

Formación test unitariosTest unitarios

Ejemplo de clase :Ejemplo de clase :

Page 15: Test unitarios

15

Formación test unitariosTest unitarios

Ejemplo de test:Ejemplo de test:

Page 16: Test unitarios

16

Formación test unitariosTest unitarios

Ejemplo de test:Ejemplo de test:

Page 17: Test unitarios

17

Formación test unitariosTest unitarios

Agenda :Agenda :

– Tipos de test Tipos de test

– Test unitariosTest unitarios

– Mocks y StubsMocks y Stubs

– Tareas / etxeko-lanakTareas / etxeko-lanak

Page 18: Test unitarios

18

Plan TDDDobles 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?

Page 19: Test unitarios

19

Plan TDD

Tipos de doble de prueba (o roles)

Stub Mock Spy Fake dummy

Dobles de prueba

Page 20: Test unitarios

20

Plan TDDDobles de prueba

Frameworks para trabajar con dobles de prueba

Java mockito easyMock Jmock …

JavaScript JsTestDriver

Jsmockito JsHamcrest

Sinon.JS Qunit

Page 21: Test unitarios

21

Plan TDDDobles 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

Page 22: Test unitarios

22

Plan TDDDobles 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()); } }

Page 23: Test unitarios

23

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

Page 24: Test unitarios

24

Plan TDDDobles de prueba

Mocks

Un mock es un doble que nos sirve para verificar salidas indirectas del objeto que estamos probando

Page 25: Test unitarios

25

Plan TDDDobles 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); }}

Page 26: Test unitarios

26

Plan TDD

boolean confirmar() {

int elPrecioDeLaCompra = precio();

boolean tieneElUsuarioFondos = pasarelaDePago.tieneElUsuarioFondosPorValorDe(elPrecioDeLaCompra);

if (tieneElUsuarioFondos){

pasarelaDePago.cobrar(elPrecioDeLaCompra);

}

return tieneElUsuarioFondos;

}

Dobles de prueba

Page 27: Test unitarios

27

Plan TDDDobles 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

Page 28: Test unitarios

28

Plan TDDDobles 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); }}

Page 29: Test unitarios

29

Plan TDDDobles de prueba

Entonces ¿Mocks o Spies?

Page 30: Test unitarios

30

Plan TDDDobles 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.

Page 31: Test unitarios

31

Plan TDDDobles 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

Page 32: Test unitarios

32

Plan TDD

Webs de referencia

Mock 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

Page 33: Test unitarios

33

Formación test unitariosTest unitarios

Agenda :Agenda :

– Tipos de test Tipos de test

– Test unitariosTest unitarios

– Mocks y StubsMocks y Stubs

– Tareas / etxeko-lanakTareas / etxeko-lanak

Page 34: Test unitarios

34

Formación test unitariosTest unitarios

Tarea:Tarea:

– Descargar proyecto “Descargar proyecto “encryptorencryptor” (//dominio/proyectos/dnt)” (//dominio/proyectos/dnt)

– Realizar test unitarios de los métodos públicosRealizar test unitarios de los métodos públicos

Page 35: Test unitarios

35

Formación test unitariosTest unitarios

Tarea :Tarea :

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

Page 36: Test unitarios

36

Formación test unitariosTest unitarios

Tarea :Tarea :

– Empezar a crear test unitarios en los proyectos Empezar a crear test unitarios en los proyectos – Programar la ejecución de los test en Jenkins CIProgramar la ejecución de los test en Jenkins CI

Page 37: Test unitarios

37

Formación test unitariosTest unitarios

¡Nos vemos en 15 días!¡Nos vemos en 15 días!

Page 38: Test unitarios

Ruben EgiluzSoftware Engineer

Ivan RodriguezSoftware Engineer

Donewtech Solutions, S.L.Zubiberri Bidea 31Edificio Urumea20018 Donostia – San Sebastián

+34 943 223 031www.donewtech.com

¡¡Gracias!!