Jak pisać do Console.Out podczas wykonywania testu MSTest


114

Kontekst:
Niektórzy użytkownicy zgłaszają problemy z funkcją przesyłania plików w naszej aplikacji internetowej. Zdarza się to tylko sporadycznie i bez specjalnego wzoru. Próbowaliśmy to rozgryźć przez długi czas, dodając informacje do debugowania wszędzie tam, gdzie moglibyśmy pomyśleć, że mogą pomóc, przeszukiwać dzienniki itp., Ale nie byliśmy w stanie ich odtworzyć ani rozgryźć.

Problem:
Próbuję teraz to odtworzyć, używając MSTest i WatiN, aby powtórzyć operację, która powinna zakończyć się niepowodzeniem wiele razy (kilkaset). Żeby mieć pojęcie o tym, jak daleko zaszedł test, chcę wydrukować coś takiego:

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

Nie pojawia się to jednak w oknie Wyjście. Teraz wiem, że w wynikach testu otrzymasz dane wyjściowe konsoli (a także to, co wyprowadzasz, Debug.Writelineitp.), Ale jest to dostępne dopiero po zakończeniu testu. A ponieważ mój test z setkami powtórzeń może zająć trochę czasu, chciałbym wiedzieć, jak daleko zaszedł.

Pytanie:
Czy istnieje sposób, aby uzyskać dane wyjściowe konsoli w oknie danych wyjściowych podczas wykonywania testu?


Jeśli szukasz sposobu na wydrukowanie wyniku testu: stackoverflow.com/a/4787047/621690
Risadinha

Odpowiedzi:


111

Dane wyjściowe konsoli nie pojawiają się, ponieważ kod zaplecza nie działa w kontekście testu.

Prawdopodobnie lepiej będzie użyć Trace.WriteLine(In System.Diagnostics), a następnie dodać odbiornik śledzenia, który zapisuje do pliku.

Ten temat z MSDN pokazuje, jak to zrobić.


Według komentarzy Marty'ego Neala i Dave'a Andersona:

using System;
using System.Diagnostics;

...

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

73
więc w zasadzie Trace.Listeners.Add(new TextWriterTraceListener(Console.Out)); Trace.WriteLine("Hello World");
Marty Neal

7
Hmmm, stwierdzam, że sugestia @Martin Neal wysyła zarówno dane wyjściowe, jak Trace.WriteLine()i Console.WriteLine()dane wyjściowe do widoku wyników testu , a nie widoku wyjściowego . (Zauważ, że w widoku wyników testu może być konieczne dodanie kolumny Output (Stdout) poprzez kliknięcie prawym przyciskiem myszy i wybranie opcji Dodaj / usuń kolumny ... ) Ale być może nadal nie widzę wyników w danych wyjściowych Widok oznacza, że ​​czegoś mi brakuje ...
DavidRR

3
Trace.Listeners.Add(new ConsoleTraceListener());jest wystarczające, a następnie Pokaż dane wyjściowe z debugowania w oknie wyjściowym.
Dave Anderson

3
Starałem się znaleźć wyjście w VS2017 ... Okno TestExplorer -> Kliknij na pojedynczy test -> Jeśli test się zakończył, w oknie szczegółów pod upływem czasu znajduje się słowo "ouput", które jest linkiem do nowe okno.
Mike Walsh

2
Jeśli używasz Xunit, po prostu weź ITestOutputHelper przez ctor i wywołaj na nim WriteLine. Minęło trochę czasu, zanim nauczyłem się pisać podczas testów integracyjnych, mam nadzieję, że to komuś pomoże.
Alexander Høst

69

Użyj Debug.WriteLine. Spowoduje to Outputnatychmiastowe wyświetlenie wiadomości w oknie. Jedynym ograniczeniem jest to, że musisz uruchomić test w Debugtrybie.

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

Wynik

wprowadź opis obrazu tutaj


8
wymaganiausing System.Diagnostics;
kmote

5
Nie używaj DateTime.Now. Lepiej jest użyć stopera ( msdn.microsoft.com/en-us/library/… )
suizo

1
Nie mogłem zmusić tego do pracy. Po uruchomieniu testu okno wyjściowe natychmiast przełącza się na kompilację i nic nie jest wysyłane do debugowania. Twoje myśli?
InteXX,

5
@InteXX upewnij się, że kliknąłeś „Debuguj test”, a nie „Uruchom test”. zadziałało dla mnie
John Henckel

@JohnHenckel: Gotcha. Dzięki. Zrobi to. W rzeczywistości Schaliasos mówi dokładnie to dobrze w swojej odpowiedzi; nie wiem, jak to przegapiłem.
InteXX,

13

Znalazłem własne rozwiązanie. Wiem, że odpowiedź Andras jest prawdopodobnie najbardziej zgodna z MSTEST, ale nie miałem ochoty na refaktoryzację mojego kodu.

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

Jednorazowe ConsoleRedirectordefiniuje się jako:

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

Miałem ten sam problem i "przeprowadzałem" testy. Jeśli zamiast tego „Debuguj” testy, wyjście debugowania pokazuje dobrze, jak wszystkie inne Trace i Console. Nie wiem jednak, jak zobaczyć wynik, jeśli „uruchomisz” testy.


Mogę uzyskać coś do pokazania System.Diagnostics.Debug.WriteLinepodczas debugowania testów, ale jak zabrać się Console.WriteLinedo pracy? To nie kończy się na normalnym (aktualizowanym na żywo) wyjściu dla mnie.
LUB Mapper

Czy znalazłeś jakieś sposoby zobaczenia wyników podczas przeprowadzania testów?
hima

0

Lepiej skonfiguruj pojedynczy test i utwórz test wydajności na podstawie tego testu. W ten sposób możesz monitorować postęp przy użyciu domyślnego zestawu narzędzi.


„W ten sposób możesz monitorować postęp przy użyciu domyślnego zestawu narzędzi”. - w jaki sposób? Problem, który widzę, polega dokładnie na tym, że po uruchomieniu testu jest to czarna skrzynka i widzę dane wyjściowe (które piszę stopniowo, gdy test jest uruchomiony) po zakończeniu testu, w oknie Wyjście .
LUB Mapper

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.