Download static void assertSame(java.lang.Object expected, java.lang.Object
Document related concepts
no text concepts found
Transcript
Algoritmos y programación III (75.07) Pruebas Automatizadas – JUnit - NUnit Temario Introducción a JUnit Descripción Clases involucradas Casos particulares de pruebas NUnit - diferencias Desarrollo basado en pruebas Introducción JUnit Se trata de un conjunto de clases que nos permiten realizar pruebas unitarias sobre código Java. Está desarrollado en Java. JUnit es Software de código abierto y está alojado en SourceForge. Página principal: www.junit.org. Descripción JUnit consta de varios paquetes (packages) de clases Paquetes para construir los casos de prueba Paquetes para ejecutar los casos de prueba junit.framework, contiene las clases básicas de junit que utilizaremos para construir los casos de prueba. junit.extensions, contiene clases que extienden la funcionalidad de las clases básicas. junit.textui, permite ejecutar los casos de prueba en unainterfaz de texto. junit,awtui y junit.swingui proporcionan una interfaz gráfica para la ejecución de los casos de prueba. Integrado a la plataforma de desarrollo Eclipse junit.framework Conjunto de clases para construir casos de prueba, algunas de las mas representativas son: Assert, proporciona una serie de métodos estáticos para comprobar el cumplimiento de condiciones sobre el código a probar. TestCase, representa un conjunto de pruebas sobre una clase, permite realizar múltiples pruebas sobre sus métodos. TestSuite, permite agrupar diferentes objetos TestCase para su ejecución conjunta. TestResult, permite almacenar los resultados de la ejecución de uno o varios TestCase, de esta forma conoceremos los resultados de las pruebas. Assert Todos sus métodos son estáticos. Posee métodos para probar todo tipo de condiciones. //Condiciones de igualdad static void assertEquals(boolean expected, boolean actual) static void assertEquals(float expected, float actual, float delta) //Condiciones booleanas static void assertTrue(boolean condition) static void assertFalse(boolean condition) //Condiciones sobre objetos static void assertNull(java.lang.Object object) static void assertNotNull(java.lang.Object object) //Condiciones sobre referenacias a objetos static void assertSame(java.lang.Object expected, java.lang.Object actual) static void assertNotSame(java.lang.Object expected, java.lang.Object actual) Contiene un método fail para indicar de forma explícita que el test ha fallado. static void fail(java.lang.String message) TestCase Representa el conjunto de pruebas que se van a realizar sobre los métodos de una clase. Hereda de Assert, por lo que posee todos sus métodos para la comprobación de condiciones. Implementa la interfaz Test. La forma de utilizar esta clase es heredando de ella para construir nuestras clases de prueba. Sus métodos más importantes son: //Ejecuta los métodos de test (todos los que comienzan por “test”) void run(TestResult result) //Realiza todas las inicializaciones necesarias para la prueba protected void setUp() //Libera todos los recursos utilizados durante la prueba protected void tearDown() TestSuite Representa una conjunto de casos de prueba. Implementa la interfaz Test, por tanto implementa el método run para la ejecución de los tests. void run(TestResult result) Existen varias formas de utilizarlo: //Creamos un TestSuite y añadimos varios métodos de prueba para ser ejecutados TestSuite suite= new TestSuite(); suite.addTest(new MathTest("testAdd")); suite.addTest(new MathTest("testDivideByZero")); //Creamos un TestSuite a partir de los métodos de test de una clase, es decir //aquellos que comienzan por “test” y no tienen argumentos, simplemente //pasamos la clase y todos los métodos de test se extraen automáticamente para //formar parte del TestSuite TestSuite suite= new TestSuite(MathTest.class); Ejemplo package pruebaBanco; import junit.framework.TestCase; import junit.framework.*; import miniBanco.*; public class PruebaCtaCte extends TestCase { public void testCrear() { CtaCte cc1 = new CtaCte(11,"Pablo"); CtaCte cc2 = new CtaCte(22,"Juan",3.5); Assert.assertEquals(11,cc1.getNro()); assertEquals(22,cc2.getNro()); assertEquals("Pablo",cc1.getTitular()); assertEquals("Juan",cc2.getTitular()); Assert.assertEquals(3.5,cc2.getDesc_acordado(),0.01); } } Ejemplo - 2 package pruebaBanco; import miniBanco.CtaCte; import junit.framework.TestCase; public class OtraPrueba extends TestCase { CtaCte cc1; CtaCte cc2; protected void setUp() throws Exception { super.setUp(); cc1 = new CtaCte(11,"Pablo"); cc2 = new CtaCte(22,"Juan",3.5); } public void testDepositar() { cc1.depositar(100.5); assertEquals(100.5,cc1.getSaldo(),0.1); cc1.depositar(20); assertEquals(120.5,cc1.getSaldo(),0.1); } } Excepciones Manejo de excepciones esperadas con Junit, ejemplo: public void testMetodoQueLanzaExcepcion() { try { //Invocamos el método de forma que deba lanzar una excepción metodoQueLanzaExcepcion(null); //Si el flujo de control pasa por aquí es porque la excepción //no saltó, entonces indicamos que ha habido un fallo fail(“El método debería haber lanzado una excepción”); } catch (RunTimeException e) { //A modo de documentación, para indicar que la prueba ha //tenido éxito el flujo de control ha de pasar por aquí assertTrue(true); Prueba de métodos privados Probar indirectamente Cambiar el nivel de protección por el de acceso desde el mismo paquete Utilizar clases anidadas Utilizar reflection NUnit Originalmente un 'port' de Junit A partir de la versión 2: Las clases de prueba no deben heredar de una jerarquía determinada Utiliza [atributos] para especificar las clases de prueba, las pruebas, el setup, etc. Ejemplo using System; namespace Calculadora { public class Calc { public Calc() {} public int Sumar (int n1, int n2) { return n1 + n2; } public int Restar (int n1, int n2) { return n1 - n2; } } } Ejemplo using System; using Calculadora; using NUnit.Framework; namespace Pruebas { [TestFixture] public class PruebaCalc { public PruebaCalc() {} [Test] public void ProbarSuma() { Calc c = new Calc(); Assert.AreEqual(3, c.Sumar(1,2)); } [Test] public void PorbarResta() { Calc c = new Calc(); Assert.AreEqual(1, c.Restar(2,1));} } } Elementos Originalmente un 'port' de Junit A partir de la versión 2: Las clases de prueba no deben heredar de una jerarquía determinada Utiliza [atributos] para especificar las clases de prueba, las pruebas, el setup, etc. Otros atributos [SetUp] ...[TearDown] [TestFixtureSetUp] ... [TestFixtureTearDown] [Category("MiCategoria")] [ExpectedException("System.ExcepcionEsperada")] [Ignore("Ignrar esta fixture")] Herramientas Resultados por consola GUI Integración con VS 2003/2005 Ej: TestDriven.Net Otras herramientas Generación automática de casos de prueba a partir de código Separación del código de prueba de los datos de prueba Prueba de sitios web Prueba de interfaces de usuario Otros... Desarrollo mediante pruebas Test Driven Development (TDD) Primer se escriben las pruebas, luego el código del programa Cada vez que se agrega una funcionalidad se corren las pruebas de todo el sistema Las pruebas se convierten en la principal documentación del sistema Es principalmente una metodología de desarrollo, que además produce código ‘limpio’