Mejore sus aptitudes para realizar pruebas

Completado

Poder escribir pruebas y aplicar un patrón de refactorización rojo y verde son un buen comienzo. Un desafío al que se enfrentará es la legibilidad de las pruebas. Puede que sea difícil reconocer por qué existen ciertas aserciones cuando se observa el código de un compañero o un fragmento de código que escribió hace seis meses.

Otro aspecto difícil de las pruebas es que desea realizar pruebas de forma aislada. Probablemente no quiera que una prueba unitaria realice una llamada de red o escriba archivos en un disco o una base de datos.

En esta unidad, trataremos los temas siguientes para abordar estos desafíos:

  • Aserciones de Fluent: use instrucciones de aserción que sean más legibles para el ser humano.
  • Pruebas controladas por datos: ejecute la misma prueba repetidamente con parámetros diferentes.
  • Simulación: aísle la prueba simulando partes del código que no afectan al resultado de la prueba.

Hay muchas herramientas que ayudan a que las pruebas sean fáciles de reconocer, evitar la repetición y obtener cobertura para cualquier arquitectura. Repasemos algunas de las más populares y sus ventajas.

Aserciones de Fluent

Las aserciones de Fluent son un conjunto popular de métodos de extensión proporcionados por la comunidad de .NET que pueden ayudarle a identificar claramente los métodos de aserción. Usa lenguaje legible para facilitar la escritura y lectura de pruebas.

using FluentAssertions;
...
[TestMethod]
public void AddTestFluentassertion()
{
    var calculator = new Calculator();
    var actual = calculator.Add(1, 1);

    // Non-fluent asserts:
    // Assert.AreEqual(actual, 2);
    // Assert.AreNotEqual(actual, 1);

    // Same asserts as what is commented out above, but using Fluent Assertions
    actual.Should().Be(2).And.NotBe(1);
}

En el ejemplo siguiente se muestra el método AddTest en Visual Studio. Una sugerencia de mantener el puntero sobre la aserción describe la restricción And de Aserciones de Fluent con un tipo genérico de int. La descripción indica que el valor de número entero es exactamente el mismo que el valor esperado.

Screenshot of the AddTest method with a hover tip on the assertion.

Pruebas controladas por datos

Puede usar pruebas controladas por datos para ejecutar el mismo método de prueba muchas veces con varios parámetros. Esta técnica también se denomina prueba parametrizada. Permite evitar la repetición en el código al mismo tiempo que se comprueba la misma función con un conjunto completo de entradas de datos diferentes.

Puede escribir datos en línea, como se muestra en el ejemplo siguiente, o incluso conectarse a una base de datos para obtener la entrada.

[DataTestMethod]
[DataRow(1, 1, 2)]
[DataRow(2, 2, 4)]
[DataRow(3, 3, 6)]
[DataRow(0, 0, 1)] // The test run with this row fails
public void AddDataTests(int x, int y, int expected)
{
    var calculator = new Calculator();
    var actual = calculator.Add(x, y);
    Assert.AreEqual(expected, actual);
}

En el ejemplo siguiente, el Explorador de pruebas y CalculatorTests.cs están en paralelo. El método DataTest está fallando en el editor. El Explorador de pruebas muestra cuatro resultados para cada fila de datos de la prueba y muestra el mensaje de error de la fila de datos final.

Screenshot of Test Explorer and CalculatorTests.cs, with a failing method in the editor.

Simulación

A veces, la arquitectura del código no es lo suficientemente modular como para realizar pruebas unitarias eficaces. Para aislar las partes del código que está probando sin volver a escribirlo, es posible que quiera usar un marco de simulación.

La simulación le ayuda a aislar el código que está intentando probar mediante la creación de códigos auxiliares o correcciones de compatibilidad (shim) de las dependencias de ese código. Los códigos auxiliares y correcciones de compatibilidad (shim) permiten que el código realice las llamadas necesarias a las dependencias sin probarlas realmente. Esta capacidad le ayuda a centrar una prueba unitaria en el comportamiento que desea probar.

Hay disponibles muchos marcos de simulación populares, incluidos MOQ y Microsoft Fakes. Puede obtener un tutorial completo para Microsoft Fakes, pero vamos a explorar una breve introducción.

Nota:

Microsoft Fakes solo está disponible con Visual Studio Enterprise.

  1. En Explorador de soluciones, vaya al proyecto de prueba que desea aislar.

  2. Haga clic con el botón derecho en el proyecto en el nodo del proyecto que desea simular y, a continuación, seleccione Agregar Fakes ensamblado.

    En el ejemplo siguiente se usa el nodo LearnMyCalculatorApp en el proyecto LearnMyCalculatorApp.Tests.

    Screenshot of Solution Explorer that shows a node selected for adding a Fakes assembly.

  3. Agregue las instrucciones using al archivo de prueba en el que desea usar código auxiliar y correcciones de compatibilidad (shim).

    using LearnMyCalculatorApp.Fakes;
    using Microsoft.QualityTools.Testing.Fakes;
    
  4. Ahora puede crear código auxiliar o correcciones de compatibilidad (shim) para diferentes partes del código. En el ejemplo siguiente, no quiere llamar al método Divide de la calculadora. Solo quiere pretender por ahora que siempre devuelve 1 para que pueda centrarse en probar otras partes del código. La corrección de compatibilidad (shim) permite hacerlo.

    [TestMethod]
    public void DivideByZeroWithFakesShim()
    {
        using (ShimsContext.Create())
        {
            // Define what the Divide shim should return
            ShimCalculator.AllInstances.DivideInt32Int32 = (x, y, z) => { return 1; };
    
            var calculator = new Calculator();
    
            // This really calls the DivideInt32Int32
            // defined above to always return 1
            // instead of actually calling Divide
            var actual = calculator.Divide(1, 0); 
            Assert.AreEqual(1, actual); // This assertion will pass because the preceding Divide method is a shim that will return 1
        }
    }
    
    

La escritura de pruebas buenas puede tardar un tiempo en aprender, al igual que escribir código correcto. Si desea obtener más información sobre las pruebas de escuelas de pensamiento, consulte Introducción a los conceptos de pruebas de software.

1.

Diga que tiene un método que desea probar con varias entradas. ¿Qué herramienta de prueba puede ayudarle?

2.

¿Qué código auxiliar y correcciones de compatibilidad (shim) se encuentran en la herramienta de prueba?