Come posso scrivere l'output di uno unit test?


113

Qualsiasi chiamata nei miei unit test a uno Debug.Write(line)o Console.Write(Line)semplicemente viene saltata durante il debug e l'output non viene mai stampato. Le chiamate a queste funzioni dall'interno delle classi che sto usando funzionano bene.

Capisco che lo unit test sia pensato per essere automatizzato, ma vorrei comunque essere in grado di emettere messaggi da uno unit test.

Risposte:


128

Prova a utilizzare il TestContext.WriteLine()testo in uscita nei risultati del test.

Esempio:

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

La "magia" è descritta in MSDN come "Il framework di test imposta automaticamente la proprietà, che è possibile utilizzare negli unit test".


7
Ho scoperto (con VS2013) che questo stampa solo qualcosa se il test viene eseguito in modalità debug.
fusi

3
Sembra che l'utilizzo di TestContext richieda VS2015 Enterprise (o versioni premium delle edizioni precedenti), secondo questa documentazione
Patrick Steadman,

Sto notando che se la tua stringa contiene parentesi graffe, il metodo esplode. Quindi "_testContext.WriteLine (" hello ");" funziona ma "_testContext.WriteLine (" he {ll} o ");" ha esito negativo con "System.FormatException: la stringa di input non era in un formato corretto."
Mike K

1
Il metodo WriteLine in TestContext accetta gli stessi parametri che accetta Console.WriteWriteLine. Ciò significa che la stringa è una stringa di formattazione (documentata in docs.microsoft.com/en-us/dotnet/standard/base-types/… ). Per utilizzare un letterale {in una stringa, è necessario raddoppiarlo. Per stampare la tua stringa usa WriteLine ("he {{ll}} o");
Walter

1
questo è stato interessante ... anche se ancora non so perché non abbiano aggiunto questa e altre caratteristiche simili a una classe base o interfaccia che potremmo usare dal framework per evitare confusione.
Niklas

149

Stavo anche cercando di far funzionare Debug o Trace o Console o TestContext in unit test.

Nessuno di questi metodi sembrerebbe funzionare o mostrare l'output nella finestra di output:

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

Visual Studio 2012 e versioni successive

(dai commenti) In Visual Studio 2012 non è presente alcuna icona. Invece, c'è un collegamento nei risultati del test chiamato Output . Se fai clic sul collegamento, vengono visualizzati tutti i file WriteLine.

Prima di Visual Studio 2012

Ho quindi notato nella mia finestra Risultati del test , dopo aver eseguito il test, accanto al piccolo cerchio verde di successo , c'è un'altra icona. Ho fatto doppio clic su di esso. Erano i risultati del mio test e includevano tutti i tipi di scritti sopra.


44
In Visual Studio 2012 non è presente alcuna icona. Invece, c'è un collegamento nei risultati del test chiamato "Output". Se fai clic sul collegamento, vedrai tutti gli scritti.
epotter

16
geez, quel link "Output" è intrinsecamente difficile da trovare. Se qualcuno sta lottando per trovarlo, è in Text Explorer, sezione in basso. Quando viene selezionato un test, mostra il risultato con "Tempo trascorso: xxx". Sotto c'è il link "Output".
kevin

@kevin, in quale versione di VS l'hai visto? (Suppongo che tu intenda "Esplora test" invece di "Esplora testo.) Non vedo un link di output in VS2013 express.
Mike C

1
Se qualcuno si chiede (come me) quale di questi compaia in un file TRX (output dei risultati dei test), allora è tutto quanto sopra tranne "Debug.WriteLine".
Badgerspot

4
In Visual Studio 2017 è ancora il collegamento "Output".
HankCa

66

In Visual Studio 2017 è possibile visualizzare l'output di Esplora test.

1) Nel tuo metodo di prova, Console.WriteLine ("qualcosa");

2) Esegui il test.

3) Nella finestra Esplora test, fare clic su Metodo di test superato.

4) E fare clic sul collegamento "Output".

inserisci qui la descrizione dell'immagine

E fai clic su "Output", puoi vedere il risultato di Console.Writeline (). inserisci qui la descrizione dell'immagine


1
Eccellente. Visual Studio / C # non è la mia norma per lo sviluppo, questo è solo quello che mi serviva! grazie per aver postato questo.
matt32

10
Sto usando la versione 2017 15.5.6 Bit O non vedo il link di output.
Mike IT

1
Dipende dal framework di test in uso? Sto utilizzando xUnit 2.4 in un progetto di test .NET 4.6 e non viene visualizzato il riquadro "Standard Output". Anche l'output da Console.WriteLinenon è visibile nel riquadro Output in "Test".
Qwertie

Per xUnit, la risposta di jonzim ha funzionato per me, anche in un thread diverso generato dal test.
Qwertie

1
Per coloro che non hanno visto il collegamento "output". 1) È necessario selezionare un metodo di prova . 2) lasciare che la finestra Esplora test riempia la finestra VS verticalmente altrimenti il ​​collegamento è stato nascosto e la barra di scorrimento è troppo piccola per essere notata o utilizzata.
Meow Cat 2012

18

Dipende dal tuo test runner ... per esempio, sto usando xUnit , quindi se è quello che stai usando, segui queste istruzioni:

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

Questo metodo raggruppa l'output con ogni unit test specifico.

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

C'è un altro metodo elencato nel collegamento che ho fornito per scrivere nella finestra di output, ma preferisco il precedente.


4

Penso che sia ancora attuale.

Puoi usare questo pacchetto NuGet : Bitoxygen.Testing.Pane

Chiama il metodo WriteLine personalizzato da questa libreria. Crea un pannello di test all'interno della finestra di output e mette i messaggi lì sempre (durante ogni test, viene eseguito indipendentemente dai flag DEBUG e TRACE).

Per rendere più facile la traccia, posso consigliare di creare una classe base:

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

1
La magia è in: Output.Testing.Trace.WriteLine (messaggio); con BitOxygen.
Bimal Poudel

Non funziona con la versione corrente di Visual Studio, viene visualizzato un erroreCould not load file or assembly 'Microsoft.VisualStudio.Shell.12.0,
Console

@Console Sì, ha bisogno di un po 'di supporto, ma non sono sicuro che la comunità sia interessante in questo modo per l'output. xUnit ha OutputHandler e VS può mostrare il suo risultato.
Maxim

1

Prova a usare:

Console.WriteLine()

La chiamata a Debug.WriteLineverrà effettuata solo durante la definizione di DEBUG.

Altri suggerimenti sono da usare: Trace.WriteLinepure, ma non l'ho provato.

C'è anche un'opzione (non sono sicuro che Visual Studio 2008 ce l'abbia), ma puoi comunque usare Debug.WriteLine quando esegui il test con l' Test With Debuggeropzione nell'IDE.


1

Risolto con il seguente esempio:

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

Dopo aver eseguito questo test, sotto "Test superato", c'è la possibilità di visualizzare l'output, che farà apparire la finestra di output.


1

Dipende dal test runner, come menzionato da @jonzim. Per NUnit 3 ho dovuto usare NUnit.Framework.TestContext.Progress.WriteLine()per ottenere l'output in esecuzione nella finestra di output di Visual Studio 2017.

NUnit descrive come: qui

A quanto mi risulta, ciò ruota attorno all'ulteriore parallelizzazione dell'esecuzione dei test che i test runner hanno ricevuto.


0

Non ottengo alcun output quando l'impostazione Test / Impostazioni di test / Architettura del processore predefinita e gli assembly a cui fa riferimento il mio progetto di test non sono gli stessi. Altrimenti Trace.Writeline () funziona bene.


0

Console.WriteLine non funzionerà. Solo Debug.WriteLine () o Trace.WriteLine () funzioneranno, in modalità debug.

Faccio quanto segue: includo l' utilizzo di System.Diagnostics nel modulo di test. Quindi, usa Debug.WriteLine per il mio output, fai clic con il pulsante destro del mouse sul test , scegli Debug Selected Tests . L'output del risultato verrà ora visualizzato nella finestra di output sottostante. Uso Visual Studio 2017 vs 15.8.1, con il framework di unit test predefinito fornito da VS.


0

Sei sicuro di eseguire i tuoi unit test in Debug? Debug.WriteLine non verrà chiamato nelle build di rilascio.

Due opzioni da provare sono:

  • Trace.WriteLine (), integrato nelle build di rilascio e nel debug

  • Annulla la definizione di DEBUG nelle impostazioni di build per lo unit test


0

Sto usando xUnit quindi questo è quello che uso:

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

PS: puoi usarlo Debugger.Break();anche tu, così puoi vedere il tuo login out.


Cos'è questo " out"?
Peter Mortensen,

0

Una diversa variante della causa / soluzione:

Il mio problema era che non ricevevo un output perché stavo scrivendo il set di risultati da una chiamata LINQ asincrona alla console in un ciclo in un contesto asincrono:

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

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

E quindi il test non stava scrivendo sulla console prima che l'oggetto console fosse ripulito dal runtime (durante l'esecuzione di un solo test).

La soluzione era convertire prima il set di risultati in un elenco, in modo da poter utilizzare la versione non asincrona di forEach ():

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

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

0

In VS 2019

  1. nella barra dei menu principale di VS fare clic su: View->Test Explorer
  2. Fare clic con il pulsante destro del mouse sul metodo di test in Esplora test -> Debug
  3. Fare clic sul additional outputcollegamento come mostrato nello screenshot qui sotto.

inserisci qui la descrizione dell'immagine

Puoi usare:

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

tutto accederà alla finestra di output aggiuntiva.


-1

Trace.WriteLinedovrebbe funzionare a condizione di selezionare l'output corretto (il menu a discesa etichettato con "Mostra output da" che si trova nella finestra Output ).

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.