Pruebas de Software: Junit Departamento de Sistemas y Computación Facultad de Ingeniería Universidad de los Andes 1 Qué es Junit? Es un framework de pruebas para Java, utilizado para escribir y ejecutar pruebas repetibles. Es una instancia de la arquitectura xUnit para frameworks de pruebas unitarias. Es de código abierto, creado porErich Gamma –GoF, Kent Beck Inicialmente utilizado para eXtreme Programming 2 Características Aserciones para probar resultar esperados Formas para compartir información de pruebas Suites de pruebas para organizar y ejecutar pruebas fácilmente Programa que ejecuta las pruebas de manera gráfica y textual 3 Objetivos Ejecutar pruebas de manera automática Evitar el problema de tener que ejecutar pruebas una por una, de manera manual con posibilidad de errores. Sencillo Proveer solamente la funcionalidad que requiere una persona para hacer pruebas Se debe aprender poco para poder escribir una prueba 4 Objetivos (cont.) Crear pruebas que retienen su valor agregado a través del tiempo Capacidad de repetir una prueba bajo las mismas condiciones Si hago cambios sobre el software, lo demás debe mantenerse funcionando Provee una forma de hacer pruebas de regresión Se pueden agrupar conjuntos de pruebas de distintas personas sin problemas, debido al carácter uniforme que provee 5 Objetivos (cont.) Crear pruebas para cada parte del software La idea es crear las pruebas al comienzo del desarrollo y no después Es como crear las pruebas a partir de las clases que no contienen implementación y a medida que se desarrolla software ir probando Un cambio significa ejecutar las pruebas anteriores y las nuevas 6 Conceptos Básicos Cada clase de prueba contiene métodos para probar los métodos de una clase particular: Cada método de prueba debe tener la anotación@Test 7 Conceptos Básicos BookLogicTest BookLogic bookLogic BookDTO getBook(Long id) @Test void getBookTest() BookDTO createBook( BookDTO dto) @Test void createBookTest() @Test Public void createBookTest() { … BookDTO result = bookLogic.createBook(dto); … } 8 Conceptos Básicos BookLogicTest BookLogic bookLogic BookDTO getBook(Long id) @Test void getBookTest() BookDTO createBook( BookDTO dto) @Test void createBookTest() @Inject private IBookLogic bookLogic; @Test Public void createBookTest() { … BookDTO result = bookLogic.createBook(dto); … } 9 Conceptos Básicos BookLogicTest BookLogic bookLogic BookDTO getBook(Long id) @Test void getBookTest() BookDTO createBook( BookDTO dto) @Test void createBookTest() Se crea un objeto con datos aleatorios utilizando Podam @Inject private IBookLogic bookLogic; @Test Public void createBookTest() { PodamFactory factory = new PodamFactoryImpl(); BookDTO dto = factory.manufacturePojo(BookDTO.class); BookDTO result = bookLogic.createBook(dto); … } 10 Conceptos Básicos BookLogicTest BookLogic bookLogic BookDTO getBook(Long id) @Test void getBookTest() BookDTO createBook( BookDTO dto) @Test void createBookTest() Se crea un objeto con datos aleatorios utilizando Podam Se consulta la BD utilizando un manejador de persistencia @Inject private IBookLogic bookLogic; @Test Public void createBookTest() { PodamFactory factory = new PodamFactoryImpl(); BookDTO dto = factory.manufacturePojo(BookDTO.class); BookDTO result = bookLogic.createBook(dto); Assert.assertNotNull(result); BookEntity entity = em.find(BookEntity.class, result.getId()); Se compara lo que se creó con lo que se obtuvo Assert.assertEquals(dto.getName(), entity.getName()); Assert.assertEquals(dto.getIsbn(), entity.getIsbn()); Assert.assertEquals(dto.getImage(), entity.getImage()); 11 Assert.assertEquals(dto.getDescription(), entity.getDescription()); } Conceptos Básicos @Inject private BookPersistence bookPersistence; BookPersistenceTest BookPersistence bookPersistence BookEntity getBook(BookEntity e) BookEntity createBook(BookEntity e) Se crea un objeto con datos aleatorios utilizando Podam @Test void getBookTest() @Test void createBookTest() @Test public void createBookTest() { PodamFactory factory = new PodamFactoryImpl(); BookEntity newEntity = BookConverter.basicDTO2Entity( factory.manufacturePojo(BookDTO.class)); Se consulta la BD utilizando un manejador de persistencia BookEntity result = bookPersistence.create(newEntity); Assert.assertNotNull(result); BookEntity entity = em.find(BookEntity.class, result.getId()); Se compara lo que se creó con lo que se obtuvo } Assert.assertEquals(newEntity.getName(), entity.getName()); Assert.assertEquals(newEntity.getIsbn(), entity.getIsbn()); Assert.assertEquals(newEntity.getImage(), entity.getImage()); Assert.assertEquals(newEntity.getDescription(), entity.getDescription()); 12 Fixtures (Ambientes de prueba) @BeforeClass @Before test1 @After … @Before testk @After … @Before testn @After @AfterClass 13 Fixtures (Ambientes de prueba) @Inject UserTransaction utx; @BeforeClass @Before test1 @After … @Before testk @After … @Before testn @After @AfterClass @Before public void configTest() { try { utx.begin(); clearData(); insertData(); utx.commit(); } catch (Exception e) { e.printStackTrace(); try { utx.rollback(); } catch (Exception e1) { e1.printStackTrace(); } } } private void clearData() { em.createQuery("delete from BookEntity").executeUpdate(); } private void insertData() { for (int i = 0; i < 3; i++) { PodamFactory factory = new PodamFactoryImpl(); BookEntity entity = BookConverter.basicDTO2Entity(factory.manufacturePojo( BookDTO.class)); em.persist(entity); data.add(entity); } } 14