ฉันจะเรียกใช้ NUnit ในโหมดดีบักจาก Visual Studio ได้อย่างไร


120

ฉันเพิ่งสร้างกรอบการทดสอบสำหรับ C # ที่ฉันได้ดำเนินการไป ฉันได้ตั้งค่า NUnit และโปรเจ็กต์ใหม่ภายในพื้นที่ทำงานของฉันเพื่อทดสอบส่วนประกอบ ทั้งหมดทำงานได้ดีถ้าฉันโหลดการทดสอบหน่วยจาก Nunit (v2.4) แต่ฉันมาถึงจุดที่จะมีประโยชน์มากในการทำงานในโหมดดีบักและตั้งค่าจุดพัก

ฉันได้ลองทำตามคำแนะนำจากหลาย ๆ คำแนะนำซึ่งทั้งหมดแนะนำให้เปลี่ยนคุณสมบัติ 'Debug' ของโครงการทดสอบ:

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

ฉันใช้เวอร์ชันคอนโซลที่นั่น แต่ได้ลองเรียก GUI ด้วย ทั้งคู่ให้ข้อผิดพลาดเดียวกันกับฉันเมื่อฉันพยายามและเริ่มการดีบัก:

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

เป็นเพราะปกติฉันโหลด \ DSP.nunit ลงใน Nunit GUI และนั่นคือจุดที่มีการทดสอบหรือไม่

ฉันเริ่มคิดว่าปัญหาอาจเกิดจาก VS ต้องการเรียกใช้กรอบการทดสอบของตัวเองและนั่นเป็นเหตุผลว่าทำไมจึงไม่พบการทดสอบ NUnit

แก้ไข : สำหรับผู้ที่ถามเกี่ยวกับการติดตั้งการทดสอบไฟล์. c ของฉันในโครงการ TestDSP จะมีลักษณะประมาณนี้:

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

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

... ฉันค่อนข้างใหม่สำหรับ C # และกรอบการทดสอบ NUnit ดังนั้นจึงเป็นไปได้ทั้งหมดที่ฉันพลาดข้อมูลสำคัญบางอย่างไป ;-)

ทางออกสุดท้าย : ปัญหาใหญ่คือโครงการที่ฉันใช้ หากคุณเลือกOther Languages -> Visual C# -> Test -> Test Project... เมื่อคุณเลือกประเภทโครงการ Visual Studio จะลองใช้กรอบการทดสอบของตัวเองเท่าที่ฉันสามารถบอกได้ คุณควรเลือกโปรเจ็กต์ไลบรารีคลาส C # ปกติแทนจากนั้นคำแนะนำในคำตอบที่ฉันเลือกจะใช้งานได้


ชั้นเรียนการทดสอบของคุณดูดีสำหรับฉันดังนั้นจึงต้องเป็นสิ่งที่อยู่ในโครงการตามที่คุณแนะนำ
Patrick McDonald

2
เจอคำถามแบบนี้stackoverflow.com/questions/247900/… คำตอบเหมือนเดิม ...
Patrick Desjardins

คำตอบ:


46

ฉันใช้เทคนิคเดียวกับที่คุณกำลังลองจอนโดยไม่มีแฟล็ก / แอสเซมบลีเช่น

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 มี TestFixtures ทั้งหมดของคุณหรือไม่

เนื่องจากโครงการทดสอบของฉันไม่ใช่โครงการเริ่มต้นในโซลูชันฉันจึงเรียกใช้การทดสอบโดยคลิกขวาที่โครงการทดสอบแล้วเลือก Debug -> เริ่มอินสแตนซ์ใหม่


1
ฉันได้ลองสิ่งที่คุณแนะนำแล้ว (ถอด / ประกอบ) แต่ก็ไม่แตกต่างกัน เมื่อฉันเริ่มอินสแตนซ์ใหม่มันก่อให้เกิดข้อผิดพลาด ฉันคิดว่าส่วนใหญ่จะเกี่ยวข้องกับความจริงที่ว่าเมื่อฉันสร้างโครงการ TestDSP ฉันสร้างมันจากเทมเพลตโครงการทดสอบ VisualStudio ในตัวดังนั้นจึงมองหากรอบการทดสอบที่ไม่ถูกต้อง
Jon Cage

3
ในที่สุดก็ใช้งานได้ ฉันพูดถูกมากเพราะเป็นตัวเลือกโครงการที่หยุดมัน - การสร้างโครงการทดสอบใหม่โดยใช้เทมเพลตคลาสมาตรฐานช่วยแก้ปัญหาได้
Jon Cage

1
มันจะช่วยถ้าคุณยังเพิ่ม/runการขัดแย้งบรรทัด * คำสั่งของคุณที่จะเริ่มต้นโดยอัตโนมัติการดำเนินการทดสอบ ... ฉันยังสรุปมันทั้งหมดขึ้น (โดยใช้ภาพ) ในการโพสต์บล็อกของฉัน
Robert Koritnik

6
ในกรณีที่ไม่มีคนดูบล็อกโพสต์ของ Robert (มีประโยชน์มาก) ( erraticdev.blogspot.com/2012/01/… ): สำหรับ. NET 4.0 และใหม่กว่าฉันเชื่อว่าคุณต้องเพิ่มสิ่งนี้ใน nunit.exe.config ด้วย : <startup> <supportedRuntime version = "4.0" /> </startup>
devuxer

3
การติดตาม: ใน NUnit เวอร์ชันที่ใหม่กว่า (เวอร์ชันล่าสุด ณ วันนี้คือ v2.6.1) คุณต้องแสดงความคิดเห็น<supportedRuntime version="v2.0.50727" />ใน nunit.exe.config
devuxer

102

เมื่อฉันต้องการดีบักการทดสอบ NUnit ฉันเพียงแค่แนบแอปพลิเคชัน NUnit GUI nunit-agent.exeโดยใช้ "Debug | Attach to Process" และเรียกใช้การทดสอบจาก GUI จุดพักใด ๆ ในการทดสอบของฉัน (หรือรหัสที่กำลังทดสอบ) ถูกตี ฉันเข้าใจคำถามของคุณผิดหรือว่าจะเหมาะกับคุณ?


7
สำหรับข้อมูลของคุณ (และของผู้อื่น): Debug | Attach ไม่สามารถใช้ได้ใน VS. รุ่น Express
Richard

15
โปรดทราบว่าคุณต้องเลือก "เปิดใช้งาน Visual Studio Support" ในกล่องโต้ตอบการตั้งค่าของ NUnit -> IDE Support
Julio Garcia

8
สำหรับ NET 4.0 และต่อมาผมเชื่อว่าคุณยังมีการเพิ่มนี้จะ <startup> <supportedRuntime version="4.0" /> </startup>nunit.exe.config:
devuxer

1
นี่เป็นทางลัดอย่างรวดเร็วสำหรับการเชื่อมต่อกับกระบวนการที่ถูกต้อง (รันใน Package Manager Console): ($ dte.Debugger.LocalProcesses |? {$ _. Name.EndsWith ("nunit-agent.exe")}) แนบ ()
บาร์ต

7
FYI: คุณต้องแนบการดีบักเข้ากับกระบวนการที่เรียกว่า "nunit-agent.exe" และไม่ใช่ "nunit.exe" มิฉะนั้นจุดพักของคุณจะถูกเพิกเฉยและคุณสงสัยว่าทำไม ...
Jenny O'Reilly

21

เพียงแค่ลบบรรทัดที่ดูเหมือน

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

จากไฟล์โครงการของคุณ บรรทัดนี้บอก VS.Net โดยทั่วไปว่าเป็นโครงการทดสอบดังนั้น "ไม่สามารถเริ่มโครงการทดสอบ" FYI ที่นี่ไกด์คนที่ 1 พูดว่า "เป็นการทดสอบ" คนที่ 2 พูดว่า "เป็น C #" สำหรับข้อมูลเกี่ยวกับ Guids เหล่านั้น: http://www.mztools.com/Articles/2008/MZ2008017.aspx


18

นอกจากคำตอบจาก @Justin แล้วนี่คือรายละเอียดเพิ่มเติมสำหรับ NUnit 2.6

ใช้ NUnit 2.6 แนบกับ nunit.exe หรือ nunit-console.exe และไม่ใช่ตัวแทน การกำหนดค่าที่ระบุโดย @Justin นั้นแตกต่างกันเล็กน้อย ด้านล่างนี้เป็นตัวอย่างจาก nunit.exe.config (เหมือนกันสำหรับ 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>

สำหรับโครงการทดสอบ. NET 4 เพื่อให้ได้คะแนนแตกคุณจะต้องแสดงความคิดเห็นหรือลบบรรทัด v2.0 ตามที่ความคิดเห็นแนะนำ เมื่อฉันทำเช่นนั้นฉันก็สามารถดีบักโครงการทดสอบ. NET 4.0 ได้


ฉันประสบความสำเร็จเฉพาะv2.0.50727บรรทัดเมื่อทำการดีบักแอสเซมบลี. NET 2 จาก VS2005 พร้อมแม่ชี ( v4เส้นป้องกันไม่ให้ติดดีบักเกอร์ VS 2005)
Martin Ba

17

หากคุณใช้ NUnit 2.4 หรือใหม่กว่าคุณสามารถใส่รหัสต่อไปนี้ในSetUpFixtureชั้นเรียนของคุณได้ (คุณสามารถทำได้กับเวอร์ชันที่เก่ากว่า แต่คุณจะต้องทำสิ่งที่เทียบเท่ากับSetUpFixtureหรือคัดลอกไปยังการทดสอบเอง)

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

อะไรDebugger.Launch()คือสาเหตุที่ทำให้กล่องโต้ตอบต่อไปนี้ปรากฏขึ้นเมื่อคุณคลิกเรียกใช้ภายใน NUnit

ไดอะล็อก JIT Debugger

จากนั้นคุณเลือกอินสแตนซ์ของ Visual Studio ที่กำลังทำงานอยู่โดยเปิดโปรเจ็กต์ของคุณ (อันที่ 2 ในภาพหน้าจอของฉัน) จากนั้นตัวดีบักจะถูกแนบและจุดพักหรือข้อยกเว้นใด ๆ จะปรากฏใน Visual Studio


12

ใน Nunit 3.0.1 (ฉันใช้ VS2013) เปิดจากเมนูหลัก> ทดสอบ> Windows> Test Explorer จากนั้นใน "Test explorer" ให้คลิกขวาที่กรณีทดสอบคุณอาจเห็น: ใส่คำอธิบายภาพที่นี่

หวังว่านี่จะช่วยได้


2
ขอบคุณสำหรับคำตอบนี้ ง่ายกว่าคนอื่น ๆ มาก
dano

ฉันใช้ NUnit 2.5.9 ใน VS 2015 และทำงานร่วมกับส่วนขยาย VS ที่มีชื่อว่า 'NUnit 2 Test Adapter' คุณสามารถดำเนินการทดสอบได้ในหน้าต่าง Test Explorer
mggSoft

6

ติดตั้งTestDriven.NETซึ่งเป็นปลั๊กอินสำหรับ Visual Studio

จากตรงนั้นคุณสามารถคลิกขวาที่ชุดทดสอบหน่วยของคุณแล้วคลิกเรียกใช้การทดสอบเพื่อเรียกใช้ชุดทั้งหมดคลิกขวาที่คลาส TestFixture เพื่อเรียกใช้การทดสอบในชั้นเรียนนั้นหรือคลิกขวาที่วิธีการทดสอบเพื่อเรียกใช้วิธีการนั้น

นอกจากนี้คุณยังมีตัวเลือกในการทดสอบด้วยดีบักเกอร์หากคุณต้องการเบรกพอยต์ในการทดสอบในโหมดดีบัก


2
170 เหรียญนั้นสูงชันอย่างน่าขันสำหรับเครื่องมือดังกล่าว แซะราคาใคร?
Ben Hardy

ใช่. สำหรับเงินประเภทนั้นฉันควรลงทุนใน JetBrains Resharper ซึ่งจะให้ Test Runner ฟรีพร้อมกับการรวมการแก้จุดบกพร่องและคุณสมบัติการผลิตอื่น ๆ อีกมากมาย
โรมัน

ด้วย Visual Studio 2012 คุณสามารถรับ NUnit Test Runner กับ Nuget ได้ฟรี
Jon Limjap

6

ลอง NUnitit - Addin Visual Studio แบบโอเพนซอร์สสำหรับการดีบักกรณีทดสอบ NUnit

หน้าแรก - http://nunitit.codeplex.com/


ค่อนข้างดีแม้ว่าฉันจะหาวิธีบอกไม่ได้ให้ทำการทดสอบเพียงครั้งเดียว (?)
Jon Cage


3

ขณะนี้มีรูปภาพ:

  1. เรียกใช้ NUnit gui ( ดาวน์โหลด 2.6.2 จากที่นี่ ) จากนั้นไปที่File -> Open Project

ใส่คำอธิบายภาพที่นี่

  1. เลือกการทดสอบของคุณ.dllจากโฟลเดอร์ bin ( C:\......\[SolutionFolder][ProjectFolder]\bin\Debug\xxxxTests.dll)

  2. ไปที่ Visual Studio Debug -> Attach to process(หน้าต่างแนบกับกระบวนการจะเปิดขึ้น)

  3. จากรายการเลื่อนลงและเลือกnunit-agent.exeจากนั้นคลิกAttach

ใส่คำอธิบายภาพที่นี่

  1. ณ จุดนี้จุดพักในการทดสอบของคุณควรเปลี่ยนเป็นสีแดงสุก (จากกลวง)

  2. คลิกRunบนNunit Guiและคุณควรจะได้รับการตีเบรกพอยต์ของคุณ ...

หวังว่านี่จะช่วยคุณประหยัดเวลาได้บ้าง


2

หากคุณสามารถทำให้คอนโซล / หรือ GUI ทำงานได้ แต่เบรกพอยต์ของคุณไม่ถูกโจมตีอาจเป็นเพราะแอปของคุณใช้รันไทม์. NET ที่แตกต่างจากที่ NUnit เป็นอยู่ ตรวจสอบดูว่า nunit-console.exe.config / nunit.exe.config ของคุณมีรันไทม์ที่ระบุไว้หรือไม่ (คอนฟิกูเรชันอยู่ในไดเร็กทอรีเดียวกับ nunit exe) ระบุรันไทม์โดยใช้โหนดเริ่มต้น:

<configuration>
    <startup>
       <supportedRuntime version="4.0" />
    </startup>

2

หากเส้นทางโครงการมีช่องว่างเช่น "โครงการใหม่" ในเส้นทางให้<path>\bin\Debug\New Project\Quotes.Domain.Tests.dllใส่เส้นทางโครงการตัวเลือกเริ่มต้น -> อาร์กิวเมนต์บรรทัดคำสั่งในเครื่องหมายคำพูดคู่

ฉันใช้เวลานานมากในการคิดออก


1

เกี่ยวกับสิ่งที่นายแพทริคแมคโดนัลด์กล่าว

เนื่องจากโครงการทดสอบของฉันไม่ใช่โครงการเริ่มต้นในโซลูชันฉันจึงเรียกใช้การทดสอบโดยคลิกขวาที่โครงการทดสอบแล้วเลือก Debug -> เริ่มอินสแตนซ์ใหม่

ฉันพยายามสมัครไลบรารีคลาสทดสอบของฉัน แต่พบข้อผิดพลาดบางอย่างเกี่ยวกับเส้นทางดังนั้นฉันจึงพยายามลบ 'อาร์กิวเมนต์บรรทัดคำสั่ง' และโชคดีที่มันทำงานได้ดีและเป็นไปตามที่คาดไว้


0

ดูเหมือนว่าคุณกำลังพยายามใช้ห้องสมุดที่ไม่ถูกต้อง NUnit สามารถเริ่มต้นได้ก็ต่อเมื่อ dll ที่คุณใช้มี TestFixtures

+1 บน TestDriven.Net ฉันมีโอกาสได้ใช้มันหลายครั้ง คุณสามารถดาวน์โหลดรุ่นส่วนบุคคลสำหรับวัตถุประสงค์ในการประเมินผลตามใบอนุญาตที่http://testdriven.net/purchase_licenses.aspx


ดูการแก้ไขล่าสุด - ฉันมีอุปกรณ์ทดสอบแม้ว่าจะเป็นไปได้ทั้งหมด แต่ฉันตั้งค่าไม่ถูกต้อง
Jon Cage

0

ฉันได้รับข้อผิดพลาดเดียวกันกับ MSTest ฉันพบว่าในหน้าต่างผลลัพธ์การทดสอบการทดสอบบางรายการมี ID ที่ซ้ำกันและไม่สามารถโหลดได้ ฉันลบการทดสอบที่ซ้ำกันทั้งหมดและตอนนี้ฉันสามารถเรียกใช้การทดสอบได้เมื่อฉันเริ่มโครงการ


0

นอกจากนี้ยังมีส่วนขยาย "Visual NUnit" ที่จะช่วยให้คุณสามารถเรียกใช้การทดสอบจากภายใน Visual studio ได้เหมือนกับการสร้างในกรอบการทดสอบ ลองดูในตัวจัดการส่วนขยาย


0

เปิด Visual Studio ---> โครงการของคุณ ---> เลือก 'คุณสมบัติ' ---> เลือก 'ดีบัก' -> เลือก 'เริ่มโปรแกรมภายนอก' และกำหนดเส้นทางของหน่วยของคุณที่นั่น (เช่น: เริ่มโปรแกรมภายนอก = C : \ Program Files \ NUnit 2.6.2 \ bin \ nunit.exe) ----> บันทึก

หลังจากตั้งค่าแล้วให้คลิก Debug


0

วิธีแก้ปัญหาสำหรับฉันคือการปรับไฟล์การกำหนดค่าแม่ชี ในการใช้ nunit กับ 4.5-.Net framework และตัวเลือก build x64 ฉันต้องเพิ่มหนึ่งบรรทัดในแท็กเริ่มต้น (เวอร์ชันรันไทม์ที่รองรับ)

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

หลังจากนั้นฉันสามารถเริ่มต้นด้วยการคลิกขวาที่ Testproject Debug -> เริ่มอินสแตนซ์ใหม่ ก่อนหน้านี้ฉันต้องแนบโครงการกับกระบวนการด้วยตนเองอีกครั้ง

คุณสมบัติการดีบักของฉันคือ C: \ Program Files (x86) \ NUnit 2.6.4 \ bin \ nunit.exe พร้อมอาร์กิวเมนต์ของตำแหน่งของ. dll ที่จะทดสอบ

ข้อมูลเพิ่มเติม: แม่ชีสำหรับการทดสอบกับ. NET 4.0


-1

ดูว่าสิ่งนี้ช่วยได้ไหม .. วิธีเพิ่ม NUnit ใน Visual Studio

(RighteousRant) แม้ว่าโดยส่วนตัวแล้วฉันไม่ชอบแนวทางนี้ .. หากคุณต้องการดีบักเกอร์ในขณะที่คุณกำลังทดสอบการขับโค้ดของคุณมันเป็น "กลิ่น" ที่คุณไม่มีความมั่นใจเพียงพอ / รู้ว่าโค้ดของคุณทำงานอย่างไร & ต้องการ ดีบักเกอร์เพื่อบอกคุณว่า TDD ควรทำให้คุณไม่ต้องใช้ดีบักเกอร์หากทำถูกต้อง ใช้ 'แนบดีบักเกอร์กับ NUNit' เฉพาะในกรณีที่หายากหรือเมื่อคุณกำลังลุยในรหัสของคนอื่น


ฉันลองทำตามคำแนะนำที่นั่นแล้ว แต่ก็ไม่มีประโยชน์ คุณมีจมูกที่ดีอย่างเห็นได้ชัด ฉันรู้ว่ารหัสของฉันใช้ไม่ได้เนื่องจากผลลัพธ์ที่ฉันได้รับสำหรับการใช้งานบล็อกแรกนั้นได้รับคำตอบที่แตกต่างกันอย่างมากสำหรับข้อมูลอ้างอิงการทดสอบของฉัน ตอนนี้ฉันกำลังพยายามเจาะลึกลงไปเพื่อหาสาเหตุของปัญหา ฉันควรทำแบบนั้นแยกกับส่วนที่เหลือของโปรแกรม (ดังนั้นจึงต้องเรียกใช้การทดสอบหน่วยในโหมดดีบัก) สำหรับบันทึกนี้เป็นรหัสที่คนอื่นเขียนขึ้นซึ่งแปลงมาจากอัลกอริทึมของบุคคลอื่น: - /
Jon Cage

นั่นจึงตกอยู่ในประโยคหลังของบรรทัดสุดท้ายของฉัน :) แปลกที่คุณไม่สามารถใช้งานได้แม้ว่า .. แย่เกินไป ฉันบอกว่าแค่แนบไปกับกระบวนการ (Alt + D + P) โดยไม่ต้องอาศัยมัน ..
Gishu

ไม่มีกลิ่นที่นี่ - ฉันมีกรณีทดสอบที่ล้มเหลวในบางสภาพแวดล้อม (ส่งคืนผลลัพธ์ที่ผิดพลาดมาก) และฉันต้องหาสาเหตุ ในการทำเช่นนั้นฉันต้องการดีบักและค้นหาว่ามันล้มเหลวในสภาพแวดล้อมนี้ที่ไหนเพื่อที่ฉันจะได้แก้ไขโค้ดและทำการทดสอบผ่านทุกที่ ดูเหมือนว่าสิ่งประเภทสีแดง / เขียวมาตรฐาน ...
BrainSlugs83

@ BrainSlugs83 - นานมากแล้วที่ฉันเขียนสิ่งนี้ ฉัน (ยัง) ต่อต้านการดีบักแบบทดสอบของคุณเพื่อเป็นแนวทางปฏิบัติในการทำงานหลัก Edge case - ฉันโอเคที่จะไปที่ดีบักเกอร์ ถึงอย่างนั้นฉันอาจจะแทรก stmts การบันทึกก่อน .. ฉันคิดว่ามันเกิดจากการที่ฉันสังเกตเห็นคนจำนวนมากเกินไปที่ใช้วงจร Code-Crash-Debug-Adjust ซึ่งได้รับการปรับปรุงให้เป็น Code-Crash-Adjust cycle ด้วยดีบั๊ก อย่างต่อเนื่อง
Gishu
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.