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

Contexto:
Tenemos algunos usuarios que 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 podamos pensar que podría ayudar, rastreando los registros, etc., pero no hemos podido reproducirlo o resolverlo.

Problema:
Ahora trato de reproducir esto usando MSTest y WatiN para repetir la operación que se supone que falla varias veces (varios cientos). Solo para tener una idea de cuán lejos ha llegado la prueba, deseo imprimir algo como:

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

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

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

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

Probablemente sea mejor que use Trace.WriteLine (en System.Diagnostics) y luego agregue un detector de rastreo que escriba en un archivo.

Este tema de MSDN muestra una forma de hacerlo.

Use Debug.WriteLine . Esto mostrará su mensaje en la ventana de Output inmediato. La única restricción es que debe ejecutar su prueba en modo de Debug .

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

Salida

enter image description here

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 ConsoleRedirector desechable se 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(); } } 

Tuve el mismo problema y estaba “Ejecutando” las pruebas. Si, en cambio, “Depuro” las pruebas, el resultado de la depuración se muestra muy bien, como todos los demás Trace y Console. Aunque no sé cómo ver la salida si “Ejecutas” las pruebas.

Es mejor configurar una sola prueba y crear una prueba de rendimiento de esta prueba. De esta forma puede monitorear el progreso utilizando el conjunto de herramientas predeterminado.