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