Come scrivere su Console.Out durante l’esecuzione di un test MSTest

Contesto:
Alcuni utenti segnalano problemi con una funzione di caricamento 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.

Problema:
Ora sto provando a riprodurlo usando MSTest e WatiN per ripetere l’operazione che dovrebbe fallire un gran numero di volte (diverse centinaia). Solo per avere un indizio su quanto nel circuito il test ha ottenuto, voglio stampare qualcosa del tipo:

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

Questo tuttavia non appare nella finestra Output. Ora so che otterrete l’output della console nei risultati del test (oltre a ciò che viene emesso da Debug.Writeline ecc.), Ma questo non è disponibile fino a quando il test non è 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 per ottenere l’output della console nella finestra Output durante l’ esecuzione del test?

    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 poi aggiungendo un listener di traccia che scrive su un file.

    Questo argomento di MSDN mostra un modo per farlo.

    Usa il Debug.WriteLine . Questo mostrerà immediatamente il tuo messaggio nella finestra Output . L’unica limitazione è che devi eseguire il test in modalità Debug .

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

    Produzione

    inserisci la descrizione dell'immagine qui

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

    Il ConsoleRedirector usa ConsoleRedirector getta è 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(); } } 

    Ho avuto lo stesso problema e stavo “eseguendo” 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 però come vedere l’output se “Esegui” i test.

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