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


148

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

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

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

Lorsque j'exécute le test, le test réussit, 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 interagir via un test unitaire?


1
Cela dépend vraiment du coureur. Vous pouvez utiliser TestDriven.Net (un excellent, gratuit pour un usage personnel, testeur) - Console.WriteLine écrira dans le volet de sortie VS.
seldary

1
Merci d'avoir fait passer le mot sur TestDriven.Net
GrayFox374

NCrunch possède également cette fonctionnalité, qui à elle seule en vaut le prix IMO. J'ai une Dumpméthode d'extension qui génère le contenu de l'objet dans la console, ce qui facilite grandement le débogage. i.imgur.com/MEZwy7X.png
DharmaTurtle

Réponses:


125

REMARQUE: la réponse d'origine ci-dessous doit fonctionner pour n'importe quelle version de Visual Studio jusqu'à Visual Studio 2012. Visual Studio 2013 ne semble plus avoir de fenêtre 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 Trace.Write()pour écrire la sortie dans la fenêtre Sortie.


La Console.Writeméthode n'écrit pas dans la "console" - elle écrit sur tout ce qui est connecté au descripteur de sortie standard pour le processus en cours. De même, Console.Readlit l'entrée à partir de tout 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 faisceau de test et stockée dans le cadre de la sortie de test. Vous pouvez le voir en cliquant avec le bouton droit de la souris sur la fenêtre Résultats du test et en ajoutant la colonne nommée "Output (StdOut)" à l'affichage. Cela montrera tout ce qui a été écrit sur la sortie standard.

Vous pouvez ouvrir manuellement une fenêtre de console, en utilisant P / Invoke comme le dit sinni800 . À la lecture de la AllocConsoledocumentation, il semble que la fonction se réinitialise stdinet stdoutgère pour pointer vers la nouvelle fenêtre de console. (Je ne suis pas sûr à 100% à ce sujet; cela me semble un peu faux si j'ai déjà redirigé stdoutpour 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 vous ne souhaitez utiliser la console que pour vider plus d'informations sur votre test unitaire, la sortie est là pour vous. Continuez à utiliser Console.WriteLinela façon dont vous êtes et vérifiez les résultats de sortie dans la fenêtre Résultats du test lorsque vous avez terminé.


Essayez d'ouvrir une nouvelle application Windows, en utilisant AllocConsole pour allouer une console et elle y écrira. Je ne sais pas ce que cela fait vraiment mais cela pourrait ne pas fonctionner dans un environnement de test unitaire. Il serait vraiment bon de savoir ...
sinni800

hrm. relire la AllocConsoledocumentation, je me trompe peut-être, mais je devrais la tester.
Michael Edenfield

2
Pour moi, ce commentaire de Michael disait tout ce à quoi je devais réfléchir: "Lorsque vous exécutez un test unitaire via VS2010, la sortie standard est redirigée par le faisceau de test et stockée dans le cadre de la sortie de test."
Robert Patterson

5
dans VS2013, si vous écrivez sur la console, il y aura une étiquette de lien [Sortie] sur le TestExplorer / Test / Summary. Cliquez dessus et vous obtenez la sortie souhaitée. Attendre? Vous souhaitez également appeler Console.ReadLine () ??
Visar le

3
Dans V2017 (Communauté), allez dans "explorateur de test", sélectionnez l'item de résultat du test dans la liste, puis cliquez sur le lien "sortie" de l'autre fenêtre (fenêtre de résultat du test?). Puisqu'il sera probablement tronqué, utilisez le "copier tout" et passez ailleurs.
heringer

180

Quelqu'un a commenté cette fonctionnalité apparemment nouvelle dans Visual Studio 2013. Je n'étais pas sûr de ce qu'il voulait dire au début, mais maintenant que je le fais, je pense qu'elle mérite sa propre réponse.

Nous pouvons utiliser Console.WriteLine normalement et la sortie est affichée, mais pas dans la fenêtre Sortie, mais dans une nouvelle fenêtre après avoir cliqué sur "Sortie" dans les détails du test.

Entrez la description de l'image ici


2
Excellente solution. Confirmez que cela fonctionne dans VS2015 Enterprise.
garfbradaz

6
Malheureusement, on ne peut pas sélectionner de texte dans cette zone de sortie pour copier-coller: (À quoi pensaient-ils?!
OR Mapper

3
@ORMapper, faites un clic droit sur la zone "Sortie standard" et choisissez Copier tout
hasard le

2
@ Ovi-WanKenobi essayez de produire quelque chose avec Console.Write
Tiago Duarte

5
En vs 2017, vous devez sélectionner CHAQUE test exécuté, puis cliquer sur la sortie - pas très utile lorsque vous avez beaucoup de tests. Je veux voir toute la sortie ensemble - pas dans des fenêtres séparées.
inliner49er

37

Vous pouvez utiliser cette ligne pour écrire dans la fenêtre de sortie de Visual Studio:

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

Doit s'exécuter en mode débogage.


7
Il n'écrit pas sur mon VS
Luis Filipe

1
consultez ce fil pour les détails - stackoverflow.com/questions/1159755/…
Dmitry Pavlov

1
Cela a très bien fonctionné pour moi en utilisant MSTest et R # pour afficher la sortie. Merci!
Isaac Baker

2
@William cela apparaît si vous déboguez un test, mais pas si vous l'exécutez simplement sans débogage.
yoyo le

29

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 consiste à utiliser le Debugbouton dans l'onglet Résultats du test.

Être capable de déboguer signifie être capable d'utiliser des points d'arrêt. Pouvoir utiliser des points d'arrêt signifie donc pouvoir utiliser des points de trace , ce que je trouve extrêmement utile dans le débogage quotidien.

Essentiellement, les Tracepoints vous permettent d'écrire dans la fenêtre Sortie (ou, plus précisément, sur la sortie standard). Vous pouvez éventuellement continuer à exécuter ou vous pouvez vous 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 avec des informations de débogage.

Ajoutez simplement un point d'arrêt, puis cliquez avec le bouton droit sur ce point d'arrêt. Sélectionnez l'option "Quand vous êtes touché ...":

En frappant l'option

Ce qui fait apparaître la boîte de dialogue:

Lorsqu'un point d'arrêt est atteint

Quelques points à noter:

  1. Notez que le point d'arrêt est maintenant affiché sous forme de diamant, au lieu d'une sphère, indiquant un point de trace
  2. Vous pouvez afficher la valeur d'une variable en la plaçant comme {this}.
  3. Décochez la case "Continuer l'exécution" pour que le code soit interrompu sur cette ligne, comme tout point d'arrêt normal
  4. Vous avez la possibilité d'exécuter une macro. Soyez prudent - vous pouvez provoquer des effets secondaires nocifs.

Consultez la documentation pour plus de détails.


24

Il existe plusieurs façons d'écrire la sortie d'un test unitaire Visual Studio en C #:

  • Console.Write - Le harnais de test Visual Studio capture cela et l'affiche lorsque vous sélectionnez le test dans l'Explorateur de tests et cliquez sur le lien Sortie. Ne pas apparaître dans la fenêtre de sortie de Visual Studio lorsque l' en cours d' exécution ou le débogage d' un test unitaire (sans doute cela est un bug).
  • Debug.Write - Le harnais de test Visual Studio capture cela et l'affiche dans la sortie de test. Apparaît dans la fenêtre de sortie de Visual Studio lors du débogage d'un test unitaire, sauf si les options de débogage de Visual Studio sont configurées pour rediriger la sortie vers la fenêtre d'exécution. Rien n'apparaîtra dans la fenêtre Sortie (ou Immédiat) si vous exécutez simplement le test sans débogage. Par défaut, disponible uniquement dans une version Debug (c'est-à-dire lorsque la constante DEBUG est définie).
  • Trace.Write - Le harnais de test Visual Studio le capturera et l'affichera dans la sortie du test. Apparaît dans la fenêtre Visual Studio Output (ou Immediate) lors du débogage d'un test unitaire (mais pas lors de l'exécution du test sans débogage). Par défaut, disponible dans les versions Debug et Release (c'est-à-dire lorsque la constante TRACE est définie).

Confirmé dans Visual Studio 2013 Professional.


1
Notez que les règles sont légèrement différentes si vous utilisez NUnit et l'extension NUnit Test Adapter pour Visual Studio plutôt que le framework de test Microsoft intégré.
yoyo

9

Vous pouvez utiliser

Trace.WriteLine()

pour écrire dans la fenêtre Sortie lors du débogage d'un test unitaire.


5

Dans Visual Studio 2017, «TestContext» n'affiche pas le lien de sortie dans l'Explorateur de tests.

Cependant, Trace.Writeline () affiche le lien de sortie.


Juste un FYI, sa trace.WriteLine
TroySteven

4

Tout d'abord, les tests unitaires sont, de par leur conception , censés s'exécuter complètement sans interaction.

Cela dit, je ne pense pas qu'il y ait une possibilité qui a été envisagée.

Vous pouvez essayer le piratage avec AllocConsole P / Invoke qui ouvrira une console même lorsque votre application actuelle est une application GUI. La Consoleclasse publiera ensuite sur la console maintenant ouverte.


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


2

À mon humble avis, les messages de sortie ne sont pertinents que pour les cas de test ayant échoué dans la plupart des cas. J'ai créé le format ci-dessous et vous pouvez également créer le vôtre. Cela s'affiche dans la fenêtre de l'Explorateur de tests Visual Studio elle-même.

Comment pouvons-nous lancer ce message dans la fenêtre de l'Explorateur de tests de Visual Studio?

Un exemple de code comme celui-ci devrait fonctionner:

if(test_condition_fails)
    Assert.Fail(@"Test Type: Positive/Negative.
                Mock Properties: someclass.propertyOne: True
                someclass.propertyTwo: True
                Test Properties: someclass.testPropertyOne: True
                someclass.testPropertyOne: False
                Reason for Failure: The Mail was not sent on Success Task completion.");

Vous pouvez avoir une classe distincte dédiée à cela pour vous.


J'ai pensé que j'ajouterais cela aussi. Dans Visual Studio 2019 à l'aide de XUNIT, vous pouvez effectuer les opérations suivantes: Assert.True (success, "DELETE RECORD FAILED"); DELETE RECORD FAILED apparaîtra alors dans VS 2019 Test Explorer. Encore une fois, comme la réponse ci-dessus, cela ne fonctionne que lorsque votre test unitaire a échoué à la condition attendue.
TroySteven

1

J'ai une solution plus simple (que j'ai moi-même utilisée récemment, pour une foule de raisons paresseuses). Ajoutez cette méthode à la classe dans laquelle vous travaillez:

public static void DumbDebug(string message)
{
    File.WriteAllText(@"C:\AdHocConsole\" + message + ".txt", "this is really dumb. I wish Microsoft had more obvious solutions to its solutions problems.");
}

Ensuite ... ouvrez le répertoire AdHocConsole, et triez par heure de création. Assurez-vous que lorsque vous ajoutez vos «déclarations d'impression». Ils sont cependant distincts, sinon il y aura de la jonglerie.


0

Visual Studio pour Mac

Aucune des autres solutions ne fonctionnait sur Visual Studio pour Mac

Si vous utilisez NUnit , vous pouvez ajouter un petit .NET projet de console à votre solution, puis référencer le projet que vous souhaitez tester dans les références de ce nouveau projet de console. .

Tout ce que vous faisiez dans vos [Test()]méthodes peut être fait dans l' Mainapplication console de cette manière:

class MainClass
{
    public static void Main(string[] args)
    {
        Console.WriteLine("Console");

        // Reproduce the unit test
        var classToTest = new ClassToTest();
        var expected = 42;
        var actual = classToTest.MeaningOfLife();
        Console.WriteLine($"Pass: {expected.Equals(actual)}, expected={expected}, actual={actual}");
    }
}

Vous êtes libre d'utiliser Console.Writeet Console.WriteLinedans votre code dans ces circonstances.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.