Comment écrire dans Console.Out pendant l'exécution d'un test MSTest

114

Contexte:
certains utilisateurs signalent des problèmes avec une fonction de téléchargement de fichiers dans notre application Web. Cela n'arrive qu'occasionnellement et sans motif particulier. Nous essayons de le comprendre depuis longtemps, en ajoutant des informations de débogage partout où nous pouvons penser que cela pourrait aider, en explorant les journaux, etc., mais nous n'avons pas été en mesure de le reproduire ou de le comprendre.

Problème:
j'essaie maintenant de reproduire cela en utilisant MSTest et WatiN pour répéter l'opération qui est censée échouer un grand nombre de fois (plusieurs centaines). Juste pour avoir une idée de la progression du test dans la boucle, je veux imprimer quelque chose comme:

Console.WriteLine(String.Format("Uploaded file, attempt {0} of {1}", i, maxUploads));

Cela n'apparaît cependant pas dans la fenêtre Sortie. Maintenant, je sais que vous obtiendrez la sortie de la console dans les résultats du test (ainsi que ce que vous produisez, Debug.Writelineetc.), mais cela n'est disponible qu'après la fin du test. Et comme mon test avec des centaines de répétitions pourrait prendre un certain temps, j'aimerais savoir jusqu'où il est allé.

Question:
Existe - t-il un moyen d'obtenir la sortie de la console dans la fenêtre Sortie pendant l' exécution du test?

julien
la source
Si vous recherchez un moyen d'imprimer sur la sortie des résultats du test: stackoverflow.com/a/4787047/621690
Risadinha

Réponses:

111

La sortie de la console n'apparaît pas car le code backend n'est pas en cours d'exécution dans le contexte du test.

Il vaut probablement mieux utiliser Trace.WriteLine(Dans System.Diagnostics), puis ajouter un écouteur de trace qui écrit dans un fichier.

Cette rubrique de MSDN montre une façon de procéder.


Selon les commentaires de Marty Neal et Dave Anderson:

using System;
using System.Diagnostics;

...

Trace.Listeners.Add(new TextWriterTraceListener(Console.Out));
// or Trace.Listeners.Add(new ConsoleTraceListener());
Trace.WriteLine("Hello World");
Andras Zoltan
la source
73
si fondamentalement, Trace.Listeners.Add(new TextWriterTraceListener(Console.Out)); Trace.WriteLine("Hello World");
Marty Neal
7
Hmmm, je trouve que la suggestion de @Martin Neal envoie les deux Trace.WriteLine()et la Console.WriteLine()sortie à la vue des résultats de test , pas à la vue de sortie . (Et notez que dans la vue des résultats de test , il peut être nécessaire d'ajouter la colonne Sortie (Stdout) en cliquant avec le bouton droit et en sélectionnant Ajouter / Supprimer des colonnes .... ) Mais, peut-être que je ne vois toujours pas la sortie dans la sortie Voir signifie que je manque quelque chose ...
DavidRR
3
Trace.Listeners.Add(new ConsoleTraceListener());est suffisant, puis Afficher la sortie du débogage dans la fenêtre de sortie.
Dave Anderson
3
J'avais du mal à trouver la sortie dans VS2017 ... Fenêtre TestExplorer -> Cliquez sur un test individuel -> Si le test avait une sortie, dans la fenêtre de détail sous le temps écoulé, il y a le mot "sortie" qui est un lien vers une nouvelle fenêtre.
Mike Walsh
2
Si vous utilisez Xunit, insérez simplement ITestOutputHelper via le ctor et appelez WriteLine dessus. Il a fallu du temps avant de découvrir comment écrire pendant les tests d'intégration, j'espère que cela aidera quelqu'un.
Alexander Høst
69

Utilisez le Debug.WriteLine. Cela affichera votre message dans la Outputfenêtre immédiatement. La seule restriction est que vous devez exécuter votre test en Debugmode.

[TestMethod]
public void TestMethod1()
{
    Debug.WriteLine("Time {0}", DateTime.Now);
    System.Threading.Thread.Sleep(30000);
    Debug.WriteLine("Time {0}", DateTime.Now);
}

Production

entrez la description de l'image ici

chaliasos
la source
8
nécessiteusing System.Diagnostics;
kmote
5
N'utilisez pas DateTime.Now. Il est préférable d'utiliser Stopwatch ( msdn.microsoft.com/en-us/library/… )
suizo
1
Je n'ai pas pu faire fonctionner ça. Lorsque j'exécute le test, la fenêtre de sortie passe immédiatement à Build et rien n'est envoyé à Debug. Tes pensées?
InteXX
5
@InteXX assurez-vous de cliquer sur "Déboguer le test" et non sur "Exécuter le test". ça a marché pour moi
John Henckel
@JohnHenckel: Gotcha. Merci. Fera cela. En fait, Schaliasos dit exactement ce droit dans sa réponse; je ne sais pas comment je l'ai manqué.
InteXX
13

J'ai trouvé ma propre solution. Je sais que la réponse d'Andras est probablement la plus cohérente avec MSTEST, mais je n'avais pas envie de refactoriser mon code.

[TestMethod]
public void OneIsOne()
{
    using (ConsoleRedirector cr = new ConsoleRedirector())
    {
        Assert.IsFalse(cr.ToString().Contains("New text"));
        /* call some method that writes "New text" to stdout */
        Assert.IsTrue(cr.ToString().Contains("New text"));
    }
}

Le jetable ConsoleRedirectorest défini comme:

internal class ConsoleRedirector : IDisposable
{
    private StringWriter _consoleOutput = new StringWriter();
    private TextWriter _originalConsoleOutput;
    public ConsoleRedirector()
    {
        this._originalConsoleOutput = Console.Out;
        Console.SetOut(_consoleOutput);
    }
    public void Dispose()
    {
        Console.SetOut(_originalConsoleOutput);
        Console.Write(this.ToString());
        this._consoleOutput.Dispose();
    }
    public override string ToString()
    {
        return this._consoleOutput.ToString();
    }
}
SimplyKnownAsG
la source
3

J'ai eu le même problème et j'ai «exécuté» les tests. Si à la place je «débogue» les tests, la sortie de débogage montre très bien comme tous les autres Trace et Console. Je ne sais pas cependant comment voir la sortie si vous "exécutez" les tests.

Gökhan Kurt
la source
Je peux obtenir quelque chose à afficher System.Diagnostics.Debug.WriteLinelors du débogage des tests, mais comment vous mettre Console.WriteLineau travail? Cela ne se termine pas dans la sortie normale (mise à jour en direct) pour moi.
OR Mapper
Avez-vous trouvé des moyens de voir les résultats lors de l'exécution des tests?
hima
0

Vous feriez mieux de configurer un seul test et de créer un test de performance à partir de ce test. De cette façon, vous pouvez surveiller la progression à l'aide du jeu d'outils par défaut.

Riezebosch
la source
"De cette façon, vous pouvez suivre la progression en utilisant le jeu d'outils par défaut." - Comment? Le problème que je vois est exactement qu'une fois qu'un test s'exécute, c'est une boîte noire et je ne vois que la sortie (que j'écris progressivement pendant que le test est en cours d'exécution) après la fin du test, dans la fenêtre Sortie .
OR Mapper