Cómo escribir en Console.Out durante la ejecución de una prueba MSTest

114

Contexto:
algunos usuarios informan problemas con una función de carga de archivos en nuestra aplicación web. Solo ocurre ocasionalmente y sin ningún patrón especial. Hemos estado tratando de resolverlo durante mucho tiempo, agregando información de depuración en cualquier lugar donde creamos que podría ayudar, rastreando los registros, etc., pero no hemos podido reproducirlo o resolverlo.

Problema:
ahora estoy tratando de reproducir esto usando MSTest y WatiN para repetir la operación que se supone falla una gran cantidad de veces (varios cientos). Solo para tener una idea de qué tan lejos en el ciclo ha llegado la prueba, quiero imprimir algo como:

Console.WriteLine(String.Format("Uploaded file, attempt {0} of {1}", i, maxUploads));

Sin embargo, esto no aparece en la ventana Salida. Ahora sé que obtendrá la salida de la consola en los resultados de la prueba (así como lo que la salida del Debug.Writelineetc), pero esto no está disponible hasta después de la prueba ha terminado. Y dado que mi prueba con cientos de repeticiones puede llevar bastante tiempo, me gustaría saber qué tan lejos ha llegado.

Pregunta:
¿Hay alguna forma de que pueda obtener la salida de la consola en la ventana Salida durante la ejecución de la prueba?

Julian
fuente
Si busca una forma de imprimir en la salida del resultado de la prueba: stackoverflow.com/a/4787047/621690
Risadinha

Respuestas:

111

La salida de la consola no aparece porque el código de backend no se está ejecutando en el contexto de la prueba.

Probablemente sea mejor usar Trace.WriteLine(In System.Diagnostics) y luego agregar un detector de seguimiento que escribe en un archivo.

Este tema de MSDN muestra una forma de hacerlo.


Según los comentarios de Marty Neal y Dave Anderson:

using System;
using System.Diagnostics;

...

Trace.Listeners.Add(new TextWriterTraceListener(Console.Out));
// or Trace.Listeners.Add(new ConsoleTraceListener());
Trace.WriteLine("Hello World");
Andras Zoltan
fuente
73
básicamente, Trace.Listeners.Add(new TextWriterTraceListener(Console.Out)); Trace.WriteLine("Hello World");
Marty Neal
7
Hmmm, estoy descubriendo que la sugerencia de @Martin Neal envía ambos Trace.WriteLine()y la Console.WriteLine()salida a la Vista de resultados de la prueba , no a la Vista de salida . (Y tenga en cuenta que en la Vista de resultados de la prueba , puede ser necesario agregar la columna Salida (Stdout) haciendo clic con el botón derecho y seleccionando Agregar / Eliminar columnas ... ). Pero, quizás todavía no veo la salida en la Salida Ver significa que me falta algo ...
DavidRR
3
Trace.Listeners.Add(new ConsoleTraceListener());es suficiente y luego muestra la salida de Debug en la ventana de salida.
Dave Anderson
3
Estaba luchando por encontrar la salida en VS2017 ... Ventana TestExplorer -> Haga clic en una prueba individual -> Si la prueba tuvo salida, en la ventana de detalles debajo del tiempo transcurrido hay la palabra "salida", que es un enlace a una nueva ventana.
Mike Walsh
2
Si está usando Xunit, simplemente ingrese ITestOutputHelper a través del ctor y llame a WriteLine en él. Me tomó un tiempo descubrir cómo escribir durante las pruebas de integración, espero que esto ayude a alguien.
Alexander Høst
69

Utilice el Debug.WriteLine. Esto mostrará su mensaje en la Outputventana inmediatamente. La única restricción es que debe ejecutar su prueba en Debugmodo.

[TestMethod]
public void TestMethod1()
{
    Debug.WriteLine("Time {0}", DateTime.Now);
    System.Threading.Thread.Sleep(30000);
    Debug.WriteLine("Time {0}", DateTime.Now);
}

Salida

ingrese la descripción de la imagen aquí

caliasos
fuente
8
requiereusing System.Diagnostics;
kmote
5
No use DateTime.Now. Es mejor usar Cronómetro ( msdn.microsoft.com/en-us/library/… )
suizo
1
No pude hacer que esto funcionara. Cuando ejecuto la prueba, la ventana de salida cambia inmediatamente a Build y no se envía nada a Debug. ¿Tus pensamientos?
InteXX
5
@InteXX asegúrese de hacer clic en "Depurar la prueba", no en "Ejecutar la prueba". funcionó para mí
John Henckel
@JohnHenckel: Te tengo. Gracias. Lo haré. De hecho, Schaliasos dice exactamente eso en su respuesta; No estoy seguro de cómo me lo perdí.
InteXX
13

Encontré una solución propia. Sé que la respuesta de Andras es probablemente la más consistente con MSTEST, pero no tenía ganas de refactorizar mi código.

[TestMethod]
public void OneIsOne()
{
    using (ConsoleRedirector cr = new ConsoleRedirector())
    {
        Assert.IsFalse(cr.ToString().Contains("New text"));
        /* call some method that writes "New text" to stdout */
        Assert.IsTrue(cr.ToString().Contains("New text"));
    }
}

El desechable ConsoleRedirectorse define como:

internal class ConsoleRedirector : IDisposable
{
    private StringWriter _consoleOutput = new StringWriter();
    private TextWriter _originalConsoleOutput;
    public ConsoleRedirector()
    {
        this._originalConsoleOutput = Console.Out;
        Console.SetOut(_consoleOutput);
    }
    public void Dispose()
    {
        Console.SetOut(_originalConsoleOutput);
        Console.Write(this.ToString());
        this._consoleOutput.Dispose();
    }
    public override string ToString()
    {
        return this._consoleOutput.ToString();
    }
}
SimplyKnownAsG
fuente
3

Tuve el mismo problema y estaba "ejecutando" las pruebas. Si, en cambio, "depuro" las pruebas, la salida de depuración se muestra bien, como todos los demás, Trace y Console. Sin embargo, no sé cómo ver el resultado si "Ejecutas" las pruebas.

Gökhan Kurt
fuente
Puedo obtener algo para mostrar el uso System.Diagnostics.Debug.WriteLinemientras depuro las pruebas, pero ¿cómo se pone Console.WriteLinea trabajar? Esto no termina en la salida normal (actualizada en vivo) para mí.
OR Mapper
¿Encontraste alguna forma de ver los resultados mientras realizaste pruebas?
hima
0

Es mejor que configure una única prueba y cree una prueba de rendimiento a partir de esta prueba. De esta forma, puede controlar el progreso utilizando el conjunto de herramientas predeterminado.

Riezebosch
fuente
"De esta manera, puede controlar el progreso utilizando el conjunto de herramientas predeterminado". - ¿cómo? El problema que veo es exactamente que una vez que se ejecuta una prueba, es una caja negra y solo puedo ver el resultado (que estoy escribiendo gradualmente mientras se ejecuta la prueba) después de que la prueba ha terminado de ejecutarse, en la ventana Salida .
OR Mapper