216 votes

Puis-je écrire dans la console dans un test unitaire ? Si oui, pourquoi la fenêtre de la console ne s'ouvre-t-elle pas ?

J'ai un projet de test dans Visual Studio. J'utilise Microsoft.VisualStudio.TestTools.UnitTesting .

J'ajoute cette ligne dans un de mes tests unitaires :

Console.WriteLine("Some foo was very angry with boo");
Console.ReadLine();

Lorsque je lance le test, celui-ci passe, mais la fenêtre de la console ne s'ouvre pas du tout.

Existe-t-il un moyen de rendre la fenêtre de la console disponible pour une interaction via un test unitaire ?

2 votes

Cela dépend vraiment de l'exécuteur. Vous pouvez utiliser TestDriven.Net (un excellent exécuteur de tests, gratuit pour un usage personnel) - Console.WriteLine écrira dans le panneau de sortie VS.

1 votes

Merci de faire connaître TestDriven.Net.

0 votes

NCrunch dispose également de cette fonctionnalité, ce qui, à lui seul, en justifie le prix, selon moi. J'ai un Dump qui affiche le contenu de l'objet dans la console, ce qui facilite grandement le débogage. i.imgur.com/MEZwy7X.png

143voto

Michael Edenfield Points 15298

NOTE : La réponse originale ci-dessous devrait fonctionner pour toutes les versions de Visual Studio jusqu'à Visual Studio 2012. Visual Studio 2013 ne semble plus avoir de fenêtre de résultats de test. Au lieu de cela, si vous avez besoin d'une sortie spécifique au test, vous pouvez utiliser la suggestion de @Stretch de Trace.Write() pour écrire la sortie dans la fenêtre de sortie.


Le site Console.Write n'écrit pas dans la "console" - elle écrit dans ce qui est connecté au handle de sortie standard du processus en cours. De même, Console.Read lit l'entrée de ce qui est connecté à l'entrée standard.

Lorsque vous exécutez un test unitaire via Visual Studio 2010, la sortie standard est redirigée par le harnais de test et stockée comme partie de la sortie du test. Vous pouvez voir cela en cliquant avec le bouton droit de la souris sur la fenêtre des résultats du test et en ajoutant la colonne nommée "Output (StdOut)" à l'affichage. Cela affichera tout ce qui a été écrit sur la sortie standard.

Vous pourrait ouvrir manuellement une fenêtre de console, en utilisant P/Invocation comme sinni800 dit . De la lecture du AllocConsole la documentation, il semble que la fonction réinitialise stdin et stdout pour pointer vers la nouvelle fenêtre de la console. (Je ne suis pas sûr à 100% de cela ; cela me semble un peu faux si j'ai déjà redirigé stdout pour que Windows me le vole, mais je n'ai pas essayé).

En général, cependant, je pense que c'est une mauvaise idée ; si tout ce que vous voulez utiliser la console est d'obtenir plus d'informations sur votre test unitaire, la sortie est là pour vous. Continuez à utiliser Console.WriteLine comme vous le faites, et vérifiez les résultats de sortie dans la fenêtre Résultats du test quand c'est fait.

1 votes

Essayez d'ouvrir une nouvelle WindowsApplication, utilisez AllocConsole pour allouer une console et elle s'écrira là. Je ne sais pas ce que cela fait réellement mais cela pourrait ne pas fonctionner dans un environnement de test unitaire. Ce serait vraiment bien de savoir...

0 votes

hrm. relecture AllocConsole documentation, je peux me tromper, mais il faudrait que je le teste.

2 votes

Pour moi, ce commentaire de Michael disait tout ce à quoi je devais penser : "Lorsque vous exécutez un test unitaire via VS2010, la sortie standard est redirigée par le harnais de test et stockée comme faisant partie de la sortie du test."

57voto

Dmitry Pavlov Points 2260

Vous pouvez utiliser cette ligne pour écrire à Fenêtre de sortie du Visual Studio :

System.Diagnostics.Debug.WriteLine("Matrix has you...");

Doit être exécuté en mode débogage.

1 votes

consultez ce fil de discussion pour les détails - stackoverflow.com/questions/1159755/

1 votes

Cela a bien fonctionné pour moi en utilisant MSTest et R# pour visualiser la sortie. Merci !

3 votes

@William il apparaît si vous déboguez un test, mais pas si vous l'exécutez simplement sans déboguer.

32voto

Wonko the Sane Points 6119

Comme indiqué, les tests unitaires sont conçus pour s'exécuter sans interaction.

Cependant, vous pouvez déboguer des tests unitaires, comme tout autre code. Le moyen le plus simple est d'utiliser la fonction Debug dans l'onglet Résultats du test.

Être capable de déboguer signifie être capable d'utiliser des points d'arrêt. Être capable d'utiliser des points d'arrêt signifie donc être capable d'utiliser Tracepoints que je trouve extrêmement utile dans le débogage de tous les jours.

Essentiellement, les Tracepoints vous permettent d'écrire dans la section Sortie (ou, plus précisément, à la sortie standard). En option, vous pouvez poursuivre l'exécution, ou vous pouvez l'arrêter comme un point d'arrêt normal. Cela vous donne la "fonctionnalité" que vous demandez, sans avoir besoin de reconstruire votre code, ou de le remplir d'informations de débogage.

Il suffit d'ajouter un point d'arrêt, puis de cliquer avec le bouton droit de la souris sur ce point d'arrêt. Sélectionnez l'option "When Hit..." :

When hitting option

Ce qui amène le dialogue :

When a breakpoint is hit

Quelques points à noter :

  1. Remarquez que le point d'arrêt est maintenant représenté par un diamant, au lieu d'une sphère, indiquant un point de trace.
  2. Vous pouvez afficher la valeur d'une variable en l'entourant comme {this}.
  3. Décochez la case "Continuer l'exécution" pour que le code s'arrête sur cette ligne, comme n'importe quel point d'arrêt normal.
  4. Vous avez la possibilité d'exécuter une macro. Soyez prudent - vous pouvez provoquer des effets secondaires néfastes.

Consultez la documentation pour plus de détails.

19voto

Sturla Points 41

Vous pouvez utiliser

Trace.WriteLine()

pour écrire dans le Sortie lors du débogage d'un test unitaire.

4voto

sinni800 Points 919

Tout d'abord, les tests unitaires sont, par design qui est censé fonctionner complètement sans interaction.

Cela dit, je ne pense pas qu'il y ait une possibilité à laquelle on ait pensé.

Vous pouvez essayer de pirater le AllocConsole P/Invoke qui ouvrira une console même si votre application actuelle est une application GUI. Le site Console sera ensuite affichée dans la console ouverte.

1 votes

Hmm Ma motivation principale est d'écrire quelques données supplémentaires dans la console pour voir des détails plus profonds. Ce sera une chose adhoc dont je n'aurai peut-être pas besoin plus tard.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X