Creación de una prueba

Completado

Al escribir pruebas, debe tener en cuenta la organización interna de la prueba, cómo ejecutar la prueba, cómo usar buenos patrones de escritura de pruebas y cómo definir en qué condiciones la prueba se realiza correctamente.

En esta unidad, se tratarán algunos aspectos básicos.

Pruebas unitarias

Una prueba unitaria es el tipo más básico de prueba, por lo que es un buen lugar para empezar a aprender. Una prueba unitaria prueba específicamente solo un método o la unidad de código más pequeña que se puede probar.

Los métodos de prueba son muy parecidos a los métodos normales. Los métodos de prueba pueden aceptar parámetros y se organizan en clases de prueba que forman parte de un proyecto de prueba. También puede agrupar clases de prueba por espacio de nombres, al igual que otras clases.

El código siguiente es un ejemplo de una clase de prueba simple. Primero importa el marco de pruebas unitarias. En este caso, ese es el marco de pruebas de Microsoft integrado Microsoft.VisualStudio.TestTools.UnitTesting, también conocido como MSTest. La segunda directiva using hace referencia a la aplicación calculadora que se está probando, LearnMyCalculatorApp. A continuación, se declara la clase de prueba y, dentro de eso, se declara un método de prueba.

using Microsoft.VisualStudio.TestTools.UnitTesting;
using LearnMyCalculatorApp;

[TestClass]
public class CalculatorTests
{
    [TestMethod]
    public void CalculatorNullTest()
    {
        var calculator = new Calculator();
        Assert.IsNotNull(calculator);
    }
}

Esta clase de prueba forma parte de un proyecto de prueba que hace referencia a la aplicación que debe probarse. En este caso, es el proyecto LearnMyCalculatorApp.

Screenshot of a test project and a calculator project in Visual Studio Solution Explorer.

Las pruebas hacen referencia y llaman al código de producto (es decir, el código que no es de prueba). Por ejemplo, supongamos que necesita probar un método Add en la clase Calculator.

public class Calculator
{
    public int Add(int x, int y)
    {
        return x + y;
    }
}

Una prueba para el método Add podría tener un aspecto parecido al código siguiente.

[TestMethod]
public void AddTest()
{
    // Arrange
    var calculator = new Calculator();

    // Act
    var actual = calculator.Add(1, 1);

    // Assert
    Assert.AreEqual(2, actual);
}

Agregar pruebas al código de producción

Puede usar dos enfoques para agregar pruebas al código de producción:

  • La manera más fácil de agregar un proyecto de prueba para probar un método específico en el código es hacer clic con el botón derecho en ese método y seleccionar Crear pruebas unitarias. Esta opción para la generación automática de métodos de prueba está disponible para la mayoría de los proyectos de .NET.

    Screenshot in Visual Studio that shows a right-click menu inside an editor, with the Calculator class open and the Create Unit Tests command selected.

  • Puede crear manualmente un proyecto de prueba, agregar pruebas y agregar la referencia de código de producto. Puede hacerlo en la línea de comandos o con la herramienta Visual Studio, como se describe en la unidad siguiente.

Las tres A

Las tres A de los comentarios proporcionan directrices básicas para la estructura de pruebas:

  • Organizar (Arrange) es donde se declaran las variables que podría necesitar la prueba. En este ejemplo, debemos declarar un objeto calculator para llamar a su método Add.
  • Actuar es donde se llama al código que quiere probar. En este paso, puede insertar parámetros y realizar el ejercicio del código.
  • Aserción es donde se comprueba si se espera el resultado de la acción. Puede agregar varias aserciones a cualquier prueba. Si se produce un error en una aserción, se producirá un error en la prueba.

Ejecución de una prueba

Ahora que comprende la configuración básica de una prueba y de un proyecto de prueba, el paso siguiente es ejecutar las pruebas. Visual Studio proporciona algunas maneras útiles de ejecutar pruebas desde cualquier contexto en el que trabaje.

  • Haga clic con el botón derecho: puede hacer clic con el botón derecho para ejecutar pruebas desde el menú contextual. Este comando ejecutará pruebas según el ámbito en el que se encuentra el cursor. Por ejemplo, si hace clic con el botón derecho en una clase de prueba y selecciona Ejecutar pruebas, el comando ejecutará todas las pruebas de esa clase. Si hace clic con el botón derecho en un espacio de nombres de prueba, el comando ejecutará todas las pruebas de ese espacio de nombres.

    Screenshot of Visual Studio with the right-click menu open in an editor inside a test method.

  • Ctrl+R, T: este método abreviado de teclado también ejecutará las pruebas que se encuentran actualmente en el contexto del cursor.

  • Glifo de prueba de CodeLens: opcionalmente, el editor puede mostrar un glifo de prueba pequeño junto a los métodos de prueba. Para habilitar este glifo, cambie a CodeLens en Herramientas>Opciones. Esta interfaz de usuario útil proporciona una manera de ejecutar las pruebas y muestra el resultado de la prueba desde dentro del editor de código.

    Screenshot of a CodeLens test glyph opened from the top of the method signature in Visual Studio.

  • Explorador de pruebas: cuando tiene varias pruebas, puede usar el Explorador de pruebas para ejecutar, ver y organizar el conjunto de pruebas. Más adelante se profundizará en el Explorador de pruebas.

    Screenshot of the Test Explorer window in Visual Studio, with five passing tests and one failing test.

Rojo, verde, refactorizar

Se recomienda el patrón rojo, verde, refactorizar para las pruebas:

  • Rojo: escriba una prueba "roja" con errores.
  • Verde: agregue el código de producto necesario para que la prueba pase o se vuelva "verde".
  • Refactorizar: use el nuevo conocimiento de código, ahora que tiene la funcionalidad correcta.

Al escribir una prueba, es bueno ver que se produzca un error al menos una vez para que sepa que se puede producir un error. Un problema común es que una prueba abarca un escenario determinado, solo para encontrar un error de producción. No es divertido darse cuenta de que su prueba no estaba haciendo las llamadas correctas o nunca afirmó correctamente el resultado esperado.

Este patrón proporciona una guía sencilla a medida que entra en un flujo de programación. Si le interesa obtener más información sobre las distintas escuelas de análisis de ideas, consulte Introducción a los conceptos de pruebas de software.

Assert (instrucciones)

Las instrucciones Assert son las que determinan si la prueba se supera o produce un error. Los distintos tipos de aserciones también ayudan a identificar claramente qué parte del comportamiento del código está provocando un error en la prueba. Las pruebas pueden producir un error por motivos además de no cumplir los criterios de aserción, como excepciones no detectadas o alcanzar los límites de tiempo de espera de prueba.

Ampliaremos AddTest para incluir algunas de las aserciones más comunes. La sintaxis puede diferir ligeramente entre los marcos de prueba, pero las aserciones más comunes comprueban si son null, declaran una igualdad, una condición o comprueban el contenido de una cadena.

[TestMethod]
public void AddTest()
{
    // Arrange
    var calculator = new Calculator();

    // Act
    var actual = calculator.Add(1, 1);
    var subtractActual = calculator.Subtract(actual, 1) == 1;

    // Assert
    Assert.IsNotNull(calculator);
    Assert.AreEqual(2, actual);
    Assert.IsTrue(subtractActual);
    StringAssert.Contains(actual.ToString(), "2");
}
  • Assert.IsNotNull: comprueba si el objeto especificado es NULL y produce una excepción si es NULL.
  • Assert.AreEqual: comprueba si los dos objetos o valores de entrada son iguales.
  • Assert.IsTrue: comprueba si la condición de entrada es true. También está IsFalse para afirmar que una condición es falsa.
  • StringAssert.Contains: comprueba si la cadena contiene una substring específica. Hay muchas otras aserciones de cadena. Por ejemplo, Matches comprueba si hay una expresión regular que coincida. StartsWith comprueba si la cadena comienza con una substring especificada.

Si se produce un error en una de estas aserciones, ayuda a realizar un seguimiento de qué comportamiento es inesperado en el código. Por ejemplo, si todo funcionara correctamente con la calculadora excepto para un método ToString sobrecargado, solo StringAssert produciría un error. Se podría ver inmediatamente qué comportamiento específico tiene errores.

Screenshot in Visual Studio of the AddTest method, with Test Explorer open and showing a failure message.

Puede leer más sobre las distintas clases Assert y explorar la API en Usar las clases Assert para las pruebas unitarias.

1.

¿Qué necesita para agregar una referencia del proyecto de prueba al código de producto?

2.

¿Cuál de las siguientes provoca un error en una prueba?