Estructura de las pruebas unitarias
Actualización: noviembre 2007
Una prueba unitaria es un método que es un miembro de una clase escrita en C#, Visual Basic o Visual C++.
Nota: |
---|
Para obtener información detallada acerca de cómo utilizar las pruebas unitarias con el código de producción de C++ y cómo utilizar las pruebas unitarias escritas en C++, vea Pruebas unitarias y C++. |
Para que se reconozca la prueba unitaria en Herramientas para pruebas Team System, este archivo de código fuente debe residir en un proyecto de prueba, que a su vez sea parte de una solución de Visual Studio. Cuando se genera este proyecto o la solución completa, el proyecto de prueba se integra en un ensamblado que contiene la prueba unitaria ejecutable.
Todos los métodos de prueba unitaria están marcados con el atributo [TestMethod()], <TestMethod()> en Visual Basic, y son miembros de la clase [TestClass()]. Por su parte, esta clase está definida en el espacio de nombres Microsoft.VisualStudio.TestTools.UnitTesting. Cuando se genera una prueba unitaria, se observa que este espacio de nombres se incluye al principio del archivo generado, en una instrucción using o Imports.
Atributos y propiedades de pruebas unitarias
Además del atributo [TestMethod()] del método de prueba unitaria y el atributo [TestClass()] de la clase que lo contiene, se utilizan otros atributos para habilitar la funcionalidad específica de la prueba unitaria. Entre ellos, unos primordiales son [TestInitialize()] y [TestCleanup()]. Use un método marcado con [TestInitialize()] para preparar aspectos del entorno en el que se va a ejecutar la prueba unitaria. El propósito de esta forma de proceder es establecer un estado conocido para ejecutar la prueba unitaria. Por ejemplo, puede utilizar un método [TestInitialize()] para copiar, modificar o crear ciertos archivos de datos que se utilizarán en la prueba.
Use un método marcado con [TestCleanup()] para devolver el entorno a un estado conocido después de haberse ejecutado una prueba. Esto puede implicar que se eliminen archivos de carpetas, o que se devuelva la base de datos a un estado conocido. Un ejemplo de ello es restablecer una base de datos de inventario a un estado inicial después de probar un método utilizado en una aplicación de entrada de orden. Además, se recomienda utilizar código de limpieza en un método [TestCleanup()] o ClassCleanup y no en un método finalizador. Las excepciones que se inicien desde un método finalizador no se detectarán y pueden producir resultados inesperados.
Una propiedad importante en las clases de prueba es TestContext. Esta propiedad contiene información como el nombre de la prueba unitaria que está en ejecución, el directorio de implementación, los nombres de los archivos de registro y, para pruebas controladas por datos, la base de datos a la que está conectado el usuario. La propiedad TestContext devuelve una instancia de TestContext. Para obtener más información, vea Usar la clase TestContext.
Ejemplo de prueba unitaria
El miniprograma de código siguiente muestra una prueba unitaria sencilla escrita en C#.
[TestMethod()]
public void DebitTest()
{
string customerName = "Mr. Bryan Walton";
double balance = 11.99;
BankAccount target = new BankAccount(customerName, balance);
double amount = 11.22;
target.Debit(amount);
Assert.AreEqual((System.Convert.ToDouble(0.77)), target.Balance, 0.05); // 0.05 is tolerance for floating-point comparison
//Assert.Inconclusive("A method that does not return a value cannot be verified.");
}
Para obtener otro ejemplo, vea Codificar una prueba unitaria orientada a datos.
Resultados de una prueba unitaria
Hay tres maneras de comprobar que se ha efectuado una prueba unitaria:
Utilice instrucciones Assert para validar resultados concretos. Para obtener más información, vea Utilizar instrucciones Assert.
Compruebe que no se inició ninguna excepción. Sigue siendo aconsejable utilizar instrucciones Assert.
Compruebe que se inicia una excepción determinada. Para ello, puede utilizar el atributo ExpectedExceptionAttribute.
Utilizar instrucciones Assert
Si el resultado con o sin errores que genera una prueba es más informativo o importante que las acciones que puede completar la prueba, debe usar instrucciones Assert en el código de la prueba.
El motor de la prueba supone que cada prueba unitaria se inicia en un estado sin errores. La prueba se mantiene en ese estado hasta que una instrucción Assert genere un resultado que se contradiga con el estado sin errores y cambie de Sin errores a Con errores o No concluyente, o hasta que se inicie una excepción no especificada en un atributo ExpectedExceptionAttribute. Dicho de otro modo, una prueba unitaria sin una instrucción Assert generará un resultado Sin errores cada vez se ejecute. Dicha prueba no deja de ser útil; simplemente, es posible que desee probar el código para asegurarse de que se ejecuta sin iniciar ninguna excepción. El código que se comprueba en una prueba unitaria aparece como tratado en las estadísticas de cobertura de código, independientemente de que la prueba haya generado un resultado decisivo o incluso que contuviese una instrucción Assert.
Sin embargo, para comprobar que se emprende una acción específica o que se llega a un estado concreto, se deben utilizar instrucciones Assert. Hay varias instrucciones Assert disponibles en el espacio de nombres Microsoft.VisualStudio.TestTools.UnitTesting. Las distintas instrucciones Assert proporcionan flexibilidad; por ejemplo, se puede forzar el error de una prueba mediante la instrucción Assert.Fail(). Además de estas instrucciones Assert, puede construir su propia funcionalidad personalizada, quizás utilizando instrucciones Assert en bloques if.
Independientemente de los resultados que devuelva una prueba, se efectúa con o sin errores dependiendo de sus instrucciones Assert. Si una prueba contiene varias instrucciones Assert, el estado de la prueba se mantiene en Sin errores hasta que se encuentra una instrucción Assert que cambia el estado a Con errores o No concluyente.
Para obtener más información, vea Utilizar las clases Assert.
Vea también
Referencia
Microsoft.VisualStudio.TestTools.UnitTesting