So schreiben Sie in Console.Out während der Ausführung eines MSTest-Tests

113

Kontext:
Einige Benutzer melden Probleme mit einer Funktion zum Hochladen von Dateien in unserer Webanwendung. Es kommt nur gelegentlich und ohne spezielles Muster vor. Wir haben lange versucht, es herauszufinden, Debug-Informationen hinzuzufügen, wo immer wir glauben, dass es helfen könnte, die Protokolle usw. zu crawlen, aber wir konnten es nicht reproduzieren oder herausfinden.

Problem:
Ich versuche jetzt, dies zu reproduzieren, indem ich MSTest und WatiN verwende, um den Vorgang zu wiederholen, der eine große Anzahl von Malen (mehrere Hundert) fehlschlagen soll. Um eine Ahnung zu haben, wie weit der Test in der Schleife fortgeschritten ist, möchte ich etwas drucken wie:

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

Dies wird jedoch nicht im Ausgabefenster angezeigt. Jetzt weiß ich, dass Sie die Konsolenausgabe in den Testergebnissen erhalten (sowie was Sie von Debug.Writelineusw. ausgeben ), aber dies ist erst verfügbar, nachdem der Test abgeschlossen ist. Und da mein Test mit Hunderten von Wiederholungen einige Zeit dauern kann, würde ich gerne wissen, wie weit er gekommen ist.

Frage:
Gibt es eine Möglichkeit, die Konsolenausgabe während der Testausführungim Ausgabefenster abzurufen?

julianisch
quelle
Wenn Sie nach einer Möglichkeit suchen, auf die Ausgabe des Testergebnisses zu drucken: stackoverflow.com/a/4787047/621690
Risadinha

Antworten:

110

Die Konsolenausgabe wird nicht angezeigt, da der Backend-Code im Kontext des Tests nicht ausgeführt wird.

Sie sind wahrscheinlich besser dran, Trace.WriteLine(In System.Diagnostics) zu verwenden und dann einen Trace-Listener hinzuzufügen, der in eine Datei schreibt.

Dieses Thema von MSDN zeigt einen Weg, dies zu tun.


Nach den Kommentaren von Marty Neal und Dave Anderson:

using System;
using System.Diagnostics;

...

Trace.Listeners.Add(new TextWriterTraceListener(Console.Out));
// or Trace.Listeners.Add(new ConsoleTraceListener());
Trace.WriteLine("Hello World");
Andras Zoltan
quelle
72
Trace.Listeners.Add(new TextWriterTraceListener(Console.Out)); Trace.WriteLine("Hello World");
Marty Neal
7
Hmmm, ich finde , dass der Vorschlag von @ Martin Neal schickt beide Trace.WriteLine()und Console.WriteLine()Ausgabe an die Testergebnisse anzeigen , nicht die Ausgabeansicht . (Beachten Sie, dass in der Testergebnisansicht möglicherweise die Spalte Ausgabe (Stdout) hinzugefügt werden muss, indem Sie mit der rechten Maustaste klicken und Spalten hinzufügen / entfernen auswählen .) Möglicherweise wird die Ausgabe jedoch immer noch nicht in der Ausgabe angezeigt Ansicht bedeutet, dass mir etwas fehlt ...
DavidRR
2
Trace.Listeners.Add(new ConsoleTraceListener());ist ausreichend und dann Ausgabe von Debug im Ausgabefenster anzeigen.
Dave Anderson
3
Ich hatte Probleme, die Ausgabe in VS2017 tatsächlich zu finden ... TestExplorer-Fenster -> Klicken Sie auf einen einzelnen Test -> Wenn der Test eine Ausgabe hatte, befindet sich im Detailfenster unter der verstrichenen Zeit das Wort "Ausgabe", auf das verwiesen wird ein neues Fenster.
Mike Walsh
1
Wenn Sie Xunit verwenden, nehmen Sie einfach ITestOutputHelper über den CTOR auf und rufen Sie WriteLine auf. Es hat eine Weile gedauert, bis ich herausgefunden habe, wie man während des Integrationstests schreibt. Ich hoffe, das hilft jemandem.
Alexander Høst
69

Verwenden Sie die Debug.WriteLine. Dadurch wird Ihre Nachricht Outputsofort im Fenster angezeigt . Die einzige Einschränkung besteht darin, dass Sie Ihren Test im DebugModus ausführen müssen .

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

Ausgabe

Geben Sie hier die Bildbeschreibung ein

Chaliasos
quelle
8
erfordertusing System.Diagnostics;
kmote
4
Verwenden Sie DateTime.Now nicht. Es ist besser, Stoppuhr ( msdn.microsoft.com/en-us/library/… ) zu verwenden
Suizo
1
Ich konnte das nicht zum Laufen bringen. Wenn ich den Test ausführe, wechselt das Ausgabefenster sofort zu Build und es wird nichts an Debug gesendet. Ihre Gedanken?
InteXX
5
@InteXX Stellen Sie sicher, dass Sie auf "Test debuggen" und nicht auf "Test ausführen" klicken. es hat bei mir funktioniert
John Henckel
@ JohnHenckel: Gotcha. Vielen Dank. Wird das machen. Tatsächlich sagt Schaliasos genau das richtig in seiner Antwort; Ich bin mir nicht sicher, wie ich es verpasst habe.
InteXX
13

Ich habe eine eigene Lösung gefunden. Ich weiß, dass Andras Antwort wahrscheinlich am besten mit MSTEST übereinstimmt, aber ich hatte keine Lust, meinen Code umzugestalten.

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

Der Einwegartikel ConsoleRedirectorist definiert als:

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();
    }
}
SimplyKnownAsG
quelle
3

Ich hatte das gleiche Problem und habe die Tests "ausgeführt". Wenn ich stattdessen die Tests "debugge", zeigt die Debug-Ausgabe wie alle anderen Trace und Console. Ich weiß jedoch nicht, wie ich die Ausgabe sehen soll, wenn Sie die Tests "ausführen".

Gökhan Kurt
quelle
Ich kann System.Diagnostics.Debug.WriteLinebeim Debuggen von Tests etwas zeigen , aber wie kommst du Console.WriteLinezur Arbeit? Dies endet für mich nicht in der normalen (live aktualisierten) Ausgabe.
ODER Mapper
Haben Sie beim Ausführen von Tests Möglichkeiten gefunden, die Ergebnisse anzuzeigen?
Hima
0

Sie sollten einen einzelnen Test einrichten und aus diesem Test einen Leistungstest erstellen. Auf diese Weise können Sie den Fortschritt mit dem Standardwerkzeugsatz überwachen.

riezebosch
quelle
"Auf diese Weise können Sie den Fortschritt mit dem Standardwerkzeugsatz überwachen." - Wie? Das Problem, das ich sehe, ist genau, dass sobald ein Test ausgeführt wird, es sich um eine Black Box handelt und ich die Ausgabe (die ich allmählich schreibe, während der Test ausgeführt wird) erst nach Abschluss des Tests im Ausgabefenster sehen kann .
ODER Mapper