2013-02-26 12 views
23

Sto usando xUnit con il runner di prova ReSharper e il plug-in del plug-in xUnitContrib.Utilizzo di ReSharper, come visualizzare l'output di debug durante un test unitario di lunga durata?

Quando si esegue un test di lunga durata, mi piacerebbe essere in grado di fornire un indicatore di avanzamento alla finestra di output dell'unità di test.

Ho provato Debug.WriteLines, Trace.WriteLine e Console.WriteLine. Tutti hanno lo stesso comportamento: nulla viene mostrato nella finestra di output fino al completamento del test.

Ad esempio:

[Fact] 
public void Test() 
{ 
    Debug.WriteLine("A"); 
    Trace.WriteLine("B"); 
    Console.WriteLine("C"); 

    Thread.Sleep(10000); 
} 

Il test mostra alcuna uscita finché i 10 secondi trascorsi e la prova completa. Come ottengo l'output lungo la strada?

UPDATE 1

Ho provato anche con MSTest e NUnit. NUnit è l'unico che mostra l'output lungo la strada.

MSTest e XUnit non restituiscono alcun output fino al completamento del test. La parte strana è che, mentre l'uscita di test xUnit e NUnit si presenta così:

A 
B 
C 

L'uscita MSTest assomiglia a questo:

C 


Debug Trace: 

A 
B 

Dato tutte queste variazioni, credo che la risposta è che è fino all'implementazione del runner di prova per decidere come e quando produrre. Qualcuno sa se è possibile configurare XUnit test runner?

UPDATE 2

Penso che questo deve essere un deficit di xUnitContrib. Inserito nel loro CodePlex issue tracker.

+0

Debug.WriteLine() funziona perfettamente bene per me quando sono in modalità di debug. Quindi se vuoi accedere in generale, ti consiglio la risposta di brenton – derape

+0

@derape - No, non funziona con xunit. Nessun output appare fino al completamento del test. –

+0

Vedo, non ho giocato con XUnit - solo NUnit. E la registrazione NUnit funziona lungo i thread di debug ... – brenton

risposta

0

Il più semplice che ho trovato è quello di utilizzare log4net e creare un logger di console. Lungo la strada, mentre corri, chiameresti logger.Info ("informazioni qui"); o log.Debug ("informazioni qui"); - Qualunque sia il tuo livello di registrazione preferito - e l'output verrà mostrato in Session di test unità di ricerca.

Maggiori informazioni sul framework log4net on the Apache log4net homepage. Anche lo configuration examples sarà inestimabile.

+0

No. Aggiunto log4net, e quei messaggi non riescono nemmeno a farne l'output del test unitario. Ho usato un semplice appender per console: quello degli esempi. –

7

ReSharper qualche modo rimosso l'ascoltatore predefinito in unit test.Per visualizzare il testo nella finestra di output, basta aggiungere questa riga:

Debug.Listeners.Add(new DefaultTraceListener()); 
+0

Questo non ha funzionato per me, nella finestra Sessioni dell'unità di test o nella finestra Output (utilizzando MSTest). –

21

Se è stato utilizzato xUnit.net 1.x, si può avere precedentemente iscritto uscita al Console, Debug o Trace. Quando xUnit.net v2 è stato spedito con la parallela attivata per impostazione predefinita, questo meccanismo di cattura dell'output non era più appropriato; è impossibile sapere quali dei numerosi test che potrebbero essere eseguiti in parallelo erano responsabili della scrittura di in quelle risorse condivise. Gli utenti che stanno effettuando il porting del codice da v1.x a v2.x devono utilizzare invece uno dei due nuovi metodi.

Date un'occhiata qui per esempio di come eseguire la registrazione con xUnit.net v2:

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

Questo è l'esempio:

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

Questo è esattamente quello che stavo cercando. Grazie! – nrodic

+0

Ciò è utile per scrivere l'output all'interno dei test, ma quando è necessario generare informazioni in tempo reale dal codice chiamato dai test, è necessario modificare il codice sottoposto a test per passare e utilizzare 'ITestOutputHelper'. Comprendo il problema della concorrenza che rende difficile gestire l'output dal codice, volevo solo far notare agli altri che questa soluzione ha una limitazione. Sarebbe bello sfruttare qualcosa come ascoltatori di tracce o dirottare il flusso di output predefinito per i metodi 'Debug.Write *'. –

Problemi correlati