¿Cómo puedo escribir la salida de una prueba unitaria?

113

Cualquier llamada en mi unidad prueba a cualquiera Debug.Write(line)o Console.Write(Line)simplemente se salta durante la depuración y la salida nunca se imprime. Las llamadas a estas funciones desde dentro de las clases que estoy usando funcionan bien.

Entiendo que las pruebas unitarias están destinadas a ser automatizadas, pero aún me gustaría poder enviar mensajes de una prueba unitaria.

Chris
fuente

Respuestas:

128

Intente usar TestContext.WriteLine()qué texto de salida en los resultados de la prueba.

Ejemplo:

    [TestClass]
    public class UnitTest1
    {
        private TestContext testContextInstance;

        /// <summary>
        ///  Gets or sets the test context which provides
        ///  information about and functionality for the current test run.
        ///</summary>
        public TestContext TestContext
        {
            get { return testContextInstance; }
            set { testContextInstance = value; }
        }

        [TestMethod]
        public void TestMethod1()
        {
            TestContext.WriteLine("Message...");
        }
    }

La "magia" se describe en MSDN como "El marco de prueba establece automáticamente la propiedad, que luego puede usar en pruebas unitarias".

frenético
fuente
7
Descubrí (con VS2013) que esto solo imprime algo si la prueba se ejecuta en modo de depuración.
fusi
3
Parece que el uso de TestContext requiere VS2015 Enterprise (o versiones premium de ediciones anteriores), según esta documentación
Patrick Steadman
Me doy cuenta de que si su cuerda tiene llaves, el método explota. Entonces "_testContext.WriteLine (" hola ");" funciona pero "_testContext.WriteLine (" he {ll} o ");" falla con "System.FormatException: la cadena de entrada no tenía el formato correcto".
Mike K
1
El método WriteLine en TestContext toma los mismos parámetros que toma Console.WriteWriteLine. Eso significa que la cadena es una cadena de formato (documentada en docs.microsoft.com/en-us/dotnet/standard/base-types/… ). Para usar un {literal en una cadena, debe doblarlo. Para imprimir su cadena use WriteLine ("he {{ll}} o");
Walter
1
esto fue interesante ... aunque todavía no sé por qué no agregaron esta y características similares a una clase base o interfaz que podríamos usar desde el marco para evitar confusiones.
Niklas
149

También estaba intentando que Debug o Trace o Console o TestContext funcionaran en las pruebas unitarias.

Ninguno de estos métodos parece funcionar o mostrar resultados en la ventana de resultados:

    Trace.WriteLine("test trace");
    Debug.WriteLine("test debug");
    TestContext.WriteLine("test context");
    Console.WriteLine("test console");

Visual Studio 2012 y posteriores

(de los comentarios) En Visual Studio 2012, no hay icono. En cambio, hay un enlace en los resultados de la prueba llamado Salida . Si hace clic en el enlace, verá todos los archivos WriteLine.

Antes de Visual Studio 2012

Luego noté en mi ventana Resultados de la prueba , después de ejecutar la prueba, junto al pequeño círculo verde de éxito , hay otro ícono. Hice doble clic en él. Fueron los resultados de mi prueba e incluyeron todos los tipos de líneas de escritura anteriores.

Yogur el sabio
fuente
44
En Visual Studio 2012, no hay ningún icono. En cambio, hay un enlace en los resultados de la prueba llamado "Salida". Si hace clic en el enlace, verá todas las líneas de escritura.
epotter
16
Dios, ese enlace de "Salida" es intrínsecamente difícil de encontrar. Si alguien tiene dificultades para encontrarlo, está en la sección inferior del Explorador de texto. Cuando se selecciona una prueba, le muestra el resultado con "Tiempo transcurrido: xxx". Debajo está el enlace "Salida".
Kevin
@kevin, ¿en qué versión de VS viste eso? (Supongo que te refieres a "Explorador de pruebas" en lugar de "Explorador de texto". No veo un enlace de salida en VS2013 express.
Mike C
1
Si alguien se pregunta (como yo) cuál de estos aparece en un archivo TRX (salida de resultados de prueba), entonces es todo lo anterior excepto "Debug.WriteLine".
Badgerspot
4
En Visual Studio 2017, sigue siendo el enlace 'Salida'.
HankCa
66

En Visual Studio 2017, puede ver el resultado del explorador de prueba.

1) En su método de prueba, Console.WriteLine ("algo");

2) Ejecute la prueba.

3) En la ventana Explorador de pruebas, haga clic en Método de prueba aprobado.

4) Y haga clic en el enlace "Salida".

ingrese la descripción de la imagen aquí

Y haga clic en "Salida", puede ver el resultado de Console.Writeline (). ingrese la descripción de la imagen aquí

monad.gon
fuente
1
Excelente. Visual Studio / C # no es mi norma para el desarrollo, ¡esto es solo lo que necesito! Gracias por publicar esto.
Matt32
10
Estoy usando la versión 2017 15.5.6 Bit O no veo el enlace de salida.
Mike IT
1
¿Depende de qué marco de prueba se esté usando? Estoy usando xUnit 2.4 en un proyecto de prueba .NET 4.6 y no aparece el panel "Salida estándar". La salida de Console.WriteLinetampoco está visible en el panel Salida en "Pruebas".
Qwertie
Para xUnit, la respuesta de jonzim funcionó para mí, incluso en un hilo diferente generado por la prueba.
Qwertie
1
Para aquellos que no vieron el enlace "salida". 1) Debe seleccionar un método de prueba . 2) deje que la ventana del Explorador de pruebas llene la ventana de VS verticalmente; de ​​lo contrario, el enlace se ocultó y la barra de desplazamiento es demasiado pequeña para ser notada o utilizada.
Meow Cat 2012
18

Depende de su corredor de prueba ... por ejemplo, estoy usando xUnit , así que en caso de que eso sea lo que está usando, siga estas instrucciones:

https://xunit.github.io/docs/capturing-output.html

Este método agrupa su salida con cada prueba unitaria específica.

using Xunit;
using Xunit.Abstractions;

public class MyTestClass
{
    private readonly ITestOutputHelper output;

    public MyTestClass(ITestOutputHelper output)
    {
        this.output = output;
    }

    [Fact]
    public void MyTest()
    {
        var temp = "my class!";
        output.WriteLine("This is output from {0}", temp);
    }
}

Hay otro método enumerado en el enlace que proporcioné para escribir en su ventana de Salida, pero prefiero el anterior.

Jonzim
fuente
4

Creo que todavía es real.

Puede utilizar este paquete NuGet : Bitoxygen.Testing.Pane

Llame al método WriteLine personalizado desde esta biblioteca. Crea un panel de prueba dentro de la ventana de salida y coloca los mensajes allí siempre (durante cada prueba, se ejecuta independientemente de los indicadores DEBUG y TRACE).

Para facilitar el rastreo, puedo recomendar crear una clase base:

[TestClass]
public abstract class BaseTest
{
    #region Properties
    public TestContext TestContext { get; set; }

    public string Class
    {
        get { return this.TestContext.FullyQualifiedTestClassName; }
    }
    public string Method
    {
        get { return this.TestContext.TestName; }
    }
    #endregion

    #region Methods
    protected virtual void Trace(string message)
    {
        System.Diagnostics.Trace.WriteLine(message);

        Output.Testing.Trace.WriteLine(message);
    }
    #endregion
}

[TestClass]
public class SomeTest : BaseTest
{
    [TestMethod]
    public void SomeTest1()
    {
        this.Trace(string.Format("Yeah: {0} and {1}", this.Class, this.Method));
    }
}
Máxima
fuente
1
La magia está en: Output.Testing.Trace.WriteLine (mensaje); con BitOxygen.
Bimal Poudel
No funciona con la versión actual de Visual Studio, aparece un errorCould not load file or assembly 'Microsoft.VisualStudio.Shell.12.0,
Consola
@Console Sí, necesita algo de soporte, pero no estoy seguro si la comunidad es interesante de esta manera para generar. xUnit tiene OutputHandler y VS puede mostrar su resultado.
Maxim
1

Intente usar:

Console.WriteLine()

La llamada a Debug.WriteLinesolo se realizará durante cuando DEBUG esté definido.

Otras sugerencias son para usar: Trace.WriteLinetambién, pero no lo he probado.

También hay una opción (no estoy seguro de si Visual Studio 2008 la tiene), pero aún puede usarla Debug.WriteLinecuando ejecuta la prueba con la Test With Debuggeropción en el IDE.

Niño Voodoo
fuente
1

Resuelto con el siguiente ejemplo:

public void CheckConsoleOutput()
{
    Console.WriteLine("Hello, World!");
    Trace.WriteLine("Trace Trace the World");
    Debug.WriteLine("Debug Debug World");
    Assert.IsTrue(true);
}

Después de ejecutar esta prueba, en 'Prueba aprobada', existe la opción de ver la salida, que abrirá la ventana de salida.

Miguel
fuente
1

De hecho, depende del corredor de pruebas, como mencionó @jonzim. Para NUnit 3 tuve que usar NUnit.Framework.TestContext.Progress.WriteLine()para obtener una salida en ejecución en la ventana de Salida de Visual Studio 2017.

NUnit describe cómo: aquí

A mi entender, esto gira en torno a la paralelización adicional de la ejecución de la prueba que han recibido los corredores de prueba.

Pebermynte Lars
fuente
0

No obtengo ningún resultado cuando mi configuración de Prueba / Configuración de prueba / Arquitectura de procesador predeterminada y los ensamblados a los que hace referencia mi proyecto de prueba no son los mismos. De lo contrario, Trace.Writeline () funciona bien.

Arthur Greef
fuente
0

Console.WriteLine no funcionará. Solo Debug.WriteLine () o Trace.WriteLine () funcionarán, en modo de depuración.

Hago lo siguiente: incluir el uso de System.Diagnostics en el módulo de prueba. Luego, use Debug.WriteLine para mi salida, haga clic derecho en la prueba , elija Depurar pruebas seleccionadas . La salida de resultados ahora aparecerá en la ventana de Salida a continuación. Yo uso Visual Studio 2017 vs 15.8.1, con el marco de prueba unitario predeterminado que proporciona VS.

Golosinas
fuente
0

¿Estás seguro de que estás ejecutando tus pruebas unitarias en Debug? Debug.WriteLine no se llamará en versiones de lanzamiento.

Dos opciones para probar son:

  • Trace.WriteLine (), que está integrado en versiones de lanzamiento y depuración

  • Anule la definición de DEBUG en su configuración de compilación para la prueba unitaria

Jason Williams
fuente
0

Estoy usando xUnit, así que esto es lo que uso:

Debugger.Log(0, "1", input);

PD: también puedes usar Debugger.Break();, para que puedas ver tu inicio de sesión out.

Ivandro IG Jao
fuente
¿Qué es este " out"?
Peter Mortensen
0

Una variante diferente de la causa / solución:

Mi problema era que no obtenía un resultado porque estaba escribiendo el conjunto de resultados de una llamada LINQ asincrónica a la consola en un bucle en un contexto asincrónico:

var p = _context.Payment.Where(pp => pp.applicationNumber.Trim() == "12345");

p.ForEachAsync(payment => Console.WriteLine(payment.Amount));

Entonces, la prueba no estaba escribiendo en la consola antes de que el tiempo de ejecución limpiara el objeto de la consola (cuando se ejecutaba solo una prueba).

La solución fue convertir el conjunto de resultados a una lista primero, para poder usar la versión no asincrónica de forEach ():

var p = _context.Payment.Where(pp => pp.applicationNumber.Trim() == "12345").ToList();

p.ForEachAsync(payment =>Console.WriteLine(payment.Amount));
Richard Strickland
fuente
0

En VS 2019

  1. en la barra de menú principal de VS, haga clic en: View->Test Explorer
  2. Haga clic con el botón derecho en su método de prueba en el Explorador de pruebas -> Depurar
  3. Haga clic en el additional outputenlace como se ve en la captura de pantalla a continuación.

ingrese la descripción de la imagen aquí

Puedes usar:

  • Debug.WriteLine
  • Console.WriteLine
  • TestContext.WriteLine

todo se registrará en la ventana de salida adicional.

Leyendas
fuente
-1

Trace.WriteLinedebería funcionar siempre que seleccione la salida correcta (el menú desplegable etiquetado con "Mostrar salida de" que se encuentra en la ventana Salida ).

Peter Mortensen
fuente