You are on page 1of 33

Test unitarios

Formacin test unitarios

Tipos de test :
Test funcionales o aceptacin Test que garantiza que el software hace lo que desea el usuario. Test de integracin 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.
2

Test unitarios

Formacin test unitarios

Tipos de test :
Frente

Test de rendimiento

Frente

Frente

Software

Test de aceptacin

Frente

Test de integracin

Test unitarios

Test unitarios

Formacin test unitarios

Tipos de test Test unitarios Mocks y Stubs Tareas / etxeko-lanak

Test unitarios

Formacin test unitarios

Test 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

Test unitarios

Formacin test unitarios

Test 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? - A mi me pagan por escribir cdigo, no por escribir tests

Test unitarios

Formacin test unitarios

Test Unitarios:

Beneficios de hacer test unitarios


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

Test unitarios

Formacin test unitarios

Test 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 obtenido

Arrange

Act

Assert
8

Test unitarios

Formacin test unitarios

Test 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

Test unitarios

Formacin test unitarios

Test Unitarios:

Qu testear?

Right-BICEP

- Right: Si el cdigo se ejecuta correctamente, cmo lo s? - 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

10

Test unitarios

Formacin test unitarios

Ejemplo de clase :

11

Test unitarios

Formacin test unitarios

Ejemplo de test:

12

Test unitarios

Formacin test unitarios

Ejemplo de test:

13

Dobles de prueba

Plan TDD

Qu son los doble de prueba?


Un 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 sistema

14

Dobles de prueba

Plan TDD

Tipos de doble de prueba (o roles)


Stub Mock Spy Fake dummy

15

Dobles de prueba

Plan TDD

Frameworks para trabajar con dobles de prueba


Java

mockito easyMock Jmock

JavaScript JsTestDriver Jsmockito JsHamcrest Sinon.JS Qunit

16

Dobles de prueba

Plan TDD

Stubs
Un 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 cuestin

17

Dobles de prueba

Plan TDD

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

18

Dobles de prueba

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) {

19

Dobles de prueba

Plan TDD

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

20

Dobles de prueba

Plan TDD

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); } }
21

Dobles de prueba

Plan TDD

boolean confirmar() {

int elPrecioDeLaCompra = precio();


boolean tieneElUsuarioFondos = pasarelaDePago.tieneElUsuarioFondosPorValorDe(elPrecioDeLaCompra); if (tieneElUsuarioFondos){ pasarelaDePago.cobrar(elPrecioDeLaCompra); } return tieneElUsuarioFondos; }

22

Dobles de prueba

Plan TDD

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 despus de ejecutar el mtodo a probar verificar si sobre el doble se ha invocado a tal o cual mtodo

23

Dobles de prueba

Plan TDD

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

24

Dobles de prueba

Plan TDD

Entonces Mocks o Spies?

25

Dobles de prueba

Plan TDD

Fakes
Un 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.

26

Dobles de prueba

Plan TDD

Dummy
Un 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

27

Dobles de prueba

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_mejore s_test_iii_mocking

28

Test unitarios

Formacin test unitarios

Agenda :
Tipos de test Test unitarios Mocks y Stubs Tareas / etxeko-lanak

29

Test unitarios

Formacin test unitarios

Tarea:
Descargar proyecto encryptor (//dominio/proyectos/dnt) Realizar test unitarios de los mtodos pblicos

30

Test unitarios

Formacin test unitarios

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

31

Test unitarios

Formacin test unitarios

Tarea :

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

32

Gracias!!
Ruben Egiluz
Software Engineer

Ivan Rodriguez
Software Engineer

Donewtech Solutions, S.L. Zubiberri Bidea 31 Edificio Urumea 20018 Donostia San Sebastin +34 943 223 031

www.donewtech.com

You might also like