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


114

Contesto:
alcuni utenti segnalano problemi con una funzione di caricamento di file nella nostra applicazione web. Succede solo occasionalmente e senza alcun motivo speciale. Abbiamo cercato di capirlo per molto tempo, aggiungendo informazioni di debug ovunque possiamo pensare che potrebbe aiutare, eseguendo la scansione dei log ecc., Ma non siamo stati in grado di riprodurlo o capirlo.

Problema:
ora sto cercando di riprodurlo utilizzando MSTest e WatiN per ripetere l'operazione che dovrebbe fallire un gran numero di volte (diverse centinaia). Solo per avere un'idea di quanto è arrivato il test nel ciclo, voglio stampare qualcosa del tipo:

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

Tuttavia, non viene visualizzato nella finestra Output. Ora so che otterrai l'output della console nei risultati del test (così come quello che produci da Debug.Writelineecc.), Ma questo non è disponibile fino al termine del test. E poiché il mio test con centinaia di ripetizioni potrebbe richiedere un po 'di tempo, mi piacerebbe sapere fino a che punto è arrivato.

Domanda:
esiste un modo per ottenere l'output della console nella finestra Output durante l' esecuzione del test?


Se cercate un modo per stampa per l'output risultato del test: stackoverflow.com/a/4787047/621690
Risadinha

Risposte:


111

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

Probabilmente è meglio usare Trace.WriteLine(In System.Diagnostics) e quindi aggiungere un listener di traccia che scrive su un file.

Questo argomento di MSDN mostra un modo per farlo.


Secondo i commenti di Marty Neal e Dave Anderson:

using System;
using System.Diagnostics;

...

Trace.Listeners.Add(new TextWriterTraceListener(Console.Out));
// or Trace.Listeners.Add(new ConsoleTraceListener());
Trace.WriteLine("Hello World");

73
quindi fondamentalmente, Trace.Listeners.Add(new TextWriterTraceListener(Console.Out)); Trace.WriteLine("Hello World");
Marty Neal

7
Hmmm, ho constatato che il suggerimento @ Martin Neal manda sia Trace.WriteLine()e Console.WriteLine()output alla risultati dei test di vista , non l' uscita View . (E si noti che nella risultati dei test di vista , può essere necessario aggiungere l' uscita (Stdout) colonna facendo clic destro e selezionando Colonne Aggiungi / Rimuovi ... ). Ma, forse sto ancora non vedendo l'uscita in uscita Vista significa che mi manca qualcosa ...
DavidRR

3
Trace.Listeners.Add(new ConsoleTraceListener());è sufficiente e quindi Mostra l'output da Debug nella finestra di output.
Dave Anderson

3
Stavo lottando per trovare effettivamente l'output in VS2017 ... Finestra TestExplorer -> Fare clic su un singolo test -> Se il test è stato eseguito, nella finestra dei dettagli sotto il tempo trascorso c'è la parola "ouput" che è un collegamento a una nuova finestra.
Mike Walsh

2
Se stai usando Xunit, inserisci ITestOutputHelper attraverso il ctor e chiama WriteLine su di esso. Ci è voluto un po 'prima di scoprire come scrivere durante il test di integrazione, spero che questo aiuti qualcuno.
Alexander Høst

69

Usa il Debug.WriteLine. Questo mostrerà Outputimmediatamente il tuo messaggio nella finestra. L'unica restrizione è che devi eseguire il test in Debugmodalità.

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

Produzione

inserisci qui la descrizione dell'immagine


8
richiedeusing System.Diagnostics;
kmote

5
Non utilizzare DateTime.Now. È meglio usare Stopwatch ( msdn.microsoft.com/en-us/library/… )
suizo

1
Non sono riuscito a farlo funzionare. Quando eseguo il test, la finestra di output passa immediatamente a Build e nulla viene inviato a Debug. I vostri pensieri?
InteXX

5
@InteXX assicurati di fare clic su "Debug the test", non "Run the test". ha funzionato per me
John Henckel

@ JohnHenckel: Gotcha. Grazie. Lo farò. In effetti Schaliasos dice esattamente questo nella sua risposta; non sono sicuro di come mi sia mancato.
InteXX

13

Ho trovato una soluzione per conto mio. So che la risposta di Andras è probabilmente la più coerente con MSTEST, ma non avevo voglia di refactoring del 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 monouso 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();
    }
}

3

Ho avuto lo stesso problema e stavo "eseguendo" i test. Se invece eseguo il "Debug" dei test, l'output di Debug mostra bene come tutti gli altri Trace e Console. Non so però come vedere l'output se "esegui" i test.


Posso ottenere qualcosa da mostrare usando System.Diagnostics.Debug.WriteLinedurante il debug dei test, ma come fai Console.WriteLinea lavorare? Questo non finisce nel normale output (aggiornato in tempo reale) per me.
O Mapper

Hai trovato dei modi per visualizzare gli output durante l'esecuzione dei test?
hima

0

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


"In questo modo puoi monitorare i progressi utilizzando il set di strumenti predefinito." - Come? Il problema che vedo è esattamente che una volta eseguito un test, è una scatola nera e riesco a vedere l'output (che sto scrivendo gradualmente mentre il test è in esecuzione) solo dopo che il test è terminato, nella finestra Output .
OPPURE Mapper

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.