jueves, 22 de mayo de 2008

Pruebas manejadas por datos con VIsual Studio o Data Driven Test

Pruebas manejadas por datos con Visual Studio

Un utilidad interesante del Visual Studio es la posibilidad de que un método de prueba (TestMethod) se ejecute múltiples veces a partir de un origen de datos, qué quiero decir con esto, teniendo un origen de datos (SqlServer, Access, Oracle, Excel, cualquier cosa que tenga un conector .net) podemos hacer que el IDE de Visual Studio ejecute un método de prueba (un TestMethod) una vez por cada registro de un origen de datos.
Por ejemplo, podemos tenes un método para probar un cierto algorítmo pero como no podemos tener todos los casos de prueba claro de entemano (quiero decir los posibles datos de entrada) podemos hacer que el método los tome del origen de datos y se ejecute una vez por cada registros, esto nos permite dos cosas:

-Poder dejar para más adelante todos los casos posibles, no pensarlo ahora, o porque no los sabemos o porque no queremos o lo que sea.
-Delegar a otra persona (funcional tal vez) la tarea de crear los datos de entrada e incluso ejecutar la prueba unitaria

Por supuesto, no podemos saber de antemano que van a poner, así que una forma astuta (que obviamente no se me ocurrió a mí) es poner una columna adicional con el resultado esperado, pero bueno, basta, vamos al código

/// <summary>
/// Este método se ejecuta una vez por cada fila de la tabla
/// </summary>
[TestMethod]
[DataSource(
  "System.Data.Odbc", 
    @"Dsn=Excel Files;
    dbq=C:\\Pruebas\\datosPruebaDB\\origenDatos.xls;
        defaultdir=C:\\Pruebas\\datosPruebaDB;
    driverid=790;
    maxbuffersize=2048;
    pagetimeout=5", 
    "Datos$", 
    DataAccessMethod.Sequential)]
public void TestMethod1()
{
   //recuperados los valores del origen de datos
    string valor = this.Context.DataRow["Valor"].ToString();
    bool resultado = Convert.ToBoolean(this.Context.DataRow["Resultado"]);

    //nuestra función de validación de largos
    bool largoCorrecto = (valor.Length>6);

    //assert para verficar si coincide con el resultado esperado
    Assert.AreEqual<bool>(largoCorrecto, resultado);

}

Y listo es todo, es este caso mi archivo Excel tiene esta forma

Valor Resultado
Leonardo 1
Gabriel 1
Hernán 0
Gerardo 1
Norberto 1
Adrián 0
Angel 0
Albino 0

Lo hice con Excel para que sea más visual, por supuesto, la hoja donde se encutran estos datos se llaman "Datos" y me conecto por ODBC. La columna con el encabezado valor es el valor de entrada y la que se llama resultado es el resultado esperado, como puede verse simplemente agrego un atriburo en el método indicando el origen de datos y después recupero la fila actual con el TestContext.

Enjoy,