Lenguaje Java Avanzado Sesión 4: Pruebas con JUnit 2012-2013 Depto. Ciencia de la Computación e IA
Índice Introducción a JUnit Implementación de las pruebas Ejecución de pruebas Pruebas con excepciones Fixtures Suites de pruebas Objetos mock Test-Driven Development Lenguaje Java Avanzado 2012-2013 Depto. Ciencia de la Computación e IA Pruebas con Junit - 2
Introducción a JUnit JUnit es una librería que permite automatizar las pruebas de los diferentes módulos de una aplicación Java Caso de prueba: clase o módulo con métodos para probar los métodos de una clase o módulo concreto Suite de prueba: organización de casos de prueba, en forma de una jerarquía determinada Lenguaje Java Avanzado 2012-2013 Depto. Ciencia de la Computación e IA Pruebas con Junit - 3
Implementar los casos de prueba Una clase de prueba por cada clase a probar Mismo nombre, pero con sufijo Test Mismo paquete, directorios separados /src org.especialistajee.tienda.bo.empleadobr /test org.especialistajee.tienda.bo.empleadobrtest Lenguaje Java Avanzado 2012-2013 Depto. Ciencia de la Computación e IA Pruebas con Junit - 4
Método de prueba Anotar con @Test los métodos de prueba Nombre con prefijo test- Comprobar resultado con assertcalculasalarioneto testcalculasalarioneto Ejecutar método a probar Lenguaje Java Avanzado 2012-2013 Depto. Ciencia de la Computación e IA Pruebas con Junit - 5
Un caso sencillo Probamos EmpleadoBR.testCalculaSalario Se recomienda un método por caso de prueba public class EmpleadoBRTest { } @Test public void testcalculasalarioneto1() { float resultadoreal = EmpleadoBR.calculaSalarioNeto(2000.0f); float resultadoesperado = 1640.0f; assertequals(resultadoesperado, resultadoreal, 0.01); } Lenguaje Java Avanzado 2012-2013 Depto. Ciencia de la Computación e IA Pruebas con Junit - 6
Ejecución de pruebas Desde línea de comando java -cp./junit.jar junit.swingui.testrunner Desde código Java String[] nombrestest = {EmpleadoBRTest.class.getName()}; junit.swingui.testrunner.main(nombrestest); Desde Eclipse Run As > JUnit test Lenguaje Java Avanzado 2012-2013 Depto. Ciencia de la Computación e IA Pruebas con Junit - 7
Resultados de las pruebas Lenguaje Java Avanzado 2012-2013 Depto. Ciencia de la Computación e IA Pruebas con Junit - 8
Prueba con excepciones Usar la anotación @Test @Test(expected=BRException.class) public void testcalculasalarioneto9() { EmpleadoBR.calculaSalarioNeto(-1.0f); } Usar la instrucción fail() @Test public void testcalculasalarioneto9() { try { EmpleadoBR.calculaSalarioNeto(-1.0f); fail("se esperaba excepcion BRException"); } catch(brexception e) {} } Lenguaje Java Avanzado 2012-2013 Depto. Ciencia de la Computación e IA Pruebas con Junit - 9
Fixtures Elementos fijos Se reutilizan en diferentes pruebas @Before Antes de cada test @After Después de cada test @BeforeClass Antes de todos los tests @AfterClass Después de todos los tests Lenguaje Java Avanzado 2012-2013 Depto. Ciencia de la Computación e IA Pruebas con Junit - 10
Suite de pruebas Agrupa pruebas import junit.framework.test; import junit.framework.testcase import junit.framework.testsuite public class MyTestSuiteRunner extends TestCase { } public static Test suite() { TestSuite suite = new TestSuite(); suite.addtestsuite(clazztotesta.class); suite.addtestsuite(clazztotestb.class); return suite } Lenguaje Java Avanzado 2012-2013 Depto. Ciencia de la Computación e IA Pruebas con Junit - 11
Ventajas Framework estándar para pruebas Batería de pruebas reutilizables Permite realizar pruebas de regresión Interfaz para presentación de resultados Lenguaje Java Avanzado 2012-2013 Depto. Ciencia de la Computación e IA Pruebas con Junit - 12
Objetos mock Debemos poder predecir el resultado de los métodos a probar Algunos componentes dificultan las pruebas DAOs Proxys etc... Toman como entrada datos que no controlamos Solución: Sustituir estos componentes por impostores mocks Lenguaje Java Avanzado 2012-2013 Depto. Ciencia de la Computación e IA Pruebas con Junit - 13
Implementación de los mock IEmpleadoDAO JDBCEmpleadoDAO MockEmpleadoDAO @Override IEmpleadoDAO getempleadodao() { return new MockEmpleadoDAO(); } Lenguaje Java Avanzado 2012-2013 Depto. Ciencia de la Computación e IA Pruebas con Junit - 14
Pruebas de base de datos Si nuestro objetivo es probar el DAO no tendría sentido sustituirlo por un mock Restablecer el estado de la BD antes de cada prueba (fixtures) Utilizar DBUnit http://www.dbunit.org/ Lenguaje Java Avanzado 2012-2013 Depto. Ciencia de la Computación e IA Pruebas con Junit - 15
Test-Driven Development Para cada funcionalidad a implementar Escribir las pruebas y comprobar que fallan Escribir el mínimo código para que funcionen Refactorizar el código escrito También conocida como red-green-refactor Lenguaje Java Avanzado 2012-2013 Depto. Ciencia de la Computación e IA Pruebas con Junit - 16
Ventajas de TDD Código probado desde el principio Todo el código bajo el control de las pruebas No es necesario depurar código complejo Código de gran calidad Alta confianza en el código desarrollado Lenguaje Java Avanzado 2012-2013 Depto. Ciencia de la Computación e IA Pruebas con Junit - 17
Preguntas...? 2012-2013 Depto. Ciencia de la Computación e IA