2011-02-03 12 views
92

Contexto:
Tenemos 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 podamos pensar que podría ayudar, rastreando los registros, etc., pero no hemos podido reproducirlo o resolverlo.Cómo escribir a Console.Out durante la ejecución de una prueba MSTest

Problema:
Ahora estoy tratando de reproducir esto mediante el uso MSTest y WatiN repetir la operación que se supone que falle un gran número de veces (varios cientos). Sólo para tener una idea de hasta qué punto en el bucle de la prueba se ha hecho, quiero imprimir algo como:

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

Esto sin embargo no aparece en la ventana de resultados. Ahora sé que obtendrás la salida de la consola en los resultados de la prueba (así como lo que sacaste de Debug.Writeline, etc.), pero esto no estará disponible hasta después de que haya finalizado la prueba. 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 conseguir la salida de la consola en la ventana de salida durante la ejecución de pruebas?

Respuesta

92

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.

This topic from MSDN muestra una forma de hacerlo.

+61

lo que, básicamente, 'Trace.Listeners.Add (nueva TextWriterTraceListener (Console.Out));' ' Trace.WriteLine ("Hello World");' –

+0

Niza, me gusta. Para evitar esto, he usado log4net con un registrador de archivos. Tendrá que cambiar sus llamadas de Console.WriteLine a Logger.Info (...) – joshgo

+7

Hmmm, estoy descubriendo que la sugerencia de @Martin Neal envía 'Trace.WriteLine()' y 'Console.WriteLine () 'salida a ** Vista de resultados de prueba **, * no * a ** 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 derecho y seleccionando ** Agregar/Eliminar Columnas ... **). , tal vez todavía no estoy viendo salida en ** Vista de salida ** significa que me falta algo ... – DavidRR

1

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.

+0

"De esta manera puede controlar el progreso utilizando el conjunto de herramientas predeterminado". - ¿cómo? El problema que estoy viendo 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 * Salida * ventana. –

+0

https://www.visualstudio.com/es-es/docs/test/performance-testing/run-performance-tests-app-before-release#create-a-load-test – riezebosch

12

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

Usa el Debug.WriteLine. Esto mostrará su mensaje en la ventana Output inmediatamente. La única restricción es que debe ejecutar su prueba en el modo 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

+6

requiere 'using System.Diagnostics; ' – kmote

+4

No use DateTime.Now. Es mejor usar Cronómetro (http://msdn.microsoft.com/en-us/library/system.diagnostics.stopwatch.aspx) – suizo

+1

No pude hacer que esto funcione. Cuando ejecuto la prueba, la ventana de salida cambia inmediatamente a Build y no se envía nada a Debug. ¿Tus pensamientos? – InteXX

3

que tenían el mismo problema y yo estaba "corriendo" 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. No sé cómo ver la salida si "Ejecuta" las pruebas.

+0

Puedo obtener algo para mostrar usando 'System.Diagnostics.Debug.WriteLine' durante la depuración de pruebas, pero ¿cómo se consigue' Console.WriteLine' para funcionar? Esto no termina en la salida normal (actualización en vivo) para mí. –

Cuestiones relacionadas