2011-02-03 11 views
92

Contesto:
Abbiamo alcuni utenti di segnalare problemi con una funzione di upload di file nella nostra applicazione web. Succede solo occasionalmente e senza alcun modello speciale. Abbiamo cercato di capirlo per un lungo periodo, aggiungendo informazioni di debug ovunque possiamo pensare che potrebbero essere d'aiuto, eseguendo la scansione dei log ecc., Ma non siamo stati in grado di riprodurli o capirli.Come scrivere a Console.Out durante l'esecuzione di un test MSTest

Problema:
Ora sto cercando di riprodurre questo utilizzando MSTest e WatiN di ripetere l'operazione che si suppone a fallire un gran numero di volte (diverse centinaia). Solo per avere un indizio su quanto lontano nel ciclo del test ha ottenuto, voglio stampare qualcosa di simile:

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

Ciò tuttavia non compare nella finestra di output. Ora so che otterrete l'output della console nei risultati del test (oltre a quello prodotto da Debug.Writeline ecc.), Ma questo non è disponibile fino al dopo il il test è terminato. E poiché il mio test con centinaia di ripetizioni potrebbe richiedere parecchio tempo, mi piacerebbe sapere fino a che punto è arrivato.

Domanda:
C'è un modo posso ottenere l'output della console nella finestra Output durante esecuzione del test?

risposta

92

L'output della console non viene visualizzato perché il codice backend non è in esecuzione nel contesto del test.

Probabilmente stai meglio usando Trace.WriteLine (in System.Diagnostics) e quindi aggiungendo un listener di traccia che scrive su un file.

This topic from MSDN mostra un modo per farlo.

+61

Quindi, fondamentalmente, 'Trace.Listeners.Add (nuova TextWriterTraceListener (Console.Out));' ' Trace.WriteLine ("Ciao Mondo");' –

+0

Nizza, mi piace. Per aggirare questo ho usato log4net con un filelogger. Dovrete modificare le chiamate da Console.WriteLine a Logger.Info (...) – joshgo

+7

Hmmm, ho constatato che il suggerimento @ Martin Neal manda sia Console.WriteLine 'Trace.WriteLine()' e '() restituisce la visualizzazione ** Risultati test **, * non * ** Visualizzazione output **. (E nota che nella ** Visione risultati test **, potrebbe essere necessario aggiungere la colonna ** Output (Stdout) ** facendo clic con il pulsante destro del mouse e selezionando ** Aggiungi/Rimuovi colonne ... **.) Ma , uscita forse sto ancora non vedendo nel ** Output View ** significa che mi manca qualcosa ... – DavidRR

1

È meglio impostare un singolo test e creare un test delle prestazioni da questo test. In questo modo è possibile monitorare i progressi utilizzando il set di strumenti predefinito.

+0

"In questo modo è possibile monitorare i progressi utilizzando il set di strumenti predefinito." - Come? Il problema che sto vedendo è esattamente che una volta eseguito un test, è una scatola nera e vedo solo l'output (che sto scrivendo gradualmente mentre il test è in esecuzione) al termine del test, nell'output * * finestra. –

+0

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

12

Ho trovato una soluzione tutta mia. So che la risposta di Andras è probabilmente la più coerente con MSTEST, ma non mi sentivo in grado di refactoring il mio codice.

[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")); 
    } 
} 

monouso per ConsoleRedirector è definito come:

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

Utilizza la Debug.WriteLine. Questo mostrerà il tuo messaggio immediatamente nella finestra Output. L'unica limitazione è che devi eseguire il test nella modalità Debug.

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

uscita

enter image description here

+6

richiede 'using System.Diagnostics; ' – kmote

+4

Non utilizzare DateTime.Now. E 'meglio usare cronometro (http://msdn.microsoft.com/en-us/library/system.diagnostics.stopwatch.aspx) – suizo

+1

non ho potuto ottenere questo lavoro. Quando eseguo il test, la finestra di output passa immediatamente a Build e nulla viene inviato a Debug. I tuoi pensieri? – InteXX

3

Ho avuto lo stesso problema e mi è stato "correre" i test. Se invece eseguo il "Debug" dei test, l'output di Debug viene visualizzato correttamente come tutti gli altri Trace e Console. Non so come vedere l'output se "Esegui" i test.

+0

posso ottenere qualcosa da mostrare utilizzando 'System.Diagnostics.Debug.WriteLine' durante il debug di test, ma come si fa a ottenere' Console.WriteLine' a lavorare? Questo non finisce con l'uscita normale (live updated) per me. –

Problemi correlati