12.6.06

Un ejemplo de diseño de pruebas con Cactus (I).

Saludos y disculpas por la tardanza.

Vamos a ver un sencillo ejemplo donde vamos a diseñar un conjunto de pruebas para un servlet que controla el acceso mediante nombre y clave (el login de toda la vida) y las vamos a implementar con la herramienta Cactus de Apache. Por supuesto, las ideas que veamos pueden aplicarse a otras plataformas de desarrollo web y otras herramientas.
Cactus es una herramienta que nos permite escribir pruebas para código que se ejecute en un servidor, como servlets, JSP, filtros, EJB, etc. Básicamente, una prueba escrita en Cactus se divide en dos partes: la parte cliente y la parte servidor. La parte cliente se ejecuta en nuestra máquina mientras que la parte servidor se ejcuta en el servidor. Más adelante veremos como usarla, ahora vamos a describir el problema y diseñar un conjunto de pruebas.

Vamos a probar el servlet de acceso. Lo primero que necesitamos es el funcionamiento esperado del servlet. Dicho funcionamiento se describe a continuación:

1. El servlet recibe una petición de login con un nombre de usuario y una clave.
1.1. Si el usuario ya se ha registrado, el servlet informa de ello y termina.
1.2. Si el usuario ya lo intentó 3 veces, el servlet informa de ello y termina.
2. En caso contrario, el servlet comprueba el nombre y la clave recibida.
2.1. Si el nombre es válido y la clave coincide, el servlet registra al usuario, informa de ello y termina.
2.2. Si el nombre no es válido o la clave no coincide, el servlet incrementa el número de intentos e informa de ello.

El código del servlet que vamos a probar no lo necesitamos ni para diseñar las pruebas ni para codificarlas. De todas amneras dicho código se muestra a continuación:


import javax.servlet.*;
import javax.servlet.http.*;

public class AccessServlet extends HttpServlet {

private String user ="test";
private String passwd = "test";

protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, java.io.IOException
{
HttpSession session;
ServletOutputStream out;
Boolean validUser;
Integer numTries;
String pUser, pPass;

out = resp.getOutputStream();

// 1. Obtengo la sesion.
session = req.getSession();

// 2. Miro si el usuario ya está validado
validUser = (Boolean) session.getAttribute("validUser");
if (validUser != null) {
out.println("

"+"Ya eres un usuario válid");
out.flush();
return;
}

// 3. Comprobamos el número máximo de intentos
numTries = (Integer) session.getAttribute("numTries");
if (numTries == null) {
numTries = new Integer(0);
}

if (numTries.intValue() >= 3) {
out.println("

"+"Demasiados intentos");
out.flush();
return;
}

// 4. Recuperamos los parámetros.
pUser = req.getParameter("f_user");
pPass = req.getParameter("f_password");

// 5. Comprobamos si el nombre y la clave son válidos
if ( pUser.equals(user) && pPass.equals(passwd) ) {
session.setAttribute("validUser", new Boolean(true) );
out.println("

"+"Eres un usuario válido");
out.flush();
return;
}

// 6. Si no, incrementamos en 1 el número de intentos y lo guardamos en la sesión
numTries = new Integer(numTries.intValue()+1);
session.setAttribute("numTries", numTries );
out.println("

"+"Los datos de acceso no son válidos.");
out.flush();

}
}



Por simplicidad, se ha incluido el nombre y la clave válidos en el propio servlet. Si consultáramos con una base de datos, las pruebas que vamos a diseñar a continuación serán exactamente iguales. Sin embargo la arquitectura de pruebas (por ejemplo el setUp() de un caso de prueba) será un poco más complejo.


En la próxima entrada diseñaremos pruebas para probar este servlet y las codificaremos con Cactus.

PD: en el código de ejemplo faltan los println para las etiquetas HTML y BODI.