Comment exécuter NUnit en mode débogage à partir de Visual Studio?

120

J'ai récemment construit un framework de test pour un peu de C # sur lequel j'ai travaillé. J'ai installé NUnit et un nouveau projet dans mon espace de travail pour tester le composant. Tout fonctionne bien si je charge mes tests unitaires depuis Nunit (v2.4), mais j'en suis arrivé au point où il serait vraiment utile d'exécuter en mode débogage et de définir des points d'arrêt.

J'ai essayé les suggestions de plusieurs guides qui suggèrent tous de modifier les propriétés 'Debug' du projet de test:

Start external program: C:\Program Files\NUnit 2.4.8\bin\nunit-console.exe
Command line arguments: /assembly: <full-path-to-solution>\TestDSP\bin\Debug\TestDSP.dll

J'utilise la version console là-bas, mais j'ai également essayé d'appeler l'interface graphique. Les deux me donnent la même erreur lorsque j'essaye de démarrer le débogage:

Cannot start test project 'TestDSP' because the project does not contain any tests.

Est-ce parce que je charge normalement \ DSP.nunit dans l'interface graphique Nunit et que c'est là que se déroulent les tests?

Je commence à penser que le problème peut être que VS veut exécuter son propre cadre de test et c'est pourquoi il ne parvient pas à trouver les tests NUnit?

Edit : Pour ceux qui posent des questions sur les appareils de test, l'un de mes fichiers .cs dans le projet TestDSP ressemble à peu près à ceci:

namespace Some.TestNamespace
{
    // Testing framework includes
    using NUnit.Framework;

    [TestFixture]
    public class FirFilterTest
    {
        [Test]
        public void Test01_ConstructorTest()
        {
            ...some tests...
        }
    }
}

... Je suis assez nouveau sur C # et le framework de test NUnit, il est donc tout à fait possible que j'aie manqué des informations cruciales ;-)

Solution finale : Le gros problème était le projet que j'avais utilisé. Si vous choisissez Other Languages -> Visual C# -> Test -> Test Project... lorsque vous choisissez le type de projet, Visual Studio essaiera d'utiliser son propre cadre de test pour autant que je sache. Vous devez choisir un projet de bibliothèque de classes C # normal à la place, puis les instructions de ma réponse sélectionnée fonctionneront.

Jon Cage
la source
Votre classe de montage de test me semble correcte, donc cela doit être quelque chose dans le projet comme vous l'avez suggéré.
Patrick McDonald
2
Ressemble à cette question: stackoverflow.com/questions/247900/... La réponse est la même ...
Patrick Desjardins

Réponses:

46

J'utilise la même technique que vous essayez Jon, sans le drapeau / assembly, ie

Start External Program: C:\Program Files\NUnit 2.4.8\bin\nunit.exe

Command line arguments: "<path>\bin\Debug\Quotes.Domain.Tests.dll"

TestDSP.dll contient-il tous vos TestFixtures?

Comme mon projet de test n'est pas le projet de démarrage de la solution, j'exécute mes tests en cliquant avec le bouton droit sur le projet de test et en choisissant Déboguer -> Démarrer une nouvelle instance

Patrick McDonald
la source
1
J'ai essayé ce que vous avez suggéré (en supprimant l'assembly /) mais cela ne fait aucune différence. Lorsque je démarre une nouvelle instance, cela produit l'erreur. Je pense que c'est principalement lié au fait que lorsque j'ai créé le projet TestDSP, je l'ai créé à partir du modèle de projet de test VisualStudio intégré, il recherche donc le mauvais cadre de test.
Jon Cage
3
Enfin ça marche. J'avais raison dans la mesure où ce sont les options du projet qui l'ont arrêté - recréer le projet de test en utilisant le modèle de classe standard a résolu le problème.
Jon Cage
1
Cela aide si vous ajoutez également /runà vos * arguments de ligne de commande qui commenceront automatiquement à exécuter des tests ... J'ai également tout résumé (en utilisant des images) dans mon article de blog .
Robert Koritnik
6
Au cas où les gens ne consultent pas le blog (très utile) de Robert ( erraticdev.blogspot.com/2012/01/… ): pour .NET 4.0 et versions ultérieures, je pense que vous devez également l'ajouter à nunit.exe.config : <startup> <supportedRuntime version = "4.0" /> </startup>.
devuxer le
3
Suivi: Dans les versions ultérieures de NUnit (la dernière version à ce jour est la v2.6.1), vous devez commenter <supportedRuntime version="v2.0.50727" />dans nunit.exe.config.
devuxer
102

Quand j'ai besoin de déboguer mes tests NUnit, je m'attache simplement à l'application GUI NUnit en nunit-agent.exeutilisant "Debug | Attach to Process" et j'exécute les tests à partir de l'interface graphique. Tous les points d'arrêt de mes tests (ou du code qu'ils testent) sont atteints. Suis-je mal compris votre question, ou est-ce que cela fonctionnera pour vous?

Matt Hamilton
la source
7
Pour votre information (et celle des autres): le Debug | Attach n'est pas disponible dans les éditions Express de VS.
Richard
15
Sachez que vous devez sélectionner «Activer le support Visual Studio» dans la boîte de dialogue Paramètres de NUnit -> Support IDE
Julio Garcia
8
Pour .NET 4.0 et versions ultérieures, je crois que vous devez également ajouter à nunit.exe.config: <startup> <supportedRuntime version="4.0" /> </startup>.
devuxer
1
Il s'agit d'un raccourci rapide pour attacher au processus approprié (exécuté dans la console du gestionnaire de package): ($ dte.Debugger.LocalProcesses |? {$ _. Name.EndsWith ("nunit-agent.exe")}). Attach ()
bart
7
Pour info: vous devez attacher le débogage au processus appelé "nunit-agent.exe" et PAS "nunit.exe". Sinon, vos points d'arrêt sont ignorés et vous vous demandez pourquoi ...
Jenny O'Reilly
21

Supprimez simplement la ligne qui ressemble à

<ProjectTypeGuids>
    {3AC096D0-A1C2-E12C-1390-A8335801FDAB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
</ProjectTypeGuids>

à partir de votre fichier de projet. Cette ligne indique essentiellement à VS.Net qu'il s'agit d'un projet de test, donc le "Impossible de démarrer le projet de test". Pour info ici le 1er Guid dit "c'est un test", le 2ème dit "c'est C #". Pour plus d'informations sur ces Guids: http://www.mztools.com/Articles/2008/MZ2008017.aspx

utilisateur276648
la source
18

En plus de la réponse fournie par @Justin, voici quelques détails supplémentaires sur NUnit 2.6.

À l'aide de NUnit 2.6, attachez-vous à nunit.exe ou nunit-console.exe et NON à l'agent. La configuration notée par @Justin est légèrement différente. Voici un exemple de nunit.exe.config (idem pour nunit-console.exe.config).

<startup useLegacyV2RuntimeActivationPolicy="true">
  <!-- Comment out the next line to force use of .NET 4.0 -->
  <supportedRuntime version="v2.0.50727" />  
  <supportedRuntime version="v4.0.30319" />
</startup>

Pour le projet de test .NET 4, pour obtenir des points d'arrêt, vous devrez commenter ou supprimer la ligne v2.0 comme le suggère le commentaire. Une fois que j'ai fait cela, j'ai pu déboguer le projet de test .NET 4.0.

dblood
la source
J'ai réussi avec seulement le v2.0.50727 ligne lors du débogage des assemblages .NET 2 de VS2005 avec nunit. (La v4ligne a empêché le débogueur de VS 2005 de se connecter.)
Martin Ba
17

Si vous utilisez NUnit 2.4 ou plus récent, vous pouvez mettre le code suivant dans votre SetUpFixtureclasse. (Vous pouvez le faire avec des versions plus anciennes, mais vous devrez faire tout l'équivalent du SetUpFixture, ou le copier dans le test lui-même.)

[SetUpFixture]
public class SetupFixtureClass
{
    [SetUp]
    public void StartTesting()
    {
        System.Diagnostics.Debugger.Launch();
    }
}

Cela Debugger.Launch()provoque l'affichage de la boîte de dialogue suivante lorsque vous cliquez sur Exécuter dans NUnit.

Boîte de dialogue Débogueur JIT

Vous choisissez ensuite votre instance en cours d'exécution de Visual Studio avec votre projet ouvert (le 2ème dans ma capture d'écran), puis le débogueur sera attaché et tous les points d'arrêt ou exceptions apparaîtront dans Visual Studio.

Scott Chamberlain
la source
12

Dans Nunit 3.0.1 (j'utilise VS2013), ouvrez depuis le menu principal> Test> Windows> Explorateur de tests. Ensuite, dans "Explorateur de tests", cliquez avec le bouton droit sur le cas de test, vous pourriez voir: entrez la description de l'image ici

J'espère que cela t'aides.

Quinn
la source
2
Merci pour cette réponse. Beaucoup plus simple que tous les autres.
dano
J'utilise NUnit 2.5.9 dans VS 2015 et cela fonctionne avec une extension VS nommée `` NUnit 2 Test Adapter ''. Vous pouvez exécuter le test dans la fenêtre de l'Explorateur de tests.
mggSoft
6

Installez TestDriven.NET , qui est un plugin pour Visual Studio

À partir de là, vous pouvez faire un clic droit sur votre assemblage de test unitaire et cliquer sur Exécuter les tests pour exécuter toute la suite, faire un clic droit sur une classe TestFixture pour exécuter uniquement les tests de cette classe, ou cliquer avec le bouton droit sur une méthode de test pour exécuter uniquement cette méthode.

Vous avez également la possibilité de tester avec le débogueur, si vous avez besoin d'un point d'arrêt dans vos tests en mode débogage.

Jon Limjap
la source
2
170 $ est ridiculement cher pour un tel outil. Prix ​​exorbitant, quelqu'un?
Ben Hardy
Ouais. Pour ce genre d'argent, je préfère investir dans JetBrains Resharper qui offre ensuite gratuitement le Test Runner avec une intégration de débogage et un tas d'autres fonctionnalités de productivité.
Roman
Avec Visual Studio 2012, vous pouvez obtenir gratuitement NUnit Test Runner avec Nuget.
Jon Limjap
6

Essayez NUnitit - un complément Visual Studio open source pour le débogage des cas de test NUnit

Page d'accueil - http://nunitit.codeplex.com/

Abhilash
la source
C'est plutôt bien même si je ne trouve pas de moyen de lui dire d'exécuter un seul test (?)
Jon Cage
3

Maintenant avec des images:

  1. Exécutez NUnit gui ( Téléchargez 2.6.2 à partir d'ici ) puis allez àFile -> Open Project

entrez la description de l'image ici

  1. Sélectionnez votre test .dlldans le dossier bin ( C:\......\[SolutionFolder][ProjectFolder]\bin\Debug\xxxxTests.dll)

  2. Accédez à Visual Studio Debug -> Attach to process(la fenêtre Attacher au processus s'ouvre)

  3. Dans la liste, faites défiler vers le bas et sélectionnez nunit-agent.exepuis cliquez surAttach

entrez la description de l'image ici

  1. À ce stade, les points d'arrêt de vos tests doivent devenir rouges mûrs (à partir de creux).

  2. Cliquez Runsur Nunit Guiet vous devriez obtenir votre point d'arrêt ...

J'espère que cela vous fera gagner du temps.

Matas Vaitkevicius
la source
2

Si vous parvenez à faire fonctionner la console / ou l'interface graphique, mais que vos points d'arrêt ne sont pas atteints, cela peut être dû au fait que votre application exécute un environnement d'exécution .NET différent de celui de NUnit. Vérifiez si votre nunit-console.exe.config / nunit.exe.config a le runtime spécifié. (Les configurations résident dans le même répertoire que les exe nunit.) Spécifiez le runtime à l'aide du nœud de démarrage:

<configuration>
    <startup>
       <supportedRuntime version="4.0" />
    </startup>
Justin Turner
la source
2

Si le chemin du projet contient des espaces, par exemple "Nouveau projet" dans le chemin, <path>\bin\Debug\New Project\Quotes.Domain.Tests.dllplacez le chemin du projet Option de démarrage -> Arguments de ligne de commande entre guillemets.

J'ai passé beaucoup de temps à comprendre cela.

Gyan Sada
la source
1

Concernant ce que M. Patrick McDonald a dit

Comme mon projet de test n'est pas le projet de démarrage de la solution, j'exécute mes tests en cliquant avec le bouton droit sur le projet de test et en choisissant Déboguer -> Démarrer une nouvelle instance

J'ai essayé de postuler pour ma bibliothèque de classes de test mais j'ai eu une erreur concernant le chemin, j'ai donc essayé de supprimer les 'Arguments de ligne de commande', et heureusement cela a bien fonctionné et comme prévu.

Abdul Rahman Kayali
la source
0

Il semble que vous essayez d'utiliser la mauvaise bibliothèque. NUnit ne peut démarrer que si la dll que vous utilisez contient TestFixtures.

+1 sur TestDriven.Net. J'ai eu la chance de l'utiliser plusieurs fois. Vous pouvez télécharger la version personnelle à des fins d'évaluation conformément à la licence sur http://testdriven.net/purchase_licenses.aspx .

Mike737
la source
Voir l'édition récente - J'ai un appareil de test bien qu'il soit tout à fait possible que je ne l'ai pas configuré correctement.
Jon Cage
0

J'ai eu la même erreur avec MSTest. J'ai trouvé que dans la fenêtre Sortie du test , certains des tests avaient des ID en double et ne pouvaient pas être chargés. J'ai supprimé tous les tests en double et maintenant j'ai pu exécuter les tests lorsque je démarre le projet.

Vijay
la source
0

Il existe également une extension maintenant "Visual NUnit" qui vous permettra d'exécuter les tests à partir de Visual Studio un peu comme la construction dans les poignées du framework de test. Vérifiez-le dans le gestionnaire d'extensions.

iamkrilline
la source
0

Ouvrez Visual Studio ---> votre projet ---> Sélectionnez `` Propriétés '' ---> Sélectionnez `` Déboguer '' -> Sélectionnez `` Démarrer le programme externe '' et définissez le chemin de votre NUnit ici (par exemple: Démarrer le programme externe = C : \ Program Files \ NUnit 2.6.2 \ bin \ nunit.exe) ----> Enregistrer

Après avoir défini cela, cliquez simplement sur Déboguer

Farija Khan
la source
0

Pour moi, la solution était d'adapter le fichier de configuration de l'unité. Pour utiliser nunit avec le framework 4.5-.Net et l'option de construction x64, j'ai dû ajouter une ligne à la balise de démarrage (version d'exécution prise en charge).

<startup useLegacyV2RuntimeActivationPolicy="true">
        <!-- Comment out the next line to force use of .NET 4.0 -->
        <supportedRuntime version="v4.0.30319" />
</startup>

Ensuite, je pourrais commencer par un clic droit sur le débogage Testproject -> Démarrer une nouvelle instance. Avant, je devais à nouveau attacher manuellement le projet au processus.

Mes propriétés de débogage étaient, C: \ Program Files (x86) \ NUnit 2.6.4 \ bin \ nunit.exe avec l'argument de l'emplacement du .dll à tester.

Plus d'informations: nunit pour tester avec .NET 4.0

HauiB
la source
-1

Voyez si cela aide .. Comment ajouter NUnit dans Visual Studio

(RighteousRant) Bien que personnellement je n'aime pas cette approche. Si vous avez besoin d'un débogueur pendant que vous testez votre code, c'est une "odeur" dans la mesure où vous n'avez pas assez de confiance / savez comment votre code fonctionne et avez besoin du débogueur pour vous le dire. TDD devrait vous libérer du besoin d'un débogueur s'il est bien fait. Utilisez «Joindre le débogueur à NUNit» uniquement dans de rares cas ou lorsque vous pataugez dans le code de quelqu'un d'autre.

Gishu
la source
J'ai essayé les suggestions en vain. Vous avez clairement un bon nez. Je sais que mon code ne fonctionne pas car la sortie que j'obtiens pour le premier bloc d'implémentation obtient des réponses très différentes à ma référence de test. Alors maintenant, j'essaie d'approfondir pour trouver la cause du problème. Je préfère le faire indépendamment du reste du programme (d'où la nécessité d'exécuter des tests unitaires en mode débogage). Pour mémoire, il s'agit du code que quelqu'un d'autre a écrit et qui a été converti à partir d'un autre algorithme de personnes: - /
Jon Cage
Cela tombe donc dans la dernière clause de ma dernière ligne :) Étrange que vous ne puissiez pas le faire fonctionner cependant .. dommage. Je dirais qu'il suffit de s'attacher au processus (Alt + D + P) sans s'y attarder ..
Gishu
Il n'y a pas d'odeur ici - j'ai un cas de test qui échoue dans certains environnements (un résultat très faux est renvoyé), et j'ai besoin de comprendre pourquoi. Pour ce faire, je veux le déboguer et découvrir où il échoue dans cet environnement afin que je puisse corriger le code et faire passer le test partout. Cela ressemble à un truc de type rouge / vert standard ...
BrainSlugs83
@ BrainSlugs83 - il y a longtemps que j'ai écrit ceci. Je suis (toujours) contre le débogage de vos tests comme pratique de travail principale. Cas Edge - Je suis d'accord pour passer au débogueur. Même dans ce cas, j'insérerais probablement d'abord les stmts de journalisation ... Je pense que cela vient du fait que j'ai observé trop de personnes utilisant un cycle Code-Crash-Debug-Adjust qui est rationalisé en cycle Code-Crash-Adjust avec le débogueur en continu.
Gishu le