Compartir a través de


Tutorial: Prueba de una biblioteca de clases de .NET con Visual Studio Code

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

Creación de un proyecto de prueba unitaria

Las pruebas unitarias proporcionan pruebas automatizadas de software durante el desarrollo y la publicación. El marco de pruebas que se usa en este tutorial es MSTest. MSTest es uno de los tres marcos de pruebas entre los que puede elegir. Los demás son xUnit y nUnit.

  1. Inicie Visual Studio Code.

  2. Abra la solución ClassLibraryProjects que creó en Crear una biblioteca de clases de .NET usando Visual Studio Code.

  3. En explorador de soluciones, seleccione Nuevo proyectoo, en la paleta de comandos, seleccione .NET: Nuevo proyecto.

  4. Seleccione proyecto de prueba de MSTest, asígneles el nombre "StringLibraryTest", seleccione el directorio predeterminado y seleccione Crear proyecto.

    La plantilla de proyecto crea un archivo UnitTest1.cs con el código siguiente:

    namespace StringLibraryTest;
    
    [TestClass]
    public class UnitTest1
    {
        [TestMethod]
        public void TestMethod1()
        {
        }
    }
    

    El código fuente creado por la plantilla de prueba unitaria hace lo siguiente:

    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 StringLibrary, agregue una referencia en el proyecto de StringLibraryTest al proyecto de StringLibrary.

  1. En el Explorador de soluciones haga clic con el botón derecho en el proyecto "StringLibraryTest" y seleccione Agregar referencia de proyecto.

  2. Seleccione "StringLibrary".

Adición y ejecución de métodos de prueba unitaria

Cuando Visual Studio invoca 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 Comprueba 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 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, quiere proporcionar varias cadenas que comienzan 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) y una cadena de null. Una cadena vacía es una que no tiene caracteres y cuya Length es 0. Una cadena null es una 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:

  1. Abra StringLibraryTest/UnitTest1.cs y reemplace todo el código por el código siguiente.

    using Microsoft.VisualStudio.TestTools.UnitTesting;
    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));
                }
            }
        }
    }
    

    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étodo TestDoesNotStartWithUpper incluye el alfa de letra pequeña griega (U+03B1) y la letra pequeña cirílico Ghe (U+0433).

  2. Guarde los cambios.

Compilación y ejecución de pruebas

  1. En el Explorador de soluciones, haga clic con el botón derecho en la solución y seleccione Compilar o en la paleta de comandos, seleccione .NET: Build.

  2. Seleccione la ventana Pruebas, seleccione Ejecutar pruebas o, en la paleta de comandos, seleccione Prueba: Ejecutar todas las pruebas.

    Explorador de pruebas de Visual Studio Code del Explorador de pruebas de Visual Studio Code

Gestionar fallos de prueba

Si está realizando el desarrollo controlado por pruebas (TDD), escribe las pruebas primero y fallan la primera vez que las ejecuta. A continuación, agregue código a la aplicación que haga que la prueba se realice correctamente. En este tutorial, creaste la prueba después de escribir el código de la aplicación que valida, por lo que no has visto fallar la prueba. 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.

  1. Modifique la matriz words en el método TestDoesNotStartWithUpper para incluir la cadena "Error".

    string[] words = { "alphabet", "Error", "zebra", "abc", "αυτοκινητοβιομηχανία", "государство",
                       "1234", ".", ";", " " };
    
  2. 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: "Assert.IsFalse failed. Se esperaba para "Error": false; real: True". Debido al error, no se probaron todas las cadenas de la matriz después de "Error".

    Prueba fallida de Visual Studio Code

  3. Quite la cadena "Error" que agregó en el paso.

  4. Vuelva a ejecutar la prueba y se superarán las pruebas.

Probar 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, como las optimizaciones del compilador, a veces pueden producir un comportamiento diferente entre las compilaciones de depuración y versión.

  1. Ejecute las pruebas con la configuración de compilación Release:

    dotnet test StringLibraryTest/StringLibraryTest.csproj --configuration Release
    

    Las pruebas se superan.

Depuración de pruebas

Si usa Visual Studio Code como IDE, puede usar el mismo proceso que se muestra en Depurar una aplicación de consola de .NET mediante Visual Studio Code para depurar código mediante el proyecto de prueba unitaria. En lugar de iniciar el proyecto de aplicación Showcase, abra StringLibraryTest/UnitTest1.cs y seleccione Depurar pruebas de archivo actual entre las líneas 7 y 8. Si no puede encontrarlo, pulse 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

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 integrar 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:

El Kit de desarrollo de C# de la extensión de Visual Studio Code proporciona más herramientas para desarrollar aplicaciones y bibliotecas de C#: