Title: Algoritmos y programaci
1Algoritmos y programación III (75.07)
- Pruebas Automatizadas JUnit - NUnit
2Temario
- Introducción a JUnit
- Descripción
- Clases involucradas
- Casos particulares de pruebas
- NUnit - diferencias
- Desarrollo basado en pruebas
3Introducció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.
4Descripción
- JUnit consta de varios paquetes (packages) de
clases - Paquetes para construir 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. - Paquetes para ejecutar los casos de prueba
- 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
5junit.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.
6Assert
- 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)
7TestCase
- 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()
8TestSuite
- 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)
9Ejemplo
- 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) -
10Ejemplo - 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)
11Excepciones
- 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)
12Prueba 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
13NUnit
- 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.
14Ejemplo
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
15Ejemplo
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))
16Elementos
- 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.
17Otros atributos
- SetUp ...TearDown
- TestFixtureSetUp ... TestFixtureTearDown
- Category("MiCategoria")
- ExpectedException("System.ExcepcionEsperada")
- Ignore("Ignrar esta fixture")
18Herramientas
- Resultados por consola
- GUI
- Integración con VS 2003/2005
- Ej TestDriven.Net
19Otras 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...
20Desarrollo 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