Tutorial: Prueba de una biblioteca de clases de .NET con .NET mediante Visual Studio
En este tutorial se muestra cómo automatizar las pruebas unitarias mediante la adición de un proyecto de prueba a una solución.
Prerrequisitos
- En este tutorial se trabaja con la solución que se crea en Creación de una biblioteca de clases de .NET mediante Visual Studio.
Creación de un proyecto de prueba unitaria
Las pruebas unitarias proporcionan pruebas automatizadas de software durante el desarrollo y la publicación. MSTest es uno de los tres marcos de pruebas entre los que puede elegir. Los demás son xUnit y nUnit.
Inicie Visual Studio.
Abra la solución de
ClassLibraryProjects
que creó en Creación de una biblioteca de clases de .NET mediante Visual Studio.Agregue un nuevo proyecto de prueba unitaria denominado "StringLibraryTest" a la solución.
Haga clic con el botón derecho en la solución en Explorador de Soluciones y seleccione Agregar>Nuevo proyecto.
En el cuadro de búsqueda de la página Agregar un nuevo proyecto, escriba mstest. En la lista de lenguajes, elija C# o Visual Basic y, luego, en la lista de plataformas, elija Todas las plataformas.
Seleccione la plantilla Proyecto de prueba de MSTest y luego Siguiente.
En la página Configurar el nuevo proyecto, escriba StringLibraryTest en el cuadro Nombre del proyecto. A continuación, elija Siguiente.
En la página Información adicional, seleccione .NET 8 en el cuadro Marco de trabajo. A continuación, elija Crear.
Visual Studio crea el proyecto y abre el archivo de clase en la ventana de código con el código siguiente. Si no se muestra el idioma que desea usar, cambie el selector de idioma en la parte superior de la página.
namespace StringLibraryTest; [TestClass] public class UnitTest1 { [TestMethod] public void TestMethod1() { } }
Imports Microsoft.VisualStudio.TestTools.UnitTesting Namespace StringLibraryTest <TestClass> Public Class UnitTest1 <TestMethod> Sub TestSub() End Sub End Class End Namespace
El código fuente creado por la plantilla de prueba unitaria hace lo siguiente:
- Importa el espacio de nombres Microsoft.VisualStudio.TestTools.UnitTesting, que contiene los tipos usados para las pruebas unitarias. En C#, el espacio de nombres se importa a través de una directiva
global using
en GlobalUsings.cs. - Aplica el atributo TestClassAttribute a la clase
UnitTest1
. - Aplica el atributo TestMethodAttribute para definir
TestMethod1
en C# oTestSub
en Visual Basic.
Cada método etiquetado con [TestMethod] en una clase de prueba etiquetada con [TestClass] se ejecuta automáticamente cuando se ejecuta la prueba unitaria.
- Importa el espacio de nombres Microsoft.VisualStudio.TestTools.UnitTesting, que contiene los tipos usados para las pruebas unitarias. En C#, el espacio de nombres se importa a través de una directiva
Agregar una referencia de proyecto
Para que el proyecto de prueba funcione con la clase StringLibrary
, agregue una referencia en el proyecto StringLibraryTest al proyecto de StringLibrary
.
En el Explorador de soluciones, haga clic con el botón derecho en el nodo Dependencias del proyecto StringLibraryTest y seleccione Agregar referencia de proyecto del menú contextual.
En el cuadro de diálogo Administrador de referencias, expanda el nodo Proyectos y active la casilla junto a StringLibrary. Agregar una referencia al ensamblado
StringLibrary
permite al compilador encontrar métodos del StringLibrary al compilar el proyecto StringLibraryTest .Seleccione Aceptar.
Adición y ejecución de métodos de prueba unitaria
Cuando Visual Studio ejecuta una prueba unitaria, ejecuta cada método marcado con el atributo TestMethodAttribute en una clase marcada con el atributo TestClassAttribute. Un método de prueba finaliza cuando se encuentra el primer error o cuando todas las pruebas contenidas en el método se han realizado correctamente.
Las pruebas más comunes llaman a los miembros de la clase Assert. Muchos métodos de aserción incluyen al menos dos parámetros, uno de los cuales es el resultado de la prueba esperado y el otro de los cuales es el resultado de la prueba real. Algunos de los métodos más frecuentes de la clase Assert
se muestran en la tabla siguiente:
Métodos de aserción | Función |
---|---|
Assert.AreEqual |
Comprueba que dos valores o objetos son iguales. Se produce un error en la aserción si los valores o objetos no son iguales. |
Assert.AreSame |
Comprueba que dos variables de objeto hacen referencia al mismo objeto. Se produce un error en la aserción si las variables hacen referencia a objetos diferentes. |
Assert.IsFalse |
Comprueba si una condición es false . La aserción produce un error si la condición es true . |
Assert.IsNotNull |
Verifica que un objeto no sea null . Se produce un error en la aserción si el objeto es null . |
También puede usar el método Assert.ThrowsException (o Assert.Throws
y Assert.ThrowsExactly
si usa MSTest 3.8 y versiones posteriores) en un método de prueba para indicar el tipo de excepción que se espera que se produzca. Se produce un error en la prueba si no se produce la excepción especificada.
Al probar el método StringLibrary.StartsWithUpper
, debe proporcionar una cantidad de cadenas que comiencen con un carácter en mayúsculas. Espera que el método devuelva true
en estos casos, por lo que puede llamar al método Assert.IsTrue. Del mismo modo, quiere proporcionar un número de cadenas que comiencen con algo que no sea un carácter en mayúsculas. Espera que el método devuelva false
en estos casos, por lo que puede llamar al método Assert.IsFalse.
Dado que el método de biblioteca controla las cadenas, también quiere asegurarse de que controla correctamente una cadena vacía (String.Empty
), una cadena válida que no tiene caracteres y cuya Length es 0 y una cadena null
que no se ha inicializado. Puede llamar a StartsWithUpper
directamente como método estático y pasar un único argumento String. También puede llamar a StartsWithUpper
como método de extensión en una variable de string
asignada a null
.
Definirá tres métodos, cada uno de los cuales llama a un método Assert para cada elemento de una matriz de cadenas. Llamará a una sobrecarga de método que le permite especificar que se muestre un mensaje de error en caso de error en la prueba. El mensaje identifica la cadena que provocó el error.
Para crear los métodos de prueba:
En la ventana de código UnitTest1.cs o UnitTest1.vb, reemplace el código por el código siguiente:
using UtilityLibraries; namespace StringLibraryTest { [TestClass] public class UnitTest1 { [TestMethod] public void TestStartsWithUpper() { // Tests that we expect to return true. string[] words = { "Alphabet", "Zebra", "ABC", "Αθήνα", "Москва" }; foreach (var word in words) { bool result = word.StartsWithUpper(); Assert.IsTrue(result, string.Format("Expected for '{0}': true; Actual: {1}", word, result)); } } [TestMethod] public void TestDoesNotStartWithUpper() { // Tests that we expect to return false. string[] words = { "alphabet", "zebra", "abc", "αυτοκινητοβιομηχανία", "государство", "1234", ".", ";", " " }; foreach (var word in words) { bool result = word.StartsWithUpper(); Assert.IsFalse(result, string.Format("Expected for '{0}': false; Actual: {1}", word, result)); } } [TestMethod] public void DirectCallWithNullOrEmpty() { // Tests that we expect to return false. string?[] words = { string.Empty, null }; foreach (var word in words) { bool result = StringLibrary.StartsWithUpper(word); Assert.IsFalse(result, string.Format("Expected for '{0}': false; Actual: {1}", word == null ? "<null>" : word, result)); } } } }
Imports Microsoft.VisualStudio.TestTools.UnitTesting Imports UtilityLibraries Namespace StringLibraryTest <TestClass> Public Class UnitTest1 <TestMethod> Public Sub TestStartsWithUpper() ' Tests that we expect to return true. Dim words() As String = {"Alphabet", "Zebra", "ABC", "Αθήνα", "Москва"} For Each word In words Dim result As Boolean = word.StartsWithUpper() Assert.IsTrue(result, $"Expected for '{word}': true; Actual: {result}") Next End Sub <TestMethod> Public Sub TestDoesNotStartWithUpper() ' Tests that we expect to return false. Dim words() As String = {"alphabet", "zebra", "abc", "αυτοκινητοβιομηχανία", "государство", "1234", ".", ";", " "} For Each word In words Dim result As Boolean = word.StartsWithUpper() Assert.IsFalse(result, $"Expected for '{word}': false; Actual: {result}") Next End Sub <TestMethod> Public Sub DirectCallWithNullOrEmpty() ' Tests that we expect to return false. Dim words() As String = {String.Empty, Nothing} For Each word In words Dim result As Boolean = StringLibrary.StartsWithUpper(word) Assert.IsFalse(result, $"Expected for '{If(word Is Nothing, "<null>", word)}': false; Actual: {result}") Next End Sub End Class End Namespace
La prueba de caracteres en mayúsculas en el método
TestStartsWithUpper
incluye la letra mayúscula griega alfa (U+0391) y la letra mayúscula cirílico EM (U+041C). La prueba de caracteres en minúsculas del métodoTestDoesNotStartWithUpper
incluye el alfa de letra pequeña griega (U+03B1) y la letra pequeña cirílico Ghe (U+0433).En la barra de menús, seleccione Archivo>Guardar UnitTest1.cs como o Archivo>Guardar UnitTest1.vb como. En el cuadro de diálogo Guardar archivo como, seleccione la flecha junto al botón Guardar y seleccione Guardar con codificación.
En el cuadro de diálogo Confirmar guardar como, seleccione el botón Sí para guardar el archivo.
En el cuadro de diálogo Opciones avanzadas para guardar, seleccione Unicode (UTF-8 con firma) - Página de códigos 65001 desde la lista desplegable Codificación y seleccione Aceptar.
Si no guarda el código fuente como un archivo con codificación UTF8, Visual Studio puede guardarlo como un archivo ASCII. Cuando esto sucede, el tiempo de ejecución no descodifica con precisión los caracteres UTF8 fuera del intervalo ASCII y los resultados de la prueba no serán correctos.
En la barra de menús, seleccione Prueba>Ejecutar todas las pruebas. Si no se abre la ventana Explorador de pruebas, ábrala mediante Prueba>Explorador de pruebas. Las tres pruebas se enumeran en la sección Pruebas Superadas, y la sección Resumen informa del resultado de la ejecución de pruebas.
Administración de errores de prueba
Si haces desarrollo guiado por pruebas (TDD), primero escribes las pruebas y fallan la primera vez que las ejecutas. A continuación, agregue código a la aplicación que haga que la prueba se realice correctamente. En este tutorial, ha creado la prueba después de escribir el código de la aplicación que valida, por lo que no ha podido comprobar si la prueba genera un error. Para validar que se produce un error en una prueba cuando se espera que se produzca un error, agregue un valor no válido a la entrada de prueba.
Modifique la matriz
words
en el métodoTestDoesNotStartWithUpper
para incluir la cadena "Error". No es necesario guardar el archivo porque Visual Studio guarda automáticamente los archivos abiertos cuando se compila una solución para ejecutar pruebas.string[] words = { "alphabet", "Error", "zebra", "abc", "αυτοκινητοβιομηχανία", "государство", "1234", ".", ";", " " };
Dim words() As String = { "alphabet", "Error", "zebra", "abc", "αυτοκινητοβιομηχανία", "государство", "1234", ".", ";", " " }
Ejecute la prueba seleccionando Prueba>Ejecutar todas las pruebas de la barra de menús. La ventana de explorador de pruebas indica que dos pruebas se realizaron con éxito y una falló.
Seleccione la prueba fallida,
TestDoesNotStartWith
.La ventana Explorador de pruebas muestra el mensaje generado por la aserción: "Assert.IsFalse ha fallado." Se esperaba para "Error": false; real: True". Debido al error, no se probaron todas las cadenas de la matriz después de "Error".
Quite la cadena "Error" que agregó en el paso 1. Vuelva a ejecutar la prueba y se superarán las pruebas.
Prueba la versión de lanzamiento de la biblioteca
Ahora que se han superado todas las pruebas al ejecutar la versión de depuración de la biblioteca, ejecute las pruebas una vez más con la versión de lanzamiento de la biblioteca. Varios factores, incluidas las optimizaciones del compilador, a veces pueden producir un comportamiento diferente entre las compilaciones Debug y Release.
Para probar la compilación de versión:
En la barra de herramientas de Visual Studio, cambie la configuración de compilación de Depurar a Versión.
En Explorador de soluciones, haga clic con el botón derecho en el proyecto StringLibrary y seleccione Compilar en el menú contextual para volver a compilar la biblioteca.
Ejecuta las pruebas unitarias eligiendo Prueba>Ejecuta todas las pruebas en la barra de menús. Las pruebas se superan.
Depuración de pruebas
Si usa Visual Studio como IDE, puede usar el mismo proceso que se muestra en Tutorial: Depuración de una aplicación de consola de .NET con Visual Studio para depurar código mediante el proyecto de prueba unitaria. En lugar de iniciar el proyecto de aplicación ShowCase, haga clic con el botón derecho en el proyecto StringLibraryTests y seleccione Depurar pruebas en el menú contextual.
Visual Studio inicia el proyecto de prueba con el depurador asociado. La ejecución se detendrá en cualquier punto de interrupción que haya agregado al proyecto de prueba o al código de biblioteca subyacente.
Recursos adicionales
- Conceptos básicos de pruebas unitarias - Visual Studio
- Pruebas unitarias en .NET
Pasos siguientes
En este tutorial, ha realizado una prueba unitaria de una biblioteca de clases. Puede hacer que la biblioteca esté disponible para otros usuarios publicándola en NuGet como paquete. Para obtener información sobre cómo, siga un tutorial de NuGet:
Si publica una biblioteca como un paquete NuGet, otras pueden instalarla y usarla. Para obtener información sobre cómo, siga un tutorial de NuGet:
Una biblioteca no tiene que distribuirse como un paquete. Se puede agrupar con una aplicación de consola que la utilice. Para obtener información sobre cómo publicar una aplicación de consola, consulte el tutorial anterior de esta serie: