web-dev-qa-db-de.com

Wie schreibe ich die Ausgabe eines Komponententests?

Jeder Aufruf in meinen Unit-Tests an Debug.Write(line) oder Console.Write(Line) wird beim Debugging einfach übersprungen und die Ausgabe wird niemals gedruckt. Aufrufe dieser Funktionen innerhalb von Klassen, die ich benutze, funktionieren gut. 

Ich verstehe, dass der Komponententest automatisiert sein soll, aber ich möchte trotzdem Meldungen aus einem Komponententest ausgeben können.

75
Chris

Versuchen Sie es mit TestContext.WriteLine(), die Text in Testergebnissen ausgibt.

Beispiel:

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

Die "Magie" wird in MSDN als "Das Testframework legt die Eigenschaft automatisch fest, die Sie dann in Komponententests verwenden können."

93
frennky

Es ist etwas spät für das Gespräch.

Ich habe auch versucht, Debug oder Trace, Console oder TestContext dazu zu bringen, in Unit Testing zu arbeiten.

Keine dieser Methoden würde funktionieren oder Ausgaben im Ausgabefenster anzeigen.

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

VS2012 und höher
(aus Kommentaren) In Visual Studio 2012 gibt es kein Symbol. Stattdessen gibt es in den Testergebnissen einen Link namens Output . Wenn Sie auf den Link klicken, sehen Sie alle WriteLine.

Vor VS2012
Ich bemerkte dann in meinem Test Results -Fenster, nachdem der Test ausgeführt wurde, neben dem kleinen Erfolg grüner Kreis , es gibt ein anderes Symbol, ich habe es doppelt angeklickt. Es waren meine Testergebnisse und es umfasste alle Arten von Schreibweisen oben.

129
Yogurt The Wise

In Visual Studio 2017 können Sie die Ausgabe von Test Explorer sehen.

1) Console.WriteLine ("Etwas") in Ihrer Testmethode; 

2) Führen Sie den Test aus.

3) Klicken Sie im Test Explorer-Fenster auf die bestandene Testmethode.

4) Klicken Sie auf den Link "Ausgabe".

 enter image description here

Wenn Sie auf "Ausgabe" klicken, können Sie das Ergebnis von Console.Writeline () . sehen. enter image description here

35
monad.gon

Das hängt von Ihrem Testläufer ab. Zum Beispiel verwende ich XUnit. Falls dies der Fall ist, folgen Sie diesen Anweisungen: 

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

Diese Methode gruppiert Ihre Ausgabe mit jedem spezifischen Komponententest.

 using Xunit; 
 using Xunit.Abstractions; 

 public Klasse MyTestClass 
 {
 private Readonly-Ausgabe von ITestOutputHelper; 

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

 [Tatsache]
 public void MyTest () 
 {
 var temp = "meine Klasse!"; 
 output.WriteLine ("Dies wird von {0} ausgegeben", temp); 
 } 
} 

In dem Link, den ich für das Schreiben in Ihr Ausgabefenster zur Verfügung gestellt habe, ist eine andere Methode aufgelistet, aber ich bevorzuge die vorige.

9
jonzim

Ich denke es ist immer noch aktuell.

Sie können dieses NuGet-Paket verwenden: https://www.nuget.org/packages/Bitoxygen.Testing.Pane/

Rufen Sie die benutzerdefinierte WriteLine-Methode aus dieser Bibliothek auf.
Es erstellt einen Testbereich innerhalb des Ausgabefensters und fügt Nachrichten immer dort hinzu (während jedes Testlaufs unabhängig von DEBUG- und TRACE-Flags).

Um die Traceerstellung zu vereinfachen, kann ich empfehlen, eine Basisklasse zu erstellen:

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

Sind Sie sicher, dass Sie Ihre Unit-Tests in Debug ausführen? Debug.WriteLine wird in Release-Builds nicht kalibriert.

Zwei Optionen zum Ausprobieren sind:

  • Trace.WriteLine (), das sowohl in Release-Builds als auch in Debug erstellt wird

  • Definieren Sie DEBUG in Ihren Build-Einstellungen für den Komponententest

0
Jason Williams

Gelöst mit dem folgenden Beispiel:

public void CheckConsoleOutput()
    {
        Console.WriteLine("Hi Hi World");
        Trace.WriteLine("Trace Trace the World");
        Debug.WriteLine("Debug Debug WOrld");
        Assert.IsTrue(true);
    }

Nachdem Sie diesen Test ausgeführt haben, können Sie unter "Test bestanden" die Ausgabe anzeigen, um das Ausgabefenster aufzurufen.

0
Mike

Console.WriteLine funktioniert nicht. Nur Debug.WriteLine () oder Trace.WriteLine () funktionieren im Debug-Modus.

Ich mache folgendes: include using System.Diagnostics im Testmodul. Verwenden Sie dann Debug.WriteLine für meine Ausgabe, Rechtsklick auf den Test , wählen Sie Ausgewählte Tests debuggen . Die Ergebnisausgabe wird nun im Ausgabefenster darunter angezeigt. Ich verwende Visual Studio 2017 vs 15.8.1, das von VS standardmäßig bereitgestellt wird.

0
Goodies

Trace.WriteLine sollte funktionieren, sofern Sie die richtige Ausgabe auswählen (Die Dropdown-Liste mit der Bezeichnung "Ausgabe anzeigen aus" im Ausgabefenster)

0
user4711269

Ich erhalte keine Ausgabe, wenn meine Einstellungen für Test/Testeinstellungen/Standardprozessorarchitektur und die Assemblys, auf die sich mein Testprojekt bezieht, nicht identisch sind. Ansonsten funktioniert Trace.Writeline () einwandfrei.

0
Arthur Greef

Ich bin einfach in dieses Thema geraten. Die Ursache/Lösung ist eine andere Variante der oben genannten, also werde ich posten.
Mein Problem war, dass ich keine Ausgabe erhielt, weil ich die Ergebnismenge von einem asynchronen Linq-Aufruf an die Konsole in einer Schleife in einem asynchronen Kontext geschrieben hatte:

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

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

daher schrieb der Test nicht auf die Konsole, bevor das Konsolenobjekt von der Laufzeitbereinigung bereinigt wurde (wenn nur ein Test ausgeführt wurde). Die Lösung bestand darin, die Ergebnismenge zuerst in eine Liste zu konvertieren, sodass ich die nicht asynchrone Version verwenden konnte von forEach ():

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

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

Versuchen Sie es mit:

Console.WriteLine()

Der Aufruf von Debug.WriteLine erfolgt nur, wenn DEBUG definiert ist.

Andere Vorschläge sind zu verwenden: Trace.WriteLine, aber ich habe das nicht ausprobiert.

Es gibt auch eine Option (nicht sicher, ob VS2008 sie hat), aber Sie können trotzdem Debug.WriteLine verwenden, wenn Sie den Test mit der Option Test With Debugger in der IDE ausführen

0
VoodooChild

Ich verwende xunit, also verwende ich dies: Debugger.Log(0, "1", input);

PS: Sie können Debugger.Break(); verwenden, damit Sie sich in out einloggen können.

0
Ivandro Ismael