Wie führe ich NUnit im Debug-Modus von Visual Studio aus aus?

120

Ich habe kürzlich ein Testframework für ein bisschen C # erstellt, an dem ich gearbeitet habe. Ich habe NUnit eingerichtet und ein neues Projekt in meinem Arbeitsbereich, um die Komponente zu testen. Alles funktioniert gut, wenn ich meine Unit-Tests von Nunit (v2.4) lade, aber ich bin an einem Punkt angelangt, an dem es wirklich nützlich wäre, im Debug-Modus zu laufen und einige Haltepunkte festzulegen.

Ich habe die Vorschläge aus mehreren Handbüchern ausprobiert, die alle vorschlagen, die 'Debug'-Eigenschaften des Testprojekts zu ändern:

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

Ich verwende dort die Konsolenversion, habe aber auch versucht, die GUI aufzurufen. Beide geben mir den gleichen Fehler, wenn ich versuche, mit dem Debuggen zu beginnen:

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

Liegt das daran, dass ich normalerweise \ DSP.nunit in die Nunit-GUI lade und dort die Tests stattfinden?

Ich fange an zu glauben, dass das Problem möglicherweise darin besteht, dass VS ein eigenes Testframework ausführen möchte und deshalb die NUnit-Tests nicht gefunden werden kann.

Bearbeiten : Für diejenigen, die nach Testgeräten fragen, sieht eine meiner CS-Dateien im TestDSP-Projekt ungefähr so ​​aus:

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

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

... Ich bin ziemlich neu in C # und dem NUnit-Testframework, daher ist es durchaus möglich, dass ich einige wichtige Informationen verpasst habe ;-)

Endlösung : Das große Problem war das Projekt, das ich verwendet hatte. Wenn Sie Other Languages -> Visual C# -> Test -> Test Project... auswählen, wird Visual Studio bei der Auswahl des Projekttyps versuchen, ein eigenes Testframework zu verwenden, soweit ich das beurteilen kann. Sie sollten stattdessen ein normales C # -Klassenbibliotheksprojekt auswählen, und dann funktionieren die Anweisungen in meiner ausgewählten Antwort.

Jon Cage
quelle
Ihre Testvorrichtungsklasse sieht für mich gut aus, daher muss es etwas im Projekt sein, wie Sie vorgeschlagen haben.
Patrick McDonald
2
Sehen Sie wie diese Frage aus: stackoverflow.com/questions/247900/… Die Antwort ist die gleiche ...
Patrick Desjardins

Antworten:

46

Ich benutze die gleiche Technik wie Sie es mit Jon versuchen, ohne das Flag / Assembly, dh

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

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

Enthält TestDSP.dll alle Ihre TestFixtures?

Da mein Testprojekt nicht das Startprojekt in der Lösung ist, führe ich meine Tests aus, indem ich mit der rechten Maustaste auf das Testprojekt klicke und Debug -> Neue Instanz starten wähle

Patrick McDonald
quelle
1
Ich habe versucht, was Sie vorgeschlagen haben (Entfernen der / Assembly), aber es macht keinen Unterschied. Wenn ich eine neue Instanz starte, wird der Fehler ausgegeben. Ich denke, das hängt hauptsächlich damit zusammen, dass ich das TestDSP-Projekt beim Erstellen aus der integrierten VisualStudio-Testprojektvorlage erstellt habe, sodass nach dem falschen Testframework gesucht wird.
Jon Cage
3
Endlich hat es funktioniert. Ich hatte insofern Recht, als es die Projektoptionen waren, die es stoppten - das erneute Erstellen des Testprojekts unter Verwendung der Standardklassenvorlage behebt das Problem.
Jon Cage
1
Es ist hilfreich, wenn Sie auch /runzu Ihren * Befehlszeilenargumenten hinzufügen , die automatisch Tests ausführen ... Ich habe alles in meinem Blog-Beitrag zusammengefasst (mithilfe von Bildern) .
Robert Koritnik
6
Für den Fall, dass die Leute Roberts (sehr nützlichen) Blog-Beitrag ( erraticdev.blogspot.com/2012/01/… ) nicht lesen : Für .NET 4.0 und höher müssen Sie diesen meiner Meinung nach auch zu nunit.exe.config hinzufügen : <Start> <SupportedRuntime Version = "4.0" /> </ Start>.
Devuxer
3
Follow-up: In späteren Versionen von NUnit (die neueste Version von heute ist v2.6.1) müssen Sie <supportedRuntime version="v2.0.50727" />in nunit.exe.config einen Kommentar abgeben.
Devuxer
102

Wenn ich meine NUnit-Tests debuggen muss, füge ich einfach nunit-agent.exeüber "Debug | An Prozess anhängen" eine Verbindung zur NUnit-GUI-Anwendung hinzu und führe die Tests über die GUI aus. Alle Haltepunkte in meinen Tests (oder der Code, den sie testen) werden getroffen. Verstehe ich Ihre Frage falsch oder funktioniert das für Sie?

Matt Hamilton
quelle
7
Zu Ihrer (und anderer) Information: Der Debug | Attach ist in den Express-Editionen von VS nicht verfügbar.
Richard
15
Beachten Sie, dass Sie im Dialogfeld "Einstellungen" von NUnit -> IDE-Unterstützung
Julio Garcia
8
Für .NET 4.0 und höher müssen Sie dies meines Erachtens auch zu nunit.exe.config hinzufügen : <startup> <supportedRuntime version="4.0" /> </startup>.
Devuxer
1
Dies ist eine schnelle Verknüpfung zum Anhängen an den richtigen Prozess (in der Package Manager-Konsole ausführen): ($ dte.Debugger.LocalProcesses |? {$ _. Name.EndsWith ("nunit-agent.exe")}). Attach ()
Bart
7
Zu Ihrer Information: Sie müssen das Debuggen an den Prozess "nunit-agent.exe" und NICHT "nunit.exe" anhängen. Andernfalls werden Ihre Haltepunkte ignoriert und Sie fragen sich, warum ...
Jenny O'Reilly
21

Entfernen Sie einfach die Linie, die aussieht

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

aus Ihrer Projektdatei. Diese Zeile teilt VS.Net im Wesentlichen mit, dass es sich um ein Testprojekt handelt, daher "Testprojekt kann nicht gestartet werden". Zu Ihrer Information hier sagt der 1. Guid "es ist ein Test", der 2. sagt "es ist C #". Informationen zu diesen Guids finden Sie unter: http://www.mztools.com/Articles/2008/MZ2008017.aspx

user276648
quelle
18

Neben der Antwort von @Justin finden Sie hier einige weitere Details zu NUnit 2.6.

Mit NUnit 2.6 an nunit.exe oder nunit-console.exe anhängen und NICHT an den Agenten. Die von @Justin notierte Konfiguration unterscheidet sich geringfügig. Unten finden Sie ein Beispiel aus nunit.exe.config (dasselbe gilt für 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>

Für .NET 4-Testprojekte müssen Sie die v2.0-Zeile auskommentieren oder entfernen, um Haltepunkte zu erreichen. Danach konnte ich das .NET 4.0-Testprojekt debuggen.

Blut
quelle
v2.0.50727Beim Debuggen von .NET 2-Assemblys von VS2005 mit nunit hatte ich nur Erfolg mit der Zeile. (Die v4Zeile verhinderte, dass der Debugger von VS 2005
Martin Ba
17

Wenn Sie NUnit 2.4 oder neuer verwenden, können Sie den folgenden Code in Ihre SetUpFixtureKlasse einfügen . (Sie können dies mit älteren Versionen tun, aber Sie müssen alles tun, was dem entspricht SetUpFixture, oder es in den Test selbst kopieren.)

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

Was Debugger.Launch()tut , ist Sache der folgende Dialog , um zu zeigen , wenn Sie Run innerhalb NUnit klicken.

JIT-Debugger-Dialog

Anschließend wählen Sie Ihre laufende Instanz von Visual Studio mit geöffnetem Projekt aus (die zweite in meinem Screenshot). Anschließend wird der Debugger angehängt und alle Haltepunkte oder Ausnahmen werden in Visual Studio angezeigt.

Scott Chamberlain
quelle
12

Öffnen Sie in Nunit 3.0.1 (ich verwende VS2013) über das Hauptmenü> Test> Windows> Test Explorer. Klicken Sie dann im "Test Explorer" mit der rechten Maustaste auf den Testfall. Möglicherweise wird Folgendes angezeigt: Geben Sie hier die Bildbeschreibung ein

Hoffe das hilft.

Quinn
quelle
2
Danke für diese Antwort. Viel einfacher als alle anderen.
Dano
Ich verwende NUnit 2.5.9 in VS 2015 und es funktionierte mit einer VS-Erweiterung namens 'NUnit 2 Test Adapter'. Sie können den Test im Test Explorer-Fenster ausführen.
mggSoft
6

Installieren Sie TestDriven.NET , ein Plugin für Visual Studio

Von dort aus können Sie mit der rechten Maustaste auf Ihre Unit-Test-Assembly klicken und auf Tests ausführen klicken, um die gesamte Suite auszuführen. Klicken Sie mit der rechten Maustaste auf eine TestFixture-Klasse, um nur die Tests in dieser Klasse auszuführen, oder klicken Sie mit der rechten Maustaste auf eine Testmethode, um nur diese Methode auszuführen.

Sie haben auch die Möglichkeit, mit Debugger zu testen, wenn Sie im Debug-Modus einen Haltepunkt für Ihre Tests festlegen müssen.

Jon Limjap
quelle
2
170 Dollar sind für ein solches Werkzeug lächerlich hoch. Jemand, der den Preis aushöhlt?
Ben Hardy
Ja. Für diese Art von Geld würde ich lieber in JetBrains Resharper investieren, das dem Test Runner dann kostenlos Debugging-Integration und eine Reihe anderer Produktivitätsfunktionen bietet.
Roman
Mit Visual Studio 2012 können Sie den NUnit Test Runner mit Nuget kostenlos herunterladen.
Jon Limjap
6

Probieren Sie NUnitit aus - ein Open Source Visual Studio-Add-In zum Debuggen von NUnit-Testfällen

HomePage - http://nunitit.codeplex.com/

abhilash
quelle
Das ist ziemlich gut, obwohl ich keinen Weg finden kann, nur einen einzigen Test (?)
Jon Cage
5

Entfernen Sie ProjectTypeGuids aus der Projektdatei.

Steve
quelle
+1 siehe auch diese Position
Felice Pollano
3

Jetzt mit Bildern:

  1. Führen Sie NUnit gui aus ( Download 2.6.2 von hier ) und gehen Sie dann zuFile -> Open Project

Geben Sie hier die Bildbeschreibung ein

  1. Wählen Sie Ihren Test .dllaus dem Ordner bin ( C:\......\[SolutionFolder][ProjectFolder]\bin\Debug\xxxxTests.dll)

  2. Wechseln Sie zu Visual Studio Debug -> Attach to process(Das Fenster "An Prozess anhängen" wird geöffnet.)

  3. Scrollen Sie in der Liste nach unten und wählen Sie aus nunit-agent.exeund klicken Sie dann aufAttach

Geben Sie hier die Bildbeschreibung ein

  1. Zu diesem Zeitpunkt sollten die Haltepunkte in Ihren Tests reif rot werden (von hohl).

  2. Klicken Sie Runauf Nunit Guiund Sie sollten Ihren Haltepunkt erreichen ...

Hoffe das spart dir etwas Zeit.

Matas Vaitkevicius
quelle
2

Wenn Sie die Konsole / oder GUI zum Laufen bringen können, Ihre Haltepunkte jedoch nicht erreicht werden, liegt dies möglicherweise daran, dass auf Ihrer App eine andere .NET-Laufzeit als auf NUnit ausgeführt wird. Überprüfen Sie, ob in Ihrer nunit-console.exe.config / nunit.exe.config die Laufzeit angegeben ist. (Die Konfigurationen befinden sich im selben Verzeichnis wie die der nunit-Exe.) Geben Sie die Laufzeit über den Startknoten an:

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

Wenn der Projektpfad Leerzeichen enthält, z. B. "Neues Projekt" im Pfad, <path>\bin\Debug\New Project\Quotes.Domain.Tests.dllschließen Sie den Projektpfad Startoption -> Befehlszeilenargumente in doppelte Anführungszeichen ein.

Ich habe viel Zeit damit verbracht, dies herauszufinden.

Gyan Sada
quelle
1

In Bezug auf das, was Herr Patrick McDonald gesagt hat

Da mein Testprojekt nicht das Startprojekt in der Lösung ist, führe ich meine Tests aus, indem ich mit der rechten Maustaste auf das Testprojekt klicke und Debug -> Neue Instanz starten wähle

Ich habe versucht, mich für meine Testklassenbibliothek zu bewerben, habe jedoch einen Fehler bezüglich des Pfads festgestellt. Daher habe ich versucht, die 'Befehlszeilenargumente' zu entfernen. Zum Glück hat dies gut und wie erwartet funktioniert.

Abdul Rahman Kayali
quelle
0

Es hört sich so an, als würden Sie versuchen, die falsche Bibliothek zu verwenden. NUnit kann nur gestartet werden, wenn die von Ihnen verwendete DLL TestFixtures enthält.

+1 auf TestDriven.Net. Ich hatte die Gelegenheit, es mehrmals zu benutzen. Sie können die persönliche Version zu Bewertungszwecken gemäß der Lizenz unter http://testdriven.net/purchase_licenses.aspx herunterladen .

Mike737
quelle
Siehe die letzte Bearbeitung - Ich habe ein Testgerät, obwohl es durchaus möglich ist, dass ich es nicht richtig eingerichtet habe.
Jon Cage
0

Ich habe den gleichen Fehler mit MSTest erhalten. Ich stellte fest, dass im Testausgabefenster einige der Tests doppelte IDs hatten und nicht geladen werden konnten. Ich habe alle doppelten Tests entfernt und konnte die Tests jetzt ausführen, als ich das Projekt startete.

Vijay
quelle
0

Es gibt jetzt auch eine Erweiterung "Visual NUnit", mit der Sie die Tests in Visual Studio ausführen können, ähnlich wie bei den integrierten Testframework-Handles. Überprüfen Sie es im Erweiterungsmanager.

iamkrillin
quelle
0

Öffnen Sie Visual Studio ---> Ihr Projekt ---> Wählen Sie 'Eigenschaften' ---> Wählen Sie 'Debug' -> Wählen Sie 'Externes Programm starten' und legen Sie dort den Pfad Ihrer NUnit fest (zB: Externes Programm starten = C. : \ Programme \ NUnit 2.6.2 \ bin \ nunit.exe) ----> Speichern

Nachdem Sie dies eingestellt haben, klicken Sie einfach auf Debuggen

Farija Khan
quelle
0

Für mich bestand die Lösung darin, die Nunit-Konfigurationsdatei anzupassen. Um nunit mit dem 4.5-.Net-Framework und der x64-Build-Option zu verwenden, musste ich dem Start-Tag eine Zeile hinzufügen (unterstützte Laufzeitversion).

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

Danach konnte ich mit der rechten Maustaste auf Testproject Debug -> Neue Instanz starten klicken. Vorher musste ich das Projekt erneut manuell an den Prozess anhängen.

Meine Debug-Eigenschaften waren C: \ Programme (x86) \ NUnit 2.6.4 \ bin \ nunit.exe mit dem Argument des Speicherorts der zu testenden DLL.

Weitere Informationen: Nunit zum Testen mit .NET 4.0

HauiB
quelle
-1

Überprüfen Sie, ob dies hilfreich ist. So fügen Sie NUnit in Visual Studio hinzu

(RighteousRant) Obwohl ich persönlich diesen Ansatz nicht mag. Wenn Sie einen Debugger benötigen, während Sie Ihren Code testen, ist es ein "Geruch", dass Sie nicht genug Vertrauen haben / wissen, wie Ihr Code funktioniert und den benötigen Debugger, um Ihnen das zu sagen. TDD sollte Sie von der Notwendigkeit eines Debuggers befreien, wenn dies richtig gemacht wird. Verwenden Sie "Debugger an NUNit anhängen" nur in seltenen Fällen oder wenn Sie den Code einer anderen Person eingeben.

Gishu
quelle
Ich habe die Vorschläge dort ohne Erfolg ausprobiert. Sie haben eindeutig eine gute Nase. Ich weiß, dass mein Code nicht funktioniert, da die Ausgabe, die ich für den ersten Implementierungsblock erhalte, völlig unterschiedliche Antworten auf meine Testreferenz erhält. Jetzt versuche ich tiefer zu gehen, um die Ursache des Problems zu finden. Ich mache das lieber isoliert mit dem Rest des Programms (daher müssen Unit-Tests im Debug-Modus ausgeführt werden). Für die Aufzeichnung ist dies Code, den jemand anderes geschrieben hat und der von einem anderen Personenalgorithmus konvertiert wurde: - /
Jon Cage
Das fällt also in die letzte Klausel meiner letzten Zeile :) Seltsam, dass man es nicht zum Laufen bringen kann ... schade. Ich würde sagen, einfach an den Prozess anhängen (Alt + D + P), ohne darüber nachzudenken.
Gishu
Hier riecht es nicht - ich habe einen Testfall, der in bestimmten Umgebungen fehlschlägt (ein sehr falsches Ergebnis wird zurückgegeben), und ich muss herausfinden, warum. Dazu möchte ich es debuggen und herausfinden, wo es in dieser Umgebung fehlschlägt, damit ich den Code reparieren und den Test überall bestehen kann. Dies scheint wie Standard rot / grün Typ Zeug ...
BrainSlugs83
@ BrainSlugs83 - lange her, seit ich das geschrieben habe. Ich bin (immer noch) gegen das Debuggen Ihrer Tests als primäre Arbeitspraxis. Randfälle - Ich bin damit einverstanden, zum Debugger zu wechseln. Selbst dann würde ich wahrscheinlich zuerst Protokollierungsstmts einfügen. Ich denke, das liegt daran, dass ich zu viele Leute beobachtet habe, die einen Code-Crash-Debug-Adjust-Zyklus verwendet haben, der mit dem Debugger auf den Code-Crash-Adjust-Zyklus optimiert wird kontinuierlich an.
Gishu