如何从Visual Studio以调试模式运行NUnit?


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测试的原因?

编辑:对于那些询问测试装置的人,我在TestDSP项目中的.cs文件之一大致如下:

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

Answers:


46

我使用与尝试Jon相同的技术,但没有/ assembly标志,即

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?

由于我的测试项目不是解决方案中的启动项目,因此我通过右键单击测试项目并选择“调试->启动新实例”来运行测试。


1
我已经尝试了您的建议(删除/ assembly),但是没有什么区别。当我启动新实例时,它将产生错误。我认为这主要与以下事实有关:创建TestDSP项目时,我是通过内置的VisualStudio测试项目模板创建它的,因此它正在寻找错误的测试框架。
乔恩·凯奇

3
终于成功了。我是对的,因为正是项目选项阻止了它-使用标准类模板重新创建测试项目解决了该问题。
乔恩·凯奇

1
如果您还添加/run了*命令行参数,它将自动开始执行测试,这将有所帮助...我也在我的博客文章中总结了全部内容(使用图片)。
罗伯特·科里特尼克

6
如果人们不签出Robert的(非常有用的)博客文章(erraticdev.blogspot.com/2012/01/…):对于.NET 4.0及更高版本,我相信您也必须将其添加到nunit.exe.config中:<startup> <supportedRuntime version =“ 4.0” /> </ startup>。
devuxer 2012年

3
后续:在NUnit的更高版本(今天的最新版本是v2.6.1)中,您需要<supportedRuntime version="v2.0.50727" />在nunit.exe.config中注释掉。
devuxer 2012年

102

当我需要调试NUnit测试时,只需nunit-agent.exe使用“调试|附加到进程”将其附加到NUnit GUI应用程序,然后从GUI运行测试。我的测试(或他们正在测试的代码)中的任何断点都被击中。我是在误解您的问题,还是对您有用?


7
供您(和其他人)使用:Debug | Attach在VS Express版本中不可用。
理查德

15
请注意,您必须在NUnit的“设置”对话框中选择“启用Visual Studio支持”-> IDE支持
Julio Garcia

8
对于.NET 4.0及更高版本,我相信您也必须将其添加到nunit.exe.config:中<startup> <supportedRuntime version="4.0" /> </startup>
devuxer 2012年

1
这是附加到正确进程的快捷方式(在Package Manager控制台中运行):($ dte.Debugger.LocalProcesses |?{$ _。Name.EndsWith(“ nunit-agent.exe”)})。Attach()
巴特

7
仅供参考:您需要将调试附加到名为“ nunit-agent.exe”而不是“ nunit.exe”的进程。否则,您的断点将被忽略,您想知道为什么...
Jenny O'Reilly

21

只需删除看起来像这样的行

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

从您的项目文件。该行基本上告诉VS.Net,它是一个测试项目,因此是“无法启动测试项目”。仅供参考,第一个向导说“这是一个测试”,第二个向导说“这是C#”。有关这些指南的信息,请访问: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使用nunit从VS2005调试.NET 2程序集时,我只能成功运行。(该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调试器对话框

然后,在打开项目的情况下选择运行的Visual Studio实例(屏幕快照中的第二个实例),然后将附加调试器,并且任何断点或异常都将显示在Visual Studio中。


12

在Nunit 3.0.1(我正在使用VS2013)中,从主菜单>测试> Windows>测试资源管理器中打开。然后在“测试资源管理器”中,右键单击测试用例,您可能会看到: 在此处输入图片说明

希望这可以帮助。


2
感谢您的回答。比所有其他简单得多。
dano

我在VS 2015中使用NUnit 2.5.9,它与名为“ NUnit 2 Test Adapter”的VS扩展一起使用。您可以在“测试资源管理器”窗口上执行测试。
mggSoft

6

安装TestDriven.NET,这是Visual Studio的插件

在这里,您可以右键单击单元测试程序集,然后单击“运行测试”以运行整个套件,右键单击“ TestFixture”类以仅运行该类中的测试,或者右键单击“ Test”方法以仅运行该方法。

如果您需要在调试模式下进入测试的断点,则还可以选择“使用调试器进行测试”。


2
对于这样的工具,170美元太高了。价格欺诈,有人吗?
Ben Hardy

是的 为此,我宁愿投资JetBrains Resharper,然后通过调试集成和许多其他生产力功能免费提供Test Runner。
罗马

使用Visual Studio 2012,您可以免费获得带有Nuget的NUnit测试运行器。
乔恩·利姆贾普



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. 点击RunNunit Gui,你应该得到你的断点命中...

希望这可以节省您一些时间。


2

如果您能够使控制台或GUI正常工作,但没有遇到断点,则可能是因为您的应用程序运行的是不同于NUnit的.NET运行时。检查您的nunit-console.exe.config / nunit.exe.config是否已指定运行时。(这些配置与nunit exe位于同一目录中。)使用启动节点指定运行时:

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

2

如果项目路径在路径中包含空格,例如“ New Project”,<path>\bin\Debug\New Project\Quotes.Domain.Tests.dll则将“开始选项->命令行参数”项目路径括在双引号中。

我花了很多时间来解决这个问题。


1

关于帕特里克·麦克唐纳先生所说的话

由于我的测试项目不是解决方案中的启动项目,因此我通过右键单击测试项目并选择“调试->启动新实例”来运行测试。

我尝试申请测试类库,但在路径方面出现了一些错误,因此我尝试删除“命令行参数”,幸运的是,它运行良好且符合预期。



0

我遇到了与MSTest相同的错误。我发现在“ 测试输出”窗口中,某些测试具有重复的ID,并且无法加载。我删除了所有重复的测试,现在在启动项目时便可以运行测试。


0

现在还有一个扩展“ Visual NUnit”,使您可以在Visual Studio中运行测试,就像在测试框架句柄中进行构建一样。在扩展管理器中签出它。


0

打开Visual Studio --->项目--->选择'属性'--->选择'调试'->选择'启动外部程序'并在其中设置NUnit的路径(例如:启动外部程序= C :\ Program Files \ NUnit 2.6.2 \ bin \ nunit.exe)---->保存

设置后,只需单击“调试”


0

对我来说,解决方案是调整nunit配置文件。要将nunit与4.5-.Net框架和x64构建选项一起使用,我必须在启动标记(受支持的运行时版本)中添加一行。

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

之后,我可以通过右键单击Testproject Debug-> Start new instance来开始。在此之前,我需要再次手动将项目附加到流程中。

我的调试属性是C:\ Program Files(x86)\ NUnit 2.6.4 \ bin \ nunit.exe,带有要测试的.dll位置的参数。

详细信息:用于使用.NET 4.0进行测试的nunit


-1

看看是否有帮助。 如何在Visual Studio中添加NUnit

(RighteousRant)尽管我个人不喜欢这种方法。如果在测试代码时需要调试器,这是“气味”,因为您没有足够的信心/不知道代码的工作方式并需要调试器告诉你。如果操作正确,TDD应该使您无需调试器。仅在极少数情况下或在涉嫌他人的代码时使用“将调试器附加到NUNit”。


我没有尝试那里的建议。你显然鼻子很好。我知道我的代码无法正常工作,因为实现的第一块代码得到的输出对我的测试参考有截然不同的答案。因此,现在我试图更深入地研究问题的根源。我宁愿将其隔离到程序的其余部分(因此需要在调试模式下运行单元测试)。记录下来,这是别人写的代码,是从另一个人的算法转换而来的:-/
Jon Cage

因此,这属于我最后一行的后一个子句:)奇怪的是,您无法使它正常工作..太糟糕了。我会说只是附加到进程(Alt + D + P)而不
停留

这里没有气味-我有一个测试用例在某些环境中失败(返回非常错误的结果),我需要弄清楚原因。为此,我想对其进行调试,并找出在这种环境下其失败之处,以便我可以修复代码并使测试在任何地方通过。这似乎是标准的红色/绿色类型的东西……
BrainSlugs83 2014年

@ BrainSlugs83-自从我写了这个以来很久了。我(仍然)反对将测试调试为主要工作习惯。边缘情况-可以使用调试器了。即使这样,我也可能会首先插入日志记录stmts。我认为这是因为我观察到太多的人使用Code-Crash-Debug-Adjust周期,而该周期已通过调试器简化为Code-Crash-Adjust周期不断地。
Gishu 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.