Omitir navegación.
Principal

PruebaInvariante


Personajes

Escrito por Martin Fowler
Traducido por Rafael Vacas
Revisado por Carmen Vidal

Actualizado con un ejemplo, puesto que el artículo original era demasiado seco.

Ha habido desde siempre una discusión entre los defensores del Diseño por Contrato (DbC) y del Desarrollo Dirigido por pruebas (TDD). No voy a ahondar en ello ahora, pero sugiero la idea de combinar ambos, idea que surgió mientras hablaba con Daniel Jackson.

En el DbC se define una invariante para cada clase. Esta invariante establece las propiedades de la clase que siempre se deberán cumplir. Un objeto debe siempre satisfacer su invariante (a menos que esté en el medio de algo). Con Eiffel la invariante de la clase se comprueba siempre de forma automática antes (al comprobar al pre-condición) y después (al comprobar la post-condición) de la llamada de un método. Un fallo en la invariante lanza una excepción. (Esta comprobación puede ser desactivada en producción a efectos de rendimiento)

Aplicar esta idea al TDD significa que hay que definir un método común para probar la invariante en las clases de producción, así como probarlo en el código de test.

Es el momento del ejemplo trivial de costumbre.

public class Bowler ... [jugador de cricket]
int overs, runs, wickets;

Una invariante sencilla para un bowler es que ninguno de estos valores puede ser negativo. Esta invariante podría ser definida de la siguiente forma.

public boolean passesInvariant() {
return (runs >= 0 && overs >= 0 && wickets >= 0);
}

Se usaría durante las pruebas después de la fase de inicialización y después de la fase de ejercicio del test.

[Ian Terence Botham es considerado el mejor jugador inglés de cricket de todos los tiempos y nació en el año 1955, de ahí el comentario de Fowler sobre su edad]

public void testConcedingRunsAddsToRunsScore() {
Bowler botham = new Bowler(); // setup – aquí se ve mi edad
assert botham.passesInvariant();
botham.concedeRuns(4); //exercise
assert botham.passesInvariant();
assertEquals(4, botham.getRuns()); //verify
}

No lo he probado, ni se de nadie que lo haya hecho. Aún así pensé que era interesante y que debía mencionarlo.

Artículo Original