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

Posted

技术标签:

【中文标题】如何从 Visual Studio 以调试模式运行 NUnit?【英文标题】:How do I run NUnit in debug mode from Visual Studio? 【发布时间】:2010-10-20 01:54:23 【问题描述】:

我最近一直在为我一直在研究的一些 C# 构建一个测试框架。我在我的工作区中设置了 NUnit 和一个新项目来测试组件。如果我从 Nunit (v2.4) 加载我的单元测试,一切正常,但我已经到了在调试模式下运行并设置一些断点非常有用的地步。

我已经尝试了几个指南中的建议,这些建议都建议更改测试项目的“调试”属性:

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 -&gt; Visual C# -&gt; Test -&gt; Test Project ...当您选择项目类型时,据我所知,Visual Studio 将尝试使用它自己的测试框架。您应该选择 normal C# 类库项目,然后我选择的答案中的说明将起作用。

【问题讨论】:

你的测试夹具类在我看来很好,所以它一定是你建议的项目中的东西。 看这个问题:***.com/questions/247900/…答案是一样的... 【参考方案1】:

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

【讨论】:

供您(和其他人)参考:调试|附加在 VS 的 Express 版本中不可用。 请注意,您必须在 NUnit 的设置对话框中选择“启用 Visual Studio 支持” -> IDE 支持 对于.NET 4.0及以后的版本,相信你也得在nunit.exe.config中加入这个:&lt;startup&gt; &lt;supportedRuntime version="4.0" /&gt; &lt;/startup&gt; 这是附加到正确进程的快捷方式(在包管理器控制台中运行): ($dte.Debugger.LocalProcesses | ? $_.Name.EndsWith("nunit-agent.exe ") ).Attach() 仅供参考:您需要将调试附加到名为“nunit-agent.exe”而不是“nunit.exe”的进程。否则你的断点会被忽略,你想知道为什么......【参考方案2】:

我使用与您尝试 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 是否包含您所有的 TestFixture?

由于我的测试项目不是解决方案中的启动项目,我通过右键单击测试项目并选择 Debug --> Start New Instance 来运行我的测试

【讨论】:

我已经尝试了您的建议(删除 /assembly),但没有任何区别。当我启动新实例时,它会产生错误。我认为这主要与以下事实有关:当我创建 TestDSP 项目时,我是从内置的 VisualStudio 测试项目模板中创建它的,因此它正在寻找错误的测试框架。 终于搞定了。我是对的,因为它是阻止它的项目选项 - 使用标准类模板重新创建测试项目解决了这个问题。 如果您还将/run 添加到您的*命令行参数中会有所帮助,这将自动开始执行测试...我还在my blog post 中总结了所有内容(使用图像)。 如果人们不查看 Robert 的(非常有用的)博文 (erraticdev.blogspot.com/2012/01/…):对于 .NET 4.0 及更高版本,我相信您还必须将其添加到 nunit.exe.config : . 后续:在NUnit的更高版本中(截至今日最新版本为v2.6.1),需要在nunit.exe.config中注释掉&lt;supportedRuntime version="v2.0.50727" /&gt;【参考方案3】:

只需删除看起来像的行

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

来自您的项目文件。 这一行基本上告诉 VS.Net 它是一个测试项目,因此是“无法启动测试项目”。仅供参考,第一个 Guid 说“这是一个测试”,第二个说“它是 C#”。 有关这些指南的信息:http://www.mztools.com/Articles/2008/MZ2008017.aspx

【讨论】:

【参考方案4】:

除了@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 测试项目。

【讨论】:

在使用 nunit 从 VS2005 调试 .NET 2 程序集时,我仅使用 v2.0.50727 行就成功了。 (v4 行阻止了 VS 2005 的调试器附加。)【参考方案5】:

如果您使用的是 NUnit 2.4 或更新版本,您可以将以下代码放入您的 SetUpFixture 类中。 (您可以使用旧版本执行此操作,但您需要执行与 SetUpFixture 等效的任何操作,或将其复制到测试本身。)

[SetUpFixture]
public class SetupFixtureClass

    [SetUp]
    public void StartTesting()
    
        System.Diagnostics.Debugger.Launch();
    

Debugger.Launch() 所做的是,当您在 NUnit 中单击“运行”时,会显示以下对话框。

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

【讨论】:

【参考方案6】:

在 Nunit 3.0.1(我使用的是 VS2013)中,从主菜单 > 测试 > Windows > 测试资源管理器打开。然后在“测试资源管理器”中,右键单击测试用例,您可能会看到:

希望这会有所帮助。

【讨论】:

感谢您的回答。比其他所有的都简单得多。 我在 VS 2015 中使用 NUnit 2.5.9,它与名为“NUnit 2 测试适配器”的 VS 扩展一起使用。您可以在测试资源管理器窗口中执行测试。【参考方案7】:

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

从那里您可以右键单击您的单元测试程序集并单击运行测试以运行整个套件,右键单击 TestFixture 类以仅运行该类中的测试,或右键单击测试方法以运行该类方法。

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

【讨论】:

170 美元对于这样的工具来说太高了。哄抬物价,有人吗? 是的。为了那笔钱,我宁愿投资 JetBrains Resharper,它会免费为 Test Runner 提供调试集成和许多其他生产力功能。 使用 Visual Studio 2012,您可以免费获得 NUnit Test Runner with Nuget。【参考方案8】:

试试 NUnitit - 一个用于调试 NUnit 测试用例的开源 Visual Studio 插件

主页 - http://nunitit.codeplex.com/

【讨论】:

这很好,虽然我找不到方法告诉它只运行一个测试(?)【参考方案9】:

从项目文件中删除 ProjectTypeGuids。

【讨论】:

【参考方案10】:

现在有图片:

    运行 NUnit gui (Download 2.6.2 from here) 然后转到 File -&gt; Open Project

    从 bin 文件夹 (C:\......\[SolutionFolder][ProjectFolder]\bin\Debug\xxxxTests.dll) 中选择您的测试 .dll

    转到 Visual Studio Debug -&gt; Attach to process(将打开附加到进程窗口)

    从列表中向下滚动并选择nunit-agent.exe,然后单击Attach

    此时测试中的断点应该变成成熟的红色(来自空心)。

    Nunit Gui 上单击Run,您应该会遇到断点...

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

【讨论】:

【参考方案11】:

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

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

【讨论】:

【参考方案12】:

如果项目路径包含空格,例如路径 &lt;path&gt;\bin\Debug\New Project\Quotes.Domain.Tests.dll 中的“新建项目”,然后将 Start Option --> Command Line Arguments 项目路径用双引号括起来。

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

【讨论】:

【参考方案13】:

关于Patrick McDonald先生所说的

由于我的测试项目不是解决方案中的启动项目,我通过右键单击测试项目并选择 Debug --> Start New Instance 来运行我的测试

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

【讨论】:

【参考方案14】:

听起来您正在尝试使用错误的库。只有当您使用的 dll 包含 TestFixtures 时,NUnit 才能启动。

+1 在 TestDriven.Net 上。我有机会多次使用它。 您可以根据http://testdriven.net/purchase_licenses.aspx 的许可下载个人版进行评估。

【讨论】:

查看最近的编辑 - 我有一个测试夹具,但完全有可能我没有正确设置它。【参考方案15】:

我在使用 MSTest 时遇到了同样的错误。我发现在Test Output窗口中,有些测试有重复的ID,无法加载。我删除了所有重复的测试,现在我可以在启动项目时运行测试。

【讨论】:

【参考方案16】:

现在还有一个扩展“Visual NUnit”,它允许您从 Visual Studio 中运行测试,就像构建测试框架句柄一样。在扩展管理器中查看它。

【讨论】:

【参考方案17】:

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

设置后点击调试

【讨论】:

【参考方案18】:

对我来说,解决方案是调整 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 位置的参数。

更多信息:nunit for testing with .NET 4.0

【讨论】:

【参考方案19】:

看看这是否有帮助.. How to add NUnit in Visual Studio

(RighteousRant)虽然我个人不喜欢这种方法。如果您在测试驱动代码时需要调试器,这是一种“气味”,因为您没有足够的信心/不知道如何您的代码有效并且需要调试器来告诉您。如果操作正确,TDD 应该让您不再需要调试器。仅在极少数情况下或当您涉足其他人的代码时才使用“将调试器附加到 NUIt”。

【讨论】:

我尝试了那里的建议,但无济于事。很明显,你的鼻子很好。我知道我的代码不起作用,因为我为第一个实现块获得的输出对我的测试参考得到了截然不同的答案。所以现在我正在尝试更深入地研究问题的原因。我宁愿将其与程序的其余部分隔离开来(因此需要在调试模式下运行单元测试)。作为记录,这是其他人编写的代码,它是从其他人的算法转换而来的:-/ 所以这属于我最后一行的后一个子句:) 奇怪的是你不能让它工作......太糟糕了。我会说只是附加到进程(Alt+D+P)而不用纠结它.. 这里没有异味——我有一个测试用例在某些环境中失败(返回一个非常错误的结果),我需要找出原因。为此,我想调试它并找出它在这个环境中失败的地方,以便我可以修复代码并使测试在任何地方都通过。这似乎是标准的红色/绿色类型的东西...... @BrainSlugs83 - 很久没写这个了。我(仍然)反对将您的测试作为主要工作实践进行调试。边缘情况 - 我可以使用调试器。即使那样,我也可能会先插入日志记录 stmts。我认为这是因为我观察到太多人使用 Code-Crash-Debug-Adjust 循环,该循环通过调试器简化为 Code-Crash-Adjust 循环持续开启。

以上是关于如何从 Visual Studio 以调试模式运行 NUnit?的主要内容,如果未能解决你的问题,请参考以下文章

无法从特权运行的 Visual Studio 2010 拖放到调试的应用程序运行

调试模式在 Visual Studio 2015 中不起作用

在调试模式下执行控制台应用程序后,如何让 Visual Studio 暂停?

Visual Studio 中的 DLL 响应太慢

Visual Studio 在调试模式下禁用 TRACE

如何仅为调试构建运行 Visual Studio 构建后事件