Download Lenguaje Java Avanzado
Document related concepts
no text concepts found
Transcript
Experto Universitario Java Enterprise Lenguaje Java Avanzado Sesión 4: Pruebas con JUnit © 2012-2013 Depto. Ciencia de la Computación e IA Experto Universitario Java Enterprise Í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 Experto Universitario Java Enterprise 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 Experto Universitario Java Enterprise 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 Experto Universitario Java Enterprise Método de prueba • Anotar con @Test los métodos de prueba calculaSalarioNeto • Nombre con prefijo test- testCalculaSalarioNeto • Ejecutar método a probar • Comprobar resultado con assert- Lenguaje Java Avanzado © 2012-2013 Depto. Ciencia de la Computación e IA Pruebas con Junit - 5 Experto Universitario Java Enterprise 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 Experto Universitario Java Enterprise 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 Experto Universitario Java Enterprise Resultados de las pruebas Lenguaje Java Avanzado © 2012-2013 Depto. Ciencia de la Computación e IA Pruebas con Junit - 8 Experto Universitario Java Enterprise 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 Experto Universitario Java Enterprise 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 Experto Universitario Java Enterprise 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 Experto Universitario Java Enterprise 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 Experto Universitario Java Enterprise 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 Experto Universitario Java Enterprise 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 Experto Universitario Java Enterprise 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 Experto Universitario Java Enterprise 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 Experto Universitario Java Enterprise 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 Experto Universitario Java Enterprise ¿Preguntas...? © 2012-2013 Depto. Ciencia de la Computación e IA