tests unitarios y junit 4
Post on 02-Jun-2018
238 Views
Preview:
TRANSCRIPT
-
8/10/2019 Tests Unitarios y JUnit 4
1/32
Tests Unitarios y JUnit 4
Cmo empezar con todo esto?
-
8/10/2019 Tests Unitarios y JUnit 4
2/32
Introduccin
"El testing puede probar la presencia de
errores pero no la ausencia de ellos"Edsger Dijkstra
-
8/10/2019 Tests Unitarios y JUnit 4
3/32
Preguntas Frecuentes
Cmo pruebo un test que no devuelve nada? Cmo debo probar los mtodos get/set? Dnde colocar mis test? Cmo testear los mtodos privados? Cmo de simple es un mtodo para decir que es demasiado
simple para testear? Cada cuanto tiempo ejecutar mis tests?
-
8/10/2019 Tests Unitarios y JUnit 4
4/32
-
8/10/2019 Tests Unitarios y JUnit 4
5/32
Entonces, vemos TDD?
Hoy no, que primero tenemos que aprender un parde cositas y sembrar un peln el terreno
-
8/10/2019 Tests Unitarios y JUnit 4
6/32
Qu vamos a ver?
Tipos de tests y su usoSystem under test (SUT) Cmo disear un test unitario? En qu contexto tengo que
usarlo? Introduccin a JUnit 4Y si nos da tiempo:MockitoHamcrest
-
8/10/2019 Tests Unitarios y JUnit 4
7/32
Tipos de test y su uso
UnitariosDe integracinFuncionalesDe regresin
De cargaLos dems que se te ocurran que no se nos han ocurrido a
nosotros
-
8/10/2019 Tests Unitarios y JUnit 4
8/32
Tests Unitarios
Prueban una funcionalidad concreta.Se basan en el principio de responsabilidad nica.Responsabilidad nica: cada mtodo tiene una nica
funcin, y esa funcin es la que pruebo.
Deben ser independientes de los datos puesto que noprobamos datos, sino funcionalidad.
Deben ser repetibles en el tiempoLa guinda: slo prueban los mtodos pblicos del SUT
(System Under Test).No se debe hacer uso de dependencias de la clase a probar.
-
8/10/2019 Tests Unitarios y JUnit 4
9/32
Otros tests
Integracin: prueban la conexin entre componentes.Debera ser el siguiente paso al test unitario.
Funcionales: prueban la integracin de todos loscomponentes que desarrollan una funcionalidad.
Regresin: prueban que los SUT siguen funcionando a lolargo del tiempo (IC)
Carga: prueban la eficiencia del cdigo
-
8/10/2019 Tests Unitarios y JUnit 4
10/32
System Under Test (SUT)
Es el sistema que vamos a probar.Probamos los mtodos pblicos: Interface de nuestro SUT al mundo exterior
Los mtodos privados no?Relocalizar en otra parte del SUT o del sistemaPrivilegedAccessor
-
8/10/2019 Tests Unitarios y JUnit 4
11/32
Cmo disear un test unitario?
Un test unitario debe ser independiente de los dems y delentorno.
Debe ser rpidoSu xito no debe depender del orden de ejecucin de los
dems tests.Deben ser repetibles.Se deben poder ejecutar de forma automtica.
-
8/10/2019 Tests Unitarios y JUnit 4
12/32
Algunas Buenas Prcticas
Escribir un test cuando solamente sea necesario. NOcobertura 100%
Los tests deben colocarse en un lugar representativoDeben ser fcilmente mantenibles y entendibles
Debe probar el qu y no el cmoMtodos pblicos --> QuMtodos privados o protegidos --> Cmo
Test nica funcionalidad: No If, while, for, ... dentro de un
test unitario (Principio de responsabilidad nica)Sencillos de ejecutarNo ms de un ASSERT por test
-
8/10/2019 Tests Unitarios y JUnit 4
13/32
JUnit 4
JUnit es un framework para implementar tests en Java.Se integra con Maven.Emplea anotaciones: @Test, @Before, @BeforeClass,
@After, @AfterClass, @Ignore ...
Empleamos asserts para establecer la condicin deaceptacin: assertTrue, assertFalse, assertEquals,assertNull...
-
8/10/2019 Tests Unitarios y JUnit 4
14/32
JUnit 4 - Anotaciones
@Test: sirve para indicar que el mtodo que la contiene esun test:expected y timeout
@Before: ejecuta el mtodo que la contiene justo antes de
cada test.@After: ejecuta el mtodo que la contiene justo despus
de cada test.@BeforeClass: ejecuta el mtodo que la contiene justo
antes del primer test.@AfterClass: ejecuta el mtodo que la contiene justo
despus del ltimo test.@Ignore: evita la ejecucin del tests
-
8/10/2019 Tests Unitarios y JUnit 4
15/32
JUnit 4 - Condiciones de aceptacin
assertTrue(condicin a testear):Comprueba que la condicin es cierta.
assertFalse(condicin a testear):Comprueba que la condicin es falsa.
assertEquals(valor esperado, valor obtenido) y
assertNotEquals(valor esperado, valor obtenido):Comprueba que el valor que esperamos y el obtenido con
el mtodo a prueba es el mismo o no. assertNull(objeto) y assertNotNull(objeto):Comprueba que el objeto obtenido es nulo o no.
assertSame(obj1, obj2) y assertNotSame(obj1,obj2):Comprueba si dos objetos son iguales o no
fail():Hace que el test termine con fallo
-
8/10/2019 Tests Unitarios y JUnit 4
16/32
JUnit 4 - Elementos avanzados
SuitesRunnersTests ParametrizadosRules
-
8/10/2019 Tests Unitarios y JUnit 4
17/32
JUnit 4 - Suites
Coleccin de un conjunto de tests que pueden ejecutarsede forma independiente
Puede contener ms SuitesEl orden de ejecucin no esta grantizado (test
independientes) Anotaciones a usar:@RunWith(Suite.class)@SuiteClasses({})
-
8/10/2019 Tests Unitarios y JUnit 4
18/32
JUnit 4 -Runners
Define como ejecutar los testAnotacin: @RunWith@RunWith(Suite.class)@RunWith(Parameterized.class)
@RunWith(Enclosed.class)@RunWith(SpringJunit4ClassRunner): @ContextConfiguration(locations={"blabla.xml"}):
carga el/los contexto/s de Spring@Autowire: Inyecta dependencia en atributos
dependiendo del tipo ....
Extends BlockJUnit4ClassRunner a partir de Junit 4.5
-
8/10/2019 Tests Unitarios y JUnit 4
19/32
JUnit 4 - Test Parametrizados
Tests genericos para ejecutarlos con juegos de datosdiferentes@RunWith(Parameterized.class)Pasos:Aadir atributos a la clase que representen los
parametrosConstructor para asignar los valoresMetodo esttico:@Parameters
Return CollectionTests que utilicen los atributos parametrizados
Orden de ejecucion: @Parameters, @BeforeClass, @Before,@Test (juego datos 1), @After, @Before, @Test (juego de
datos 2), @After, ......
-
8/10/2019 Tests Unitarios y JUnit 4
20/32
JUnit 4 -Rules Pueden ejecutar cdigo antes, despus o dentro de los mtodos
Anotacin: @Rule Las ms conocidas:ErrorCollector: Hace que un test continue aunque falleExpectedException: Permite especificar excepciones y
mensajes dentro de los test
ExternalResource: Configura recursos externos y los liberadespues de los testsRuleChain: Permite ordenar los testsRunRules: Lanza un conjunto de reglasTemporaryFolder: Crea ficheros y carpetas temporales que se
eliminan al final del test (pase o falle)TestName: Nombre del tests esta disponible dentro del testTestWatcher: Toma nota de la accin del test, sin modificarlaTimeout: Aplica el mismo timeout a todos los mtodosVerifier: Convierte mtodos que pasan en mtodos que fallan,
si se verifica una condicin y esta falla
-
8/10/2019 Tests Unitarios y JUnit 4
21/32
Qu es un mock? Cundo usarlos?
Un mock es un objeto que simula el comportamiento de unobjeto real.
Los utilizaremos en los tests unitarios para simular elcomportamiento de otros objetos que interacten con
nuestro SUT.Con un mock simularemos llamadas a mtodos.
-
8/10/2019 Tests Unitarios y JUnit 4
22/32
Mockito - Introduccin
Libreria Java, basada en EasyMockSimula el comportamiento de una clase de forma dinmicaPermite aislar SUT a testearPermite mockear clases concretas e interfacesCiclo de uso StubbingEjecutarVerificar datos y/o llamadas
Los mocks tienen memoria --> Acceso a cualquier iteracin
Anotacin: @MockMockitoAnnotations.initMocks(testClass)
-
8/10/2019 Tests Unitarios y JUnit 4
23/32
Mockito - Stubbing I
Simula el comportamiento de los mocks en las llamadas aciertos mtodosDevuelve valor por defecto si no tiene stubEjemplo:
//Mock
LinkedList mockedList = mock(LinkedList.class); //Stubbing when(mockedList.get(0)).thenReturn("first"); when(mockedList.get(1)).thenReturn(new RuntimeException()); //Ejecucin System.out.println(mockedList.get(0)); // Pinta "first" System.out.println(mockedList.get(1)); // Lanza RuntimeEx System.out.println(mockedList.get(999)); // Devuelve null //Verificacin verify(mockedList).get(0);
-
8/10/2019 Tests Unitarios y JUnit 4
24/32
Mockito - Stubbing IIFormas de hacer stub: thenReturn(): Devuelve un tipo primitivo u objeto
thenThrow(): Lanza una excepcin thenAnswer(): Respuesta genrica. Crea una respuesta a partir de
la implementacin de un objeto Answer.
Formas de hacer stub con mtodos void:
doThrow(Throwable): Lanza una excepcin en la fase deejecucin
doNothing(): Por defecto. No hace nada el mtodo
Otras formas: doAnswer(Answer): Genera una respuesta genrica doReturn(Object): Se usa en casos excepcionales en los que no se
puede usar thenReturn(Object)
Todas estar formas se pueden anidar y respetan el orden dedefinicin en la ejecucin del objeto mockeado.
-
8/10/2019 Tests Unitarios y JUnit 4
25/32
Mockito - Stubbing III
Arguments Matchers
Permiten realizar llamadas a mtodos sin declararexplcitamente los parmetros.
Ejemplo:when(mockedList.get(anyInt())).thenReturn("theValue")
Especificamos que cuando llamemos al mtodogetdelobjeto mockedListpasando como parmetro un integer, elmock nos devuelva el valor "theValue".
Tambin podemos verificar usando argument matchers.Ejemplo: verify(mockedList).get(anyInt());
-
8/10/2019 Tests Unitarios y JUnit 4
26/32
Mockito - Verificacin I
Consiste en comprobar que se ha invocado algn mtododel mock.
verify(mockedObject).methodRequested(params)Verificaciones avanzadas: times(): Nmero exacto de invocacionesatLeast(): Al menos un nmero de invocacionesatMost(): Como mximo un nmero de invocacionesnever(): No se ha realizado ninguna invocacin InOrder: Verifica el orden de las llamadas
verifyZeroInteractions(): Verifica que algunos mocks nointeractan
verifyNoMoreInteractions():Verifica las llamadasredundantes
NO es necesario verificar todas las interacciones, SOLO lasque son necesarias
-
8/10/2019 Tests Unitarios y JUnit 4
27/32
Mockito - Verificacin IIEjemplo: //creando mocks
List mockUno = mock(List.class);List mockDos = mock(List.class);
List mockTres = mock(List.class);
List mockCuatro = mock(List.class);
//usando mocks
mockUno.add("uno");
mockCuatro.add("dos");
mockCuatro.add("tres");verify(mockUno).add("uno"); //verificacion
verify(mockUno, times(1)).add("uno"); //verificacion nmero de llamadas
verify(mockCuatro, atLeast(1)).add("dos"); //al menos se ha llamado una vez
verify(mockCuatro, atMost(2)).add("dos");//como mucho se ha llamado 2 veces
verify(mockCuatro, never()).add("cuatro"); // Nunca se ha llamado
verify(mockUno, never()).add("dos"); //el metodo no ha sido llamado
//Verificamos el ordenInOrder order = inOrder(mockUno,mockCuatro);
order.verify(mockUno).add("uno");
order.verify(mockCuatro).add("dos");
verifyZeroInteractions(mockDos, mockTres); //verificamos los mocks no tienen
interactuaciones
-
8/10/2019 Tests Unitarios y JUnit 4
28/32
Hamcrest - Introduccin Proporciona numerosos matchers Hace ms legibles los tests
Algunos matchers: is: se usa por temas de legibilidadnot: sirve para la negacin lgicanullValue: sirve para comprobar si el valor es null
empty: sirve para comprobar si un objeto esta vacohasItem: comprueba si existe un objeto en una coleccinhasItems: igual que hasItem pero con varios objetosanyOf: equivalente al operador "||" en Java
allOf: equivalente al operador "&&" en Java Propios matchers:extends TypeSafeMatcher implements methods:
public boolean matchesSafely(T item)
public void describeTo(Description description)
-
8/10/2019 Tests Unitarios y JUnit 4
29/32
Hamcrest - Ejemplo Matchersprivate EquipoFutbol equipo = new EquipoFutbol();
@Test
public void primerTest() {
assertNotNull(equipo); //Junit assertThat(equipo, is(not(nullValue()))); // Hamcrest
assertThat((Collection)equipo.getJugadores(), is(not(empty())));
}
@Testpublic void comprobarSiTenemosPortero() {
final Jugador portero = new Jugador(1,Posicion.PORTERO);
final Jugador defensa = new Jugador(3, Posicion.DEFENSA);
final Jugador delantero = new Jugador(10, Posicion.DELANTERO);assertTrue(equipo.getJugadores().contains(portero)); //Junit
assertThat(equipo.getJugadores(), hasItem(portero)); // Hamcrest
assertThat(equipo.getJugadores(), hasItems(portero, defensa, delantero)); //Hamcrest
}
@Testpublic void comprobarSiHayCentroCampistaODelantero() {
final Jugador centroCampista = new Jugador(6, Posicion.CENTROCAMPISTA);
final Jugador delantero = new Jugador(10, Posicion.DELANTERO);final Jugador entrenador = new Jugador(12, Posicion.ENTRENADOR);
// solo junit
assertTrue(equipo.getJugadores().contains(centroCampista) || equipo.getJugadores().contains(delantero)
|| equipo.getJugadores().contains(entrenador));
// con Hamcrest
assertThat(equipo.getJugadores(), anyOf(hasItem(centroCampista), hasItem(delantero), hasItem(entrenador)));
}
H Ej l M h P i
-
8/10/2019 Tests Unitarios y JUnit 4
30/32
Hamcrest - Ejemplo Matcher Propioimport org.hamcrest.Description;
import org.hamcrest.Factory;import org.hamcrest.Matcher;
import org.hamcrest.TypeSafeMatcher;
public class IsTacticaCuatroCuatroDosMatcher extends TypeSafeMatcher {
private int numDefensas = 0;private int numCentrocampistas = 0;
private int numDelanteros = 0;
public void describeTo(Description description) {
description.appendText("Expected 4-4-2\n");}
@Override
public boolean matchesSafely(AutentiaFC item) {
for(Jugador jugador : item.getJugadores()) {
switch(jugador.getPosicion()) { case DEFENSA:
numDefensas++;
case CENTROCAMPISTA:
numCentrocampistas++;
case DELANTERO:numDelanteros++;
}}
return ((numDefensas == 4) && (numCentrocampistas == 4) && (numDelanteros == 2));}
@Factory
public static Matcher tacticaCuatroCuatroDos() {
return new IsTacticaCuatroCuatroDosMatcher();
}}
-
8/10/2019 Tests Unitarios y JUnit 4
31/32
Recursos
Documentacin ampliada:https://docs.google.
com/document/d/1XvophH76a11OaseSmKXcAKpBCA1ZokQWXPSM0EWCWl0/edit
Esta presentacin:https://docs.google.com/present/edit?
id=0AV8RRyEiyyagZGMzOTVubnNfOTFmdzh6cHBkcARepositorio GIT con el cdigo de ejemplo:
https://github.com/juanmagomez/Formacion-JUnit
https://github.com/juanmagomez/Formacion-JUnithttps://docs.google.com/document/d/1XvophH76a11OaseSmKXcAKpBCA1ZokQWXPSM0EWCWl0/edithttps://docs.google.com/document/d/1XvophH76a11OaseSmKXcAKpBCA1ZokQWXPSM0EWCWl0/edithttps://github.com/juanmagomez/Formacion-JUnithttps://docs.google.com/document/d/1XvophH76a11OaseSmKXcAKpBCA1ZokQWXPSM0EWCWl0/edithttps://docs.google.com/document/d/1XvophH76a11OaseSmKXcAKpBCA1ZokQWXPSM0EWCWl0/edithttps://docs.google.com/document/d/1XvophH76a11OaseSmKXcAKpBCA1ZokQWXPSM0EWCWl0/edit -
8/10/2019 Tests Unitarios y JUnit 4
32/32
MUCHAS GRACIAS!
top related