Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
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 Crear una biblioteca de clases de .NET.
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
ClassLibraryProjectsque creó en Crear una biblioteca de clases de .NET.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. Elija C# o Visual Basic en la lista Idioma y, a continuación, elija Todas las plataformas en la lista Plataforma.
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. Después, haga clic en Siguiente.
En la página Información adicional, seleccione .NET 10 en el cuadro Framework seleccione Microsoft.Testing.Platform para el ejecutor Test y, después, elija Crear.
Escriba información adicional para el proyecto de prueba de MSTest.
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 sealed class Test1 { [TestMethod] public void TestMethod1() { } } }Imports Microsoft.VisualStudio.TestTools.UnitTesting Namespace StringLibraryTest <TestClass> Public Class Test1 <TestMethod> Sub TestSub() End Sub End Class End NamespaceEl código fuente creado por la plantilla de prueba unitaria hace lo siguiente:
- Incluye Microsoft.VisualStudio.TestTools.UnitTesting en el archivo de proyecto StringLibraryTest en C#, e importa Microsoft.VisualStudio.TestTools.UnitTesting en Visual Basic.
- Aplica el atributo a la clase .
- Aplica el atributo TestMethodAttribute para definir
TestMethod1en C# oTestSuben 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.
Inicie Visual Studio Code.
Abra la solución
ClassLibraryProjectsque creó en Crear una biblioteca de clases de .NET.En Explorador de soluciones, seleccione Nuevo proyecto o, en la paleta de comandos, seleccione .NET: Nuevo proyecto.
Seleccione Proyecto de prueba de MSTest, asígneles el nombre "StringLibraryTest", seleccione el directorio predeterminado y seleccione Crear proyecto.
La plantilla de proyecto crea StringLibraryTest/Test1.cs con el código siguiente:
namespace StringLibraryTest; [TestClass] public class Test1 { [TestMethod] public void TestMethod1() { } }El código fuente creado por la plantilla de prueba unitaria hace lo siguiente:
- Aplica el atributo a la clase .
- Aplica el atributo para definir .
- Importa el espacio de nombres, que contiene los tipos utilizados para las pruebas unitarias. El espacio de nombres se importa a través de una directiva en GlobalUsings.cs.
Cada método etiquetado con [TestMethod] en una clase de prueba etiquetada con [TestClass] se ejecuta automáticamente cuando se invoca la prueba unitaria.
Abra el terminal y vaya a la carpeta tutoriales que contiene los proyectos StringLibrary y ShowCase.
Cree un nuevo proyecto de prueba de MSTest:
dotnet new mstest -n StringLibraryTestLa plantilla de proyecto crea StringLibraryTest/Test1.cs con el código siguiente:
namespace StringLibraryTest; [TestClass] public class Test1 { [TestMethod] public void TestMethod1() { } }El código fuente creado por la plantilla de prueba unitaria hace lo siguiente:
- Aplica el atributo a la clase .
- Aplica el atributo para definir .
- Se importa el espacio de nombres, que contiene los tipos usados para las pruebas unitarias.
Cada método etiquetado con [TestMethod] en una clase de prueba etiquetada con [TestClass] se ejecuta automáticamente cuando se invoca la prueba unitaria.
Agregar una referencia de proyecto
Para que el proyecto de prueba funcione con la clase , agregue una referencia en el proyecto al proyecto.
En Explorador de soluciones, haga clic con el botón derecho en el nodo Dependencies del StringLibraryTest y seleccione Add Project Reference en el menú contextual.
En el cuadro de diálogo Administrador de referencias , seleccione el cuadro situado junto a StringLibrary.
Agregue StringLibrary como referencia de proyecto para StringLibraryTest.
Selecciona Aceptar.
En Explorador de soluciones haga clic con el botón derecho en el proyecto "StringLibraryTest" y seleccione Agregar referencia de proyecto.
Seleccione "StringLibrary".
Vaya a la carpeta StringLibraryTest y agregue la referencia del proyecto:
cd StringLibraryTest dotnet add reference ../StringLibrary/StringLibrary.csproj
Adición y ejecución de métodos de prueba unitaria
Cuando se ejecuta una prueba unitaria, cada método marcado con el atributo en una clase marcada con el atributo se ejecuta automáticamente. Un método de prueba finaliza cuando se encuentra el primer error o cuando todas las pruebas contenidas en el método se realizan correctamente.
Las pruebas más comunes llaman a los miembros de la clase . 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 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 . La aserción produce un error si la condición es . |
Assert.IsNotNull |
Verifica que un objeto no sea . Se produce un error en la aserción si el objeto es . |
También puede usar el método 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, quiere proporcionar una serie de cadenas que comienzan con un carácter en mayúsculas. Espera que el método devuelva en estos casos, por lo que puede llamar al método . Del mismo modo, desea proporcionar una serie de cadenas de texto que comienzan con algo diferente de un carácter en mayúsculas. Espera que el método devuelva en estos casos, por lo que puede llamar al método .
Dado que el método de biblioteca controla las cadenas, también quiere asegurarse de que controla correctamente una cadena vacía () y una cadena. Una cadena vacía es una que no tiene caracteres y cuya es 0. Una cadena es aquella que no se ha inicializado. Puede llamar directamente como método estático y pasar un único argumento. O bien, puede llamar a como un método de extensión en una variable asignada a .
Definirá tres métodos, cada uno de los cuales llama a un método para cada elemento de una matriz de cadenas. Llamará a una sobrecarga del método que le permita especificar un mensaje de error para que se muestre en caso de un fallo de la prueba. El mensaje identifica la cadena que provocó el error.
Para crear los métodos de prueba:
En la ventana de código Test1.cs o Test1.vb , reemplace el código por el código siguiente:
using UtilityLibraries; namespace StringLibraryTest { [TestClass] public sealed class Test1 { [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, $"Expected for '{word}': true; Actual: {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, $"Expected for '{word}': false; Actual: {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, $"Expected for '{word ?? "<null>"}': false; Actual: {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 NamespaceLa prueba de caracteres en mayúsculas en el método 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étodo 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 Test1.cs Como o Guardar archivo Test1.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 podría 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 son correctos.
En la barra de menús, seleccione PruebaEjecutar todas las pruebas. Si no se abre la ventana Explorador de pruebas, ábrala mediante PruebaExplorador 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.
ventana Explorador de pruebas con pruebas superadas
Abra StringLibraryTest/Test1.cs y reemplace todo el código por el código siguiente.
using UtilityLibraries; namespace StringLibraryTest { [TestClass] public sealed class Test1 { [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, $"Expected for '{word}': true; Actual: {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, $"Expected for '{word}': false; Actual: {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, $"Expected for '{word ?? "<null>"}': false; Actual: {result}"); } } } }La prueba de caracteres en mayúsculas en el método 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étodo incluye el alfa de letra pequeña griega (U+03B1) y la letra pequeña cirílico Ghe (U+0433).
Guarde los cambios.
Compilación y ejecución de las pruebas
En Explorador de soluciones, haga clic con el botón derecho en la solución y seleccione Build o en la paleta de comandos, seleccione .NET: Compilar.
Seleccione la ventana Pruebas , seleccione Ejecutar pruebas o, en la paleta de comandos, seleccione Probar: Ejecutar todas las pruebas.
Abra StringLibraryTest/Test1.cs y reemplace todo el código por el código siguiente:
using UtilityLibraries; namespace StringLibraryTest { [TestClass] public sealed class Test1 { [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, $"Expected for '{word}': true; Actual: {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, $"Expected for '{word}': false; Actual: {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, $"Expected for '{word ?? "<null>"}': false; Actual: {result}"); } } } }La prueba de caracteres en mayúsculas en el método 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étodo incluye el alfa de letra pequeña griega (U+03B1) y la letra pequeña cirílico Ghe (U+0433).
Guarde los cambios y ejecute las pruebas:
dotnet testLas pruebas deben superarse.
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 en el método para incluir la cadena "Error".
string[] words = { "alphabet", "Error", "zebra", "abc", "αυτοκινητοβιομηχανία", "государство", "1234", ".", ";", " " };Dim words() As String = { "alphabet", "Error", "zebra", "abc", "αυτοκινητοβιομηχανία", "государство", "1234", ".", ";", " " }
Ejecute la prueba seleccionando PruebaEjecutar 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ó.
ventana Explorador de pruebas con errores
Seleccione la prueba fallida, .
La ventana Explorador de pruebas muestra el mensaje generado por la aserción: "Assert.IsFalse ha fallado." Se esperaba para 'Error': false; actual: true. Debido al fallo, no se probaron las cadenas en la matriz después de "Error".
ventana Explorador de pruebas que muestra el error de aserción IsFalse
Ejecute las pruebas haciendo clic en el error verde situado junto a la prueba en el editor.
La salida muestra que la prueba falla y proporciona un mensaje de error para la prueba fallida: "El assert.IsFalse falló. Se esperaba para 'Error': false; real: verdadero. Debido al fallo, no se probó ninguna cadena en la matriz después de "Error".
Ejecute las pruebas:
dotnet testLa salida muestra que se produce un error en la prueba y proporciona un mensaje de error para la prueba con errores: "Assert.IsFalse failed. Se esperaba para 'Error': false; real: verdadero. Debido al error, no se probó ninguna cadena en la matriz después de "Error".
Elimine la cadena "Error" que agregó.
Vuelva a ejecutar la prueba y se superarán las pruebas.
Prueba la versión de lanzamiento de la biblioteca
Ahora que todas las pruebas se han superado al ejecutar la compilación Debug de la biblioteca, ejecute las pruebas una vez más contra la compilación Release. Varios factores, incluidas las optimizaciones del compilador, a veces pueden producir un comportamiento diferente entre las compilaciones de depuración y versión.
Para probar la compilación de versión:
En la barra de herramientas de Visual Studio, cambie la configuración de compilación de Debug a Release.
En Explorador de soluciones, haga clic con el botón derecho en el proyecto StringLibrary y seleccione Build en el menú contextual para volver a compilar la biblioteca.
Ejecuta las pruebas unitarias eligiendo PruebaEjecuta todas las pruebas en la barra de menús. Las pruebas se superan.
Ejecute las pruebas con la configuración de compilación release:
dotnet test StringLibraryTest/StringLibraryTest.csproj --configuration Release
Las pruebas se superan.
Ejecutar las pruebas con la configuración de compilación Release:
dotnet test --configuration Release
Las pruebas se superan.
Depuración de pruebas
Si usa Visual Studio como IDE, puede usar el mismo proceso que se muestra en Tutorial: Depurar una aplicación de consola de .NET 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 detiene en cualquier punto de interrupción que haya agregado al proyecto de prueba o al código de biblioteca subyacente.
Si usa Visual Studio Code como IDE, puede usar el mismo proceso que se muestra en Depurar una aplicación de consola .NET para depurar código mediante el proyecto de pruebas unitarias. En lugar de iniciar el proyecto de aplicación ShowCase, abra StringLibraryTest/Test1.cs y seleccione Depurar tests en el archivo actual, entre las líneas 7 y 8. Si no puede encontrarlo, presione Ctrl + Mayús + P para abrir la paleta de comandos y escriba Recargar ventana.
Visual Studio Code 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 las pruebas unitarias - Visual Studio
- Pruebas unitarias en .NET
- pruebas unitarias en .NET
Limpieza de recursos
GitHub elimina automáticamente codespace después de 30 días de inactividad. Si tiene previsto explorar más tutoriales en esta serie, puede dejar su Codespace disponible. Si está listo para ir al sitio .NET para descargar el .NET SDK, puede eliminar Codespace. Para eliminar Codespace, abra una ventana del explorador y vaya a Codespaces. Ves una lista de tus espacios de código en la ventana. Seleccione los tres puntos () de la entrada del espacio de código del tutorial de aprendizaje. A continuación, seleccione "Eliminar".
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 un paquete. Para obtener información sobre cómo, siga un tutorial de NuGet:
Creación y publicación de un paquete mediante la CLI de dotnet
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:
Instalación y uso de un paquete mediante la CLI de dotnet
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: