web-dev-qa-db-fra.com

Comment écrire sur Console.Out lors de l'exécution d'un test MSTest

Contexte:
Certains utilisateurs ont signalé des problèmes liés à une fonctionnalité de téléchargement de fichier dans notre application Web. Cela n'arrive qu'occasionnellement et sans motif particulier. Nous essayons de résoudre ce problème 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 supposée échouer un grand nombre de fois (plusieurs centaines). Juste pour avoir une idée de la distance parcourue par le test, je veux imprimer quelque chose comme:

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

Cela n'apparaît toutefois pas dans la fenêtre de sortie. Maintenant, je sais que vous aurez la sortie de la console dans les résultats du test (ainsi que ce que vous avez généré à partir de Debug.Writeline etc), mais ceci n’est disponible que après le test est terminé. 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 de sortie pendant l'exécution du test ?

108
Julian

La sortie de la console n'apparaît pas car le code de base n'est pas exécuté dans le contexte du test.

Vous ferez probablement mieux d'utiliser Trace.WriteLine (Dans System.Diagnostics), puis en ajoutant un écouteur de trace qui écrit dans un fichier.

Cette rubrique de MSDN montre un moyen de le faire.


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");
105
Andras Zoltan

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

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

sortie

enter image description here

69
chaliasos

J'ai trouvé une solution personnelle. Je sais que la réponse d'Andras est probablement la plus compatible 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 ConsoleRedirector est 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();
    }
}
13
SimplyKnownAsG

J'avais le même problème et je "courais" les tests. Si, au lieu de cela, je "débogue" les tests, la sortie de débogage montre très bien comme tous les autres Trace et Console. Je ne sais cependant pas comment afficher le résultat si vous "exécutez" les tests.

3
Gökhan Kurt

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.

0
riezebosch