Está en la página 1de 7

1 ¿Qué es JUnit?

JUnit es un framework en Java que sirve para diseñar, construir y ejecutar pruebas uni-
tarias.
Una prueba unitaria es aquella que comprueba la corrección de un módulo de software
en cuanto a funcionalidades que ofrece.
En el caso de Java, las pruebas unitarias comprueban la corrección de cada uno de los
métodos de una clase.
¿Cómo hacemos las pruebas de una clase en Java?

2 Ejemplo con HolaMundo


/*
* HolaMundo.java
* Mi primer programa en java
*/
class HolaMundo {
/**
* Devuelve "Hola Mundo!"
*/
public String saludar() {
return "Hola Mundo!";
}
/**
* Imprime saludo
*/
public static void main( String[] args ) {
HolaMundo hola = new HolaMundo();
System.out.println(hola.saludar());
}
}

La prueba es el chivato del main.

JUnit 1
Programación Avanzada
2.1 Desventajas
• Cuanto más grande sea la interfaz de la clase, mayor será el main

• El tamaño del código de la clase crece por las pruebas

• Poco fiable, porque main forma parte de la misma clase y tiene un acceso peculiar
a los elementos de la clase

• Difı́cil de automatizar las pruebas, incluso pasando argumentos al main

JUnit propone codificar las pruebas en clases separadas, basándose en un framework


construido a partir de varios patrones (de los que vamos a ver sólo los dos primeros):

• Composite

• Command

• Decorator

• Factory Method

3 Caso de prueba para HolaMundo


package es.uc3m.pa.test;
import es.uc3m.pa.HolaMundo;
import junit.framework.TestCase;
import junit.framework.AssertionFailedError;
/**
* Caso de prueba de JUnit para HolaMundo
*/
public class HolaMundoTest extends TestCase {
public HolaMundoTest(String nombre) {
super(nombre);
}
public static void main(String args[]) {
junit.textui.TestRunner.run(HolaMundoTest.class);
}
public void testSaludar() {

JUnit 2
Programación Avanzada
HolaMundo hola = new HolaMundo();
assert( hola!=null );
assertEquals("Hola Mundo!", hola.saludar() );
}
}

4 Estructura de casos de prueba


Las clases básicas del framework son TestCase y TestSuite, que implementan la interfaz
Test siguiendo la estructura de un composite.

• TestSuite1

– TestSuite 1.1

∗ TestCase 1.1.1
∗ TestCase 1.1.2
· individualTest1()
· individualTest2()
· ...
∗ ...

– TestSuite 1.2

– ...

• TestSuite 2

• ...

Supongamos que estamos desarrollando una aplicación de comercio electrónico con


funcionalidades como: carrito de la compra, validación de tarjetas de crédito, etc.
Explórese la clase que implementa la funcionalidad del carrito de la compra, Shop-
pingCart.java1 .
1
ejemplos/ShoppingCart.java

JUnit 3
Programación Avanzada
4.1 Ejemplo de jerarquı́a
Podemos definir una jerarquı́a de casos de prueba:

AllTests (Top-level Test Suite)


SmokeTestSuite (Structural Integrity Tests)
EcommerceTestSuite
ShoppingCartTestCase
CreditCardTestSuite
AuthorizationTestCase
CaptureTestCase
VoidTestCase
UtilityTestSuite
MoneyTestCase
DatabaseTestSuite
ConnectionTestCase
TransactionTestCase
LoadTestSuite (Performance and Scalability Tests)
DatabaseTestSuite
ConnectionPoolTestCase
ThreadPoolTestCase

También se puede ver cómo se emplea TestDecorator para implementar nuevas fun-
cionalidades dinámicamente antes o después de ejecutar un TestCase, sin necesidad de
modificar la clase TestCase

5 Ejecución de casos de prueba


Para ejecutar un caso de prueba de JUnit se sigue el patrón Command:

6 Cómo usar JUnit


6.1 Cómo escribir un TestCase
1. Definir una subclase de TestCase.

2. Redefinir el método setUp() para inicializar los objetos bajo prueba.

JUnit 4
Programación Avanzada
Figura 1: Patrón composite en el framework de JUnit

Figura 2: Patrón command en el framework de JUnit

JUnit 5
Programación Avanzada
3. Redefinir el método tearDown() para liberar los objetos bajo prueba.

4. Definir uno o más métodos públicos testXXX() que prueben los objetos y evalúen
(llamando al método assert()) los resultados esperados.

5. Definir un método estático de factorı́a suite() que crea una TestSuite que contenga
todos los métodos testXXX() del TestCase.

6. Opcionalmente, definir un método main() que ejecute el TestCase en modo batch.

El caso de prueba para la clase ShoppingCart puede estudiarse en ShoppingCartTest-


Case.java2 .

6.2 Cómo escribir una TestSuite


1. Definir una subclase de TestCase.

2. Definir un método estático de factorı́a suite() que crea una TestSuite que contenga
todos los tests.

3. Opcionalmente, definir un método main() que ejecute la TestSuite en modo in batch.

Puede verse una TestSuite de ejemplo en EcommercTestSuite.java3 .

6.3 Ejecutar las pruebas


Se puede emplear una interfaz textual (junit.textui.TestRunner) o una gráfica (junit.swingui.TestRunner)
mediante alguna de estas instrucciones:

java ShoppingCartTest (si se ha definido la interfaz a usar en main)


java junit.textui.TestRunner ShoppingCartTest (si no se ha definido interfaz)
java junit.swingui.TestRunner ShoppingCartTest (si no se ha definido interfaz)

7 URL’s de interés
• JUnit.org4
2
ejemplos/ShoppingCartTestCase.java
3
ejemplos/EcommerceTestSuite.java
4
http://www.junit.org

JUnit 6
Programación Avanzada
• JUnit Primer5

• JUnit Primer6

• Incremental development with Ant and JUnit7

5
http://www.clarkware.com/articles/JUnitPrimer.html
6
http://www.javaworld.com/javaworld/jw-12-2000/jw-1221-junit.html
7
docs/j-ant.pdf

JUnit 7
Programación Avanzada