Test unitarios
-
Upload
donewtech-solutions -
Category
Technology
-
view
1.756 -
download
1
description
Transcript of Test unitarios
Test Unitarios
Diseño al cubo : Plan TDD
Donostia, 06/05/2011
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
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
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.
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
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
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
8
Formación test unitariosTest unitarios
Test Unitarios: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
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
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
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
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
14
Formación test unitariosTest unitarios
Ejemplo de clase :Ejemplo de clase :
15
Formación test unitariosTest unitarios
Ejemplo de test:Ejemplo de test:
16
Formación test unitariosTest unitarios
Ejemplo de test:Ejemplo de test:
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
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?
19
Plan TDD
Tipos de doble de prueba (o roles)
Stub Mock Spy Fake dummy
Dobles de prueba
20
Plan TDDDobles de prueba
Frameworks para trabajar con dobles de prueba
Java mockito easyMock Jmock …
JavaScript JsTestDriver
Jsmockito JsHamcrest
Sinon.JS Qunit
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
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()); } }
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
24
Plan TDDDobles de prueba
Mocks
Un mock es un doble que nos sirve para verificar salidas indirectas del objeto que estamos probando
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); }}
26
Plan TDD
boolean confirmar() {
int elPrecioDeLaCompra = precio();
boolean tieneElUsuarioFondos = pasarelaDePago.tieneElUsuarioFondosPorValorDe(elPrecioDeLaCompra);
if (tieneElUsuarioFondos){
pasarelaDePago.cobrar(elPrecioDeLaCompra);
}
return tieneElUsuarioFondos;
}
Dobles de prueba
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
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); }}
29
Plan TDDDobles de prueba
Entonces ¿Mocks o Spies?
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.
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
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
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
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
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
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
37
Formación test unitariosTest unitarios
¡Nos vemos en 15 días!¡Nos vemos en 15 días!
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!!