1/23/2004

La insoportable levedad de las pruebas software

Test Infected: Programmers love writing tests

JUnit es un framework de pruebas unitarias de regresión que se ha convertido en un referente cuando deseamos realizar sw fiable.

La forma de trabajar es la siguiente, que se nos muestra en el artículo:

1. Escribe el test que, obviamente, ahora no funciona.
2. Escribe el código que hará que el test funcione.

Esta fórmula es la utilizada en las metodologías ágiles: "code a little, test a little, code a little, test a little" ;)

JUnit contiene la clase TestCase, que heredaremos en nuestra clase de prueba (p.e. MoneyTest). Esta clase irá, por convenio, en el mismo paquete que la clase a ser probada, para que tenga acceso a los métodos de paquete.

public class MoneyTest extends TestCase {
//…
public void testSimpleAdd() {
Money m12CHF= new Money(12, "CHF"); // (1)
Money m14CHF= new Money(14, "CHF");
Money expected= new Money(26, "CHF");
Money result= m12CHF.add(m14CHF); // (2)
Assert.assertTrue(expected.equals(result)); // (3)
}
}

La última línea es la más interesante, por dos temas:

1. Hay que sobrecargar el método Object.equals para comparación de objetos.
2. Se utiliza Assert.assertTrue

JUnit provee en la clase Assert diferentes tipos de métodos:

  • assertEquals para booleans, chars, double, float, int, Objects, ...

  • assertFalse

  • assertNotNull

  • assertNotSame

  • assertNull

  • assertSame




Una vez que hemos definido las diferentes pruebas a realizar en nuestra clase de pruebas, hay que definir cómo se ejecuta un caso de prueba, y cómo se ejecuta una "suite" de pruebas.

Modos de prueba en JUnit

1. Estático
2. Dinámico

1. Se sobrecarga el método TestCase.runTest y se invoca mediante una clase anónima interna:
TestCase test= new MoneyTest("simple add") {
public void runTest() {
testSimpleAdd();
}
};

JUnit implementa un patrón Template Method para ejecutar adecuadamente ese método.

2. Utilización de introspección (Java Reflection) para implementar el método runTest. Asume que el nombre del test es el nombre del método del caso de prueba:
TestCase test= new MoneyTest("testSimpleAdd");


Suites de pruebas

TestSuite es un composite de Tests:

public static Test suite() {
TestSuite suite= new TestSuite();
suite.addTest(new MoneyTest("testEquals"));
suite.addTest(new MoneyTest("testSimpleAdd"));
return suite;
}

También hay otras maneras -desde JUnit 2.0-:

public static Test suite() {
return new TestSuite(MoneyTest.class);
}

JUnit extrae todos los métodos de pruebas automáticamente.

public static Test suite() {
TestSuite suite= new TestSuite();
suite.addTest(
new MoneyTest("money equals") {
protected void runTest() { testEquals(); }
}
);

suite.addTest(
new MoneyTest("simple add") {
protected void runTest() { testSimpleAdd(); }
}
);
return suite;
}

Lo mismo, pero de manera estática.




No hay comentarios: