Jak mogę napisać dane wyjściowe z testu jednostkowego?

113

Każde wywołanie w moich testach jednostkowych do jednego Debug.Write(line)lub Console.Write(Line)po prostu jest pomijane podczas debugowania, a wynik nigdy nie jest drukowany. Wywołania tych funkcji z klas, których używam, działają poprawnie.

Rozumiem, że testowanie jednostkowe ma być zautomatyzowane, ale nadal chciałbym mieć możliwość wyprowadzania komunikatów z testu jednostkowego.

Chris
źródło

Odpowiedzi:

128

Spróbuj użyć TestContext.WriteLine() tekstu wyjściowego w wynikach testu.

Przykład:

    [TestClass]
    public class UnitTest1
    {
        private TestContext testContextInstance;

        /// <summary>
        ///  Gets or sets the test context which provides
        ///  information about and functionality for the current test run.
        ///</summary>
        public TestContext TestContext
        {
            get { return testContextInstance; }
            set { testContextInstance = value; }
        }

        [TestMethod]
        public void TestMethod1()
        {
            TestContext.WriteLine("Message...");
        }
    }

„Magia” jest opisana w MSDN jako „Struktura testowa automatycznie ustawia właściwość, której można następnie używać w testach jednostkowych”.

Frennky
źródło
7
Zauważyłem (z VS2013), że to wyświetla coś tylko wtedy, gdy test jest uruchamiany w trybie debugowania.
fusi
3
Wygląda na to, że użycie TestContext wymaga VS2015 Enterprise (lub wersji premium wcześniejszych edycji), zgodnie z tą dokumentacją
Patrick Steadman
Zauważam, że jeśli twój ciąg ma nawiasy klamrowe, metoda wybucha. Więc "_testContext.WriteLine (" witaj ");" działa, ale "_testContext.WriteLine (" he {ll} o ");" kończy się niepowodzeniem z komunikatem „System.FormatException: ciąg wejściowy nie był w poprawnym formacie”.
Mike K,
1
Metoda WriteLine w TestContext przyjmuje te same parametry, które przyjmuje Console.WriteWriteLine. Oznacza to, że ciąg jest ciągiem formatującym (udokumentowanym pod adresem docs.microsoft.com/en-us/dotnet/standard/base-types/ ... ). Aby użyć literału {w ciągu, musisz go podwoić. Aby wydrukować swój ciąg, użyj WriteLine ("he {{ll}} o");
Walter
1
to było interesujące ... chociaż nadal nie wiem, dlaczego nie dodali tego i podobnych funkcji do klasy bazowej lub interfejsu, którego moglibyśmy użyć z frameworka, aby uniknąć nieporozumień.
Niklas
149

Próbowałem również uzyskać debugowanie lub śledzenie lub konsolę lub testContext do pracy w testach jednostkowych.

Żadna z tych metod nie wydaje się działać ani wyświetlać wyników w oknie wyników:

    Trace.WriteLine("test trace");
    Debug.WriteLine("test debug");
    TestContext.WriteLine("test context");
    Console.WriteLine("test console");

Visual Studio 2012 i nowsze

(z komentarzy) W programie Visual Studio 2012 nie ma ikony. Zamiast tego w wynikach testu znajduje się łącze o nazwie Wyjście . Jeśli klikniesz link, zobaczysz wszystkie pliki WriteLine.

Przed Visual Studio 2012

Wtedy zauważyłem, że w moim oknie Wyniki testu , po uruchomieniu testu, obok małego zielonego kółka wskazującego sukces , jest kolejna ikona. Dwukrotnie kliknąłem. To były moje wyniki testu, który zawierał wszystkie powyższe typy zapisów.

Jogurt Mądry
źródło
44
W programie Visual Studio 2012 nie ma ikony. Zamiast tego w wynikach testu znajduje się łącze o nazwie „Wyjście”. Jeśli klikniesz link, zobaczysz wszystkie wpisy.
epotter
16
Jezu, ten link „Wyjście” jest z natury trudny do znalezienia. Jeśli ktoś stara się go znaleźć, jest to w dolnej sekcji Eksploratora tekstu. Kiedy test jest wybrany, pokazuje wynik z „Elapsed time: xxx”. Poniżej znajduje się link „Wyjście”.
kevin
@kevin, w której wersji VS to widziałeś? (Zakładam, że masz na myśli „Eksplorator testów” zamiast „Eksplorator tekstu). Nie widzę łącza Wyjście w ekspresie VS2013.
Mike C
1
Jeśli ktoś się zastanawia (tak jak ja), które z nich pojawiają się w pliku TRX (wynik testu), to wszystko z wyjątkiem "Debug.WriteLine".
Badgerspot
4
W programie Visual Studio 2017 nadal jest to łącze „Wyjście”.
HankCa,
66

W programie Visual Studio 2017 można zobaczyć dane wyjściowe z eksploratora testów.

1) W Twojej metodzie testowej Console.WriteLine („coś”);

2) Uruchom test.

3) W oknie Eksploratora testów kliknij opcję Zaliczona metoda testu.

4) I kliknij link „Wyjście”.

wprowadź opis obrazu tutaj

I kliknij „Wyjście”, zobaczysz wynik działania Console.Writeline (). wprowadź opis obrazu tutaj

monad.gon
źródło
1
Doskonały. Visual Studio / C # nie jest moją normą w programowaniu, po prostu tego potrzebowałem! Dziękuję za wysłanie tego.
matt32
10
Używam wersji 2017 15.5.6 Bit O nie widzę łącza wyjściowego.
Mike IT
1
Czy to zależy od używanej platformy testowej? Używam xUnit 2.4 w projekcie testowym .NET 4.6 i nie pojawia się okienko „Standardowe wyjście”. Dane wyjściowe z Console.WriteLinenie są również widoczne w okienku Wyjście w obszarze „Testy”.
Qwertie
W przypadku xUnit odpowiedź jonzima działała dla mnie, nawet w innym wątku utworzonym przez test.
Qwertie
1
Dla tych, którzy nie widzieli linku „wyjście”. 1) Należy wybrać metodę testową . 2) pozwól, aby okno Eksploratora testów wypełniło okno VS pionowo, w przeciwnym razie łącze zostanie ukryte, a pasek przewijania będzie zbyt mały, aby można go było zauważyć lub użyć.
Meow Cat 2012,
18

To zależy od twojego testera ... na przykład używam xUnit , więc jeśli tego właśnie używasz, postępuj zgodnie z poniższymi instrukcjami:

https://xunit.github.io/docs/capturing-output.html

Ta metoda grupuje dane wyjściowe z każdym określonym testem jednostkowym.

using Xunit;
using Xunit.Abstractions;

public class MyTestClass
{
    private readonly ITestOutputHelper output;

    public MyTestClass(ITestOutputHelper output)
    {
        this.output = output;
    }

    [Fact]
    public void MyTest()
    {
        var temp = "my class!";
        output.WriteLine("This is output from {0}", temp);
    }
}

W linku, który podałem, znajduje się inna metoda pisania w oknie Wyjście, ale wolę poprzednią.

jonzim
źródło
4

Myślę, że nadal jest aktualny.

Możesz użyć tego pakietu NuGet : Bitoxygen.Testing.Pane

Wywołaj niestandardową metodę WriteLine z tej biblioteki. Tworzy okienko testowania wewnątrz danych wyjściowych oknie i zawsze umieszcza tam komunikaty (podczas każdego testu działa niezależnie od flag DEBUG i TRACE).

Aby ułatwić śledzenie, polecam utworzenie klasy bazowej:

[TestClass]
public abstract class BaseTest
{
    #region Properties
    public TestContext TestContext { get; set; }

    public string Class
    {
        get { return this.TestContext.FullyQualifiedTestClassName; }
    }
    public string Method
    {
        get { return this.TestContext.TestName; }
    }
    #endregion

    #region Methods
    protected virtual void Trace(string message)
    {
        System.Diagnostics.Trace.WriteLine(message);

        Output.Testing.Trace.WriteLine(message);
    }
    #endregion
}

[TestClass]
public class SomeTest : BaseTest
{
    [TestMethod]
    public void SomeTest1()
    {
        this.Trace(string.Format("Yeah: {0} and {1}", this.Class, this.Method));
    }
}
Maksyma
źródło
1
Magia tkwi w: Output.Testing.Trace.WriteLine (wiadomość); z BitOxygen.
Bimal Poudel
Nie działa z bieżącą wersją programu Visual Studio, pojawia się błądCould not load file or assembly 'Microsoft.VisualStudio.Shell.12.0,
konsola,
@Console Tak, potrzebuje wsparcia, ale nie jestem pewien, czy społeczność jest interesująca w ten sposób. xUnit ma OutputHandler i VS może pokazać jego wynik.
Maxim
1

Spróbuj użyć:

Console.WriteLine()

Wywołanie do Debug.WriteLinezostanie nawiązane tylko wtedy, gdy zdefiniowano DEBUG.

Inne sugestie są do użycia: Trace.WriteLinerównież, ale nie próbowałem tego.

Istnieje również opcja (nie jestem pewien, czy Visual Studio 2008 ją ma), ale nadal możesz użyć, Debug.WriteLinegdy uruchomisz test z Test With Debuggeropcją w IDE.

VoodooChild
źródło
1

Rozwiązano za pomocą następującego przykładu:

public void CheckConsoleOutput()
{
    Console.WriteLine("Hello, World!");
    Trace.WriteLine("Trace Trace the World");
    Debug.WriteLine("Debug Debug World");
    Assert.IsTrue(true);
}

Po uruchomieniu tego testu, w sekcji „Test zakończony pomyślnie”, można wyświetlić dane wyjściowe, co spowoduje wyświetlenie okna wyników.

Mikrofon
źródło
1

To rzeczywiście zależy od testera, jak wspomniał @jonzim. W przypadku NUnit 3 musiałem użyćNUnit.Framework.TestContext.Progress.WriteLine() aby uzyskać działające dane wyjściowe w oknie danych wyjściowych programu Visual Studio 2017.

NUnit opisuje, jak to zrobić: tutaj

Zgodnie z moim zrozumieniem obraca się to wokół dodatkowej równoległości wykonywania testów, którą otrzymali testerzy.

Pebermynte Lars
źródło
0

Nie otrzymuję danych wyjściowych, gdy moje ustawienie Test / Test Settings / Default Processor Architecture i zestawy, do których odwołuje się mój projekt testowy, nie są takie same. W przeciwnym razie Trace.Writeline () działa dobrze.

Arthur Greef
źródło
0

Console.WriteLine nie będzie działać. W trybie debugowania będą działać tylko Debug.WriteLine () lub Trace.WriteLine ().

Wykonuję następujące czynności: uwzględniam użycie System.Diagnostics w module testowym. Następnie użyj Debug.WriteLine dla mojego wyniku, kliknij prawym przyciskiem myszy test , wybierz Debuguj wybrane testy . Wynik końcowy pojawi się teraz w oknie Wyjście poniżej. Używam Visual Studio 2017 w porównaniu z 15.8.1, z domyślną platformą testów jednostkowych, które zapewnia VS.

Przysmaki
źródło
0

Czy na pewno uruchamiasz testy jednostkowe w debugowaniu? Debug.WriteLine nie będzie wywoływana w kompilacjach wydania.

Dwie opcje do wypróbowania to:

  • Trace.WriteLine (), który jest wbudowany w kompilacje wydania, a także w debugowanie

  • Undefine DEBUG w ustawieniach kompilacji dla testu jednostkowego

Jason Williams
źródło
0

Używam xUnit, więc używam tego:

Debugger.Log(0, "1", input);

PS: możesz Debugger.Break();też użyć , więc możesz zobaczyć swój login out.

Ivandro IG Jao
źródło
Co to jest „ out”?
Peter Mortensen
0

Inny wariant przyczyny / rozwiązania:

Mój problem polegał na tym, że nie otrzymywałem danych wyjściowych, ponieważ pisałem zestaw wyników z asynchronicznego wywołania LINQ do konsoli w pętli w kontekście asynchronicznym:

var p = _context.Payment.Where(pp => pp.applicationNumber.Trim() == "12345");

p.ForEachAsync(payment => Console.WriteLine(payment.Amount));

Tak więc test nie zapisywał do konsoli, zanim obiekt konsoli nie został wyczyszczony przez środowisko wykonawcze (podczas uruchamiania tylko jednego testu).

Rozwiązaniem było najpierw przekonwertowanie zestawu wyników na listę, więc mogłem użyć nieasynchronicznej wersji forEach ():

var p = _context.Payment.Where(pp => pp.applicationNumber.Trim() == "12345").ToList();

p.ForEachAsync(payment =>Console.WriteLine(payment.Amount));
Richard Strickland
źródło
0

W VS 2019

  1. na głównym pasku menu VS kliknij: View ->Test Explorer
  2. Kliknij prawym przyciskiem myszy metodę testową w Eksploratorze testów -> Debuguj
  3. Kliknij additional outputlink, jak pokazano na zrzucie ekranu poniżej.

wprowadź opis obrazu tutaj

Możesz użyć:

  • Debug.WriteLine
  • Console.WriteLine
  • TestContext.WriteLine

wszyscy będą logować się do dodatkowego okna wyjściowego.

Legendy
źródło
-1

Trace.WriteLinepowinno działać, pod warunkiem że wybierzesz prawidłowe wyjście (menu rozwijane z etykietą „Pokaż wyjście z” w oknie Wyjście ).

Peter Mortensen
źródło