Czy mogę pisać do konsoli w teście jednostkowym? Jeśli tak, dlaczego nie otwiera się okno konsoli?


148

Mam projekt testowy w programie Visual Studio. Używam Microsoft.VisualStudio.TestTools.UnitTesting.

Dodaję tę linię w jednym z moich testów jednostkowych:

Console.WriteLine("Some foo was very angry with boo");
Console.ReadLine();

Kiedy uruchamiam test, test kończy się pomyślnie, ale okno konsoli nie jest w ogóle otwierane.

Czy istnieje sposób udostępnienia okna konsoli do interakcji za pośrednictwem testu jednostkowego?


1
To naprawdę zależy od biegacza. Możesz użyć TestDriven.Net (świetny, darmowy tester do użytku osobistego) - Console.WriteLine zapisze dane w okienku wyjściowym VS.
seldary

1
Dziękujemy za rozpowszechnianie informacji na TestDriven.Net
GrayFox374

NCrunch ma również tę funkcję, która sama w sobie sprawia, że ​​jest wart ceny IMO. Mam Dumpmetodę rozszerzenia, która wyprowadza zawartość obiektu do konsoli, co znacznie ułatwia debugowanie. i.imgur.com/MEZwy7X.png
DharmaTurtle

Odpowiedzi:


125

UWAGA: Oryginalna odpowiedź poniżej powinna działać dla każdej wersji VS do VS2012. Wygląda na to, że VS2013 nie ma już okna wyników testu. Zamiast tego, jeśli potrzebujesz danych wyjściowych specyficznych dla testu, możesz użyć sugestii @ Stretch, Trace.Write()aby zapisać dane wyjściowe w oknie Output.


Console.WriteMetoda nie pisać do „konsoli” - pisze na to, co jest podłączone do standardowego uchwytu wyjścia dla procesu. Podobnie Console.Readodczytuje dane wejściowe z tego, co jest podłączone do standardowego wejścia.

Po uruchomieniu testu jednostkowego za pomocą VS2010 standardowe wyjście jest przekierowywane przez wiązkę testową i przechowywane jako część wyjścia testowego. Można to zobaczyć, klikając prawym przyciskiem myszy okno Wyniki testu i dodając kolumnę o nazwie „Wyjście (StdOut)” do ekranu. To pokaże wszystko, co zostało napisane na stdout.

Państwo mogłoby ręcznie otworzyć okno konsoli, przy użyciu P / Invoke jak @ sinni800 mówi. Z przeczytania AllocConsoledokumentacji wynika, że ​​funkcja zresetuje się stdini stdoutobsługuje wskazanie nowego okna konsoli. (Nie jestem tego w 100% pewien; wydaje mi się, że trochę źle, jeśli przekierowałem już stdoutsystem Windows, aby ukraść to ode mnie, ale nie próbowałem).

Ogólnie jednak uważam, że to zły pomysł; jeśli wszystko, do czego chcesz użyć konsoli, to zrzucić więcej informacji o teście jednostkowym, dane wyjściowe są dla Ciebie. Nie przestawaj korzystać z Console.WriteLinetego, co robisz, a po zakończeniu sprawdź wyniki w oknie Wyniki testu.


Spróbuj otworzyć nową aplikację WindowsApplication, używając AllocConsole do przydzielenia konsoli, a ona tam zapisze. Nie wiem, co to naprawdę robi, ale może nie działać w środowisku testów jednostkowych. Naprawdę byłoby miło wiedzieć ...
sinni800

hrm. ponownie czytam AllocConsoledokumentację, może się mylę, ale musiałbym to przetestować.
Michael Edenfield

2
Dla mnie ten komentarz Michaela powiedział wszystko, o czym musiałem pomyśleć: „Kiedy uruchamiasz test jednostkowy przez VS2010, standardowe wyjście jest przekierowywane przez wiązkę testową i przechowywane jako część wyjścia testowego”.
Robert Patterson

5
w VS2013, jeśli piszesz na konsoli, na TestExplorer / Test / Podsumowanie pojawi się etykieta łącza [Wyjście]. Kliknij na niego, a otrzymasz żądane wyjście. Czekać? Chcesz również wywołać Console.ReadLine () ??
Visar

3
W wersji V2017 (Społeczność) przejdź do „eksploratora testów”, wybierz pozycję wyniku testu z listy, a następnie kliknij łącze „wyjście” w drugim oknie (okno wyników testu?). Ponieważ prawdopodobnie zostanie obcięty, użyj opcji „kopiuj wszystko” i wklej w innym miejscu.
heringer

180

Ktoś skomentował tę pozornie nową funkcjonalność w VS2013. Na początku nie byłem pewien, co miał na myśli, ale teraz, kiedy już wiem, myślę, że zasługuje na własną odpowiedź.

Możemy normalnie korzystać z Console.WriteLine, a wynik jest wyświetlany, tylko nie w oknie Output, ale w nowym oknie po kliknięciu „Output” w szczegółach testu.

wprowadź opis obrazu tutaj


2
Doskonałe rozwiązanie. Potwierdź, że działa w VS2015 Enterprise.
garfbradaz

6
Niestety, nie można wybrać żadnego tekstu w tym obszarze wyjściowym do kopiowania i wklejania :( Co oni myśleli ?!
LUB Mapper

3
@ORMapper, kliknij prawym przyciskiem myszy obszar „Standardowe wyjście” i wybierz „Kopiuj wszystko”
bychance,

2
@ Ovi-WanKenobi spróbuj wyprowadzić coś za pomocą Console.Write
Tiago Duarte

5
W porównaniu z 2017 musisz wybrać KAŻDY test, który jest uruchomiony, a następnie kliknąć wyjście - niezbyt przydatne, gdy masz dużo testów. Chcę widzieć wszystkie dane wyjściowe razem - nie w osobnych oknach.
inliner49er

37

Możesz użyć tego wiersza, aby napisać do okna wyjściowego programu Visual Studio:

System.Diagnostics.Debug.WriteLine("Matrix has you...");

Musi działać w trybie debugowania.


7
Nie pisze na moim VS
Luis Filipe

1
sprawdź ten wątek po szczegóły - stackoverflow.com/questions/1159755/…
Dmitry Pavlov

1
To działało świetnie dla mnie, używając MSTest i R # do wyświetlania danych wyjściowych. Dzięki!
Isaac Baker

2
@William pokazuje się, jeśli debugujesz test, ale nie, jeśli po prostu uruchomisz go bez debugowania.
jojo,

29

Jak wspomniano, testy jednostkowe są zaprojektowane tak, aby działać bez interakcji.

Można jednak debugować testy jednostkowe, tak jak każdy inny kod. Najłatwiej jest użyć przycisku Debuguj na karcie Wyniki testu.

Możliwość debugowania oznacza możliwość korzystania z punktów przerwania. Możliwość korzystania z punktów przerwania oznacza zatem możliwość korzystania z punktów śledzenia , co jest niezwykle przydatne w codziennym debugowaniu.

Zasadniczo punkty śledzenia pozwalają pisać do okna Output (lub dokładniej, na standardowe wyjście). Opcjonalnie możesz kontynuować bieg lub zatrzymać się jak zwykły punkt przerwania. Zapewnia to „funkcjonalność”, o którą prosisz, bez konieczności przebudowywania kodu lub wypełniania go informacjami debugowania.

Po prostu dodaj punkt przerwania, a następnie kliknij go prawym przyciskiem myszy. Wybierz opcję „Po trafieniu…”: Opcja When Hit

Co powoduje wyświetlenie okna dialogowego: Kiedy punkt przerwania jest trafiony

Kilka uwag:

  1. Zauważ, że punkt przerwania jest teraz wyświetlany jako romb zamiast kuli, co wskazuje na punkt śledzenia
  2. Możesz wyprowadzić wartość zmiennej, umieszczając ją w taki sposób, jak {this}.
  3. Usuń zaznaczenie pola wyboru „Kontynuuj wykonywanie”, aby kod był uszkodzony w tym wierszu, jak w każdym zwykłym punkcie przerwania
  4. Masz możliwość uruchomienia makra. Zachowaj ostrożność - możesz wywołać szkodliwe skutki uboczne.

Więcej informacji można znaleźć w dokumentacji.


24

Istnieje kilka sposobów zapisywania danych wyjściowych z testu jednostkowego programu Visual Studio w języku C #:

  • Console.Write - wiązka przewodów testowych programu Visual Studio przechwyci to i pokaże je po wybraniu testu w Eksploratorze testów i kliknięciu łącza danych wyjściowych. Czy nie pojawiają się w Visual Studio okna wyjściowego, gdy albo pracuje lub debugowanie badanej jednostki (prawdopodobnie jest to błąd).
  • Debug.Write - testowa wiązka przewodów programu Visual Studio przechwyci to i pokaże w wynikach testu. Pojawia się w oknie danych wyjściowych programu Visual Studio podczas debugowania testu jednostkowego, chyba że opcje debugowania programu Visual Studio są skonfigurowane do przekierowywania danych wyjściowych do okna bezpośredniego. Nic nie pojawi się w oknie wyjściowym (lub bezpośrednim), jeśli po prostu uruchomisz test bez debugowania. Domyślnie dostępne tylko w kompilacji debugowania (to znaczy, gdy zdefiniowano stałą DEBUG).
  • Trace.Write - testowa wiązka przewodów programu Visual Studio przechwyci to i pokaże w wynikach testu. Pojawia się w oknie danych wyjściowych programu Visual Studio (lub bezpośrednim) podczas debugowania testu jednostkowego (ale nie podczas prostego uruchamiania testu bez debugowania). Domyślnie dostępne w kompilacjach Debug i Release (to znaczy, gdy zdefiniowana jest stała TRACE).

Potwierdzone w Visual Studio 2013 Professional.


1
Zauważ, że reguły są nieco inne, jeśli używasz NUnit i rozszerzenia NUnit Test Adapter dla programu Visual Studio, a nie wbudowanej platformy testowej Microsoft.
jojo

9

Możesz użyć

Trace.WriteLine() 

do zapisu w oknie danych wyjściowych podczas debugowania pliku unittest.


5

W programie Visual Studio 2017 „TestContext” nie wyświetla łącza danych wyjściowych w Eksploratorze testów. Jednak Trace.Writeline () pokazuje łącze Ouput.


Tylko FYI, jego Trace.WriteLine
TroySteven

4

Przede wszystkim testy jednostkowe mają z założenia działać całkowicie bez interakcji.

Pomijając to, nie sądzę, żeby była taka możliwość.

Możesz spróbować włamać się za pomocą AllocConsole P / Invoke, które otworzy konsolę nawet wtedy, gdy twoja bieżąca aplikacja jest aplikacją GUI. ConsoleKlasa będzie następnie dodawać do teraz otwartej konsoli.


1
Hmm ... Moim głównym motywem jest napisanie dodatkowych danych na konsolę, aby zobaczyć głębsze szczegóły. Będzie to rzecz ad hoc, której być może później nie będę potrzebować.
ołówekCake


2

Komunikaty wyjściowe IMHO są w większości przypadków istotne tylko w przypadku niepowodzenia testu. Przygotowałem poniższy format, możesz też stworzyć swój własny. Jest to wyświetlane w samym oknie VS Test Explorer.

Jak wyświetlić tę wiadomość w oknie VS Test Explorer? Przykładowy kod, taki jak ten, powinien działać.

if(test_condition_fails)
    Assert.Fail(@"Test Type: Positive/Negative.
                Mock Properties: someclass.propertyOne: True
                someclass.propertyTwo: True
                Test Properties: someclass.testPropertyOne: True
                someclass.testPropertyOne: False
                Reason for Failure: The Mail was not sent on Success Task completion.");

Możesz mieć osobną klasę poświęconą temu dla siebie. Mam nadzieję, że to pomoże!


Pomyślałem, że to też dodam. W programie Visual Studio 2019 przy użyciu XUNIT można wykonać następujące czynności: Assert.True (sukces, „USUŃ REKORD NIE POWIODŁO SIĘ”); DELETE RECORD FAILED pojawi się w Eksploratorze testów VS 2019. Ponownie, podobnie jak powyższa odpowiedź, działa to tylko wtedy, gdy test jednostkowy nie przejdzie zgodnie z oczekiwanym warunkiem.
TroySteven

1

Mam łatwiejsze rozwiązanie (z którego ostatnio sam korzystałem, z wielu leniwych powodów). Dodaj tę metodę do klasy, w której pracujesz:

public static void DumbDebug(string message)
    {
        File.WriteAllText(@"C:\AdHocConsole\" + message + ".txt", "this is really dumb, I wish microsoft had more obvious solutions to it's solutions' problems.");
    }

Następnie ... otwórz katalog AdHocConsole, uporządkuj według czasu utworzenia. Upewnij się, że dodając swoje „instrukcje drukowania”, są one różne, w przeciwnym razie będzie żonglerka.


0

Visual Studio dla komputerów Mac

Żadne z pozostałych rozwiązań nie działało w VS for Mac

Jeśli używasz NUnit , możesz dodać mały .NET projekt konsoli do swojego rozwiązania, a następnie odwołać się do projektu, który chcesz przetestować, w Odwołaniach tego nowego projektu konsoli .

Cokolwiek robiłeś w swoich [Test()]metodach, możesz zrobić w Mainaplikacji konsolowej w następujący sposób:

class MainClass
{
    public static void Main(string[] args)
    {
        Console.WriteLine("Console");

        // Reproduce the Unit Test
        var classToTest = new ClassToTest();
        var expected = 42;
        var actual = classToTest.MeaningOfLife();
        Console.WriteLine($"Pass: {expected.Equals(actual)}, expected={expected}, actual={actual}");
    }
}

W tych okolicznościach możesz swobodnie używać Console.Writei używać Console.WriteLineswojego kodu.

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.