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’