tests unitarios y junit 4

Upload: uhnju

Post on 02-Jun-2018

239 views

Category:

Documents


0 download

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!