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

120

我最近在为我正在开发的一些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.
这是因为我通常在Nunit GUI中加载 \DSP.nunit,测试就在那里进行吗?
我开始觉得问题可能是因为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测试框架还比较陌生,所以很可能我错过了一些关键信息;-)

最终解决方案:这个大问题是由我使用的项目引起的。如果你选择 其他语言 -> Visual C# -> 测试 -> 测试项目 ...当你选择项目类型时,Visual Studio 将尝试使用它自己的测试框架。你应该选择一个普通的C#类库项目,然后按照我选定答案中的说明操作。


你的测试夹具类对我来说看起来没问题,所以肯定是项目中有问题,正如你所暗示的那样。 - Patrick McDonald
2
看起来这个问题很像:https://dev59.com/XXVC5IYBdhLWcg3wliKe答案也是一样的... - Patrick Desjardins
19个回答

103

当我需要调试我的NUnit测试时,我只需使用“Debug | Attach to Process”附加到nunit-agent.exe NUnit GUI应用程序,并从GUI运行测试。我会命中测试中的任何断点(或它们正在测试的代码)。我是否误解了你的问题,或者这适用于你?


7
供你(和其他人)参考:在Visual Studio Express版本中,调试|附加功能不可用。 - Richard
15
请注意,在 NUnit 的设置对话框中选择“启用 Visual Studio 支持”,以实现与 IDE 的配合。 - Julio Garcia
8
对于.NET 4.0及以上版本,我认为您还需要将以下内容添加到nunit.exe.config文件中:<startup> <supportedRuntime version="4.0" /> </startup>。 - devuxer
1
这是一个快速附加到正确进程的捷径(在程序包管理器控制台中运行):($dte.Debugger.LocalProcesses | ? { $_.Name.EndsWith("nunit-agent.exe") }).Attach() - bart
7
请注意:您需要将调试器附加到名为“nunit-agent.exe”的进程而不是“nunit.exe”。否则,您设置的断点将被忽略,您会感到困惑... - Krisztián Balla
显示剩余4条评论

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测试项目模板创建的,所以它正在寻找错误的测试框架。 - Jon Cage
你的项目有多大?你能否创建一个新的空项目,添加对NUnit的引用并添加所有的TestFixture类?如果你是使用Visual Studio模板创建的项目,那么你不能使用Visual Studio测试运行器来运行你的测试吗? - Patrick McDonald
3
终于搞定了。我的想法没错,确实是项目选项导致了问题——使用标准类模板重新创建测试项目解决了这个问题。 - Jon Cage
1
如果您在*命令行参数中添加/run,它将自动开始执行测试... 我还在我的博客文章中总结了所有内容(使用图像)。 - Robert Koritnik
6
如果人们没有查看Robert非常有用的博客文章(http://erraticdev.blogspot.com/2012/01/running-or-debugging-nunit-tests-from.html),则需要注意:对于.NET 4.0及更高版本,我认为您还需要将以下内容添加到nunit.exe.config文件中:<startup> <supportedRuntime version="4.0" /> </startup>。 - devuxer
3
后续操作:在NUnit的较新版本(截至今日最新版本为v2.6.1)中,您需要注释掉nunit.exe.config文件中的“<supportedRuntime version =” v2.0.50727“/>”一行。 - devuxer

22

只需要删除看起来像这样的那一行代码


(Simply remove the line that looks like)
<ProjectTypeGuids>
    {3AC096D0-A1C2-E12C-1390-A8335801FDAB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
</ProjectTypeGuids>

这行代码告诉VS.Net它是一个测试项目,因此会出现“无法启动测试项目”的错误提示。其中第一个Guid表示“这是一个测试项目”,第二个Guid表示“使用的编程语言是C#”。 若想了解这些Guids的更多信息,请参考http://www.mztools.com/Articles/2008/MZ2008017.aspx


19

除了@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调试.NET 2程序集时,只有v2.0.50727这一行配置是成功的。(而v4这一行会阻止VS2005调试器的附加。) - Martin Ba

18
如果您正在使用NUnit 2.4或更新版本,可以将以下代码放入您的SetUpFixture类中。(如果您使用的是旧版本,则需要执行等效于SetUpFixture的操作,或将其复制到测试本身中。)
[SetUpFixture]
public class SetupFixtureClass
{
    [SetUp]
    public void StartTesting()
    {
        System.Diagnostics.Debugger.Launch();
    }
}

Debugger.Launch() 是用来在单元测试框架 NUnit 中的“运行”按钮被点击时弹出下面这个对话框的。

JIT Debugger Dialog

你可以选择你正在运行的 Visual Studio 实例并打开你的项目(在我的截图中是第二个),然后调试器就会被附加上,Visual Studio 中的任何断点或异常都会显示出来。


12

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

输入图像描述

希望这可以帮助到您。


2
谢谢你的回答。比其他所有答案都简单多了。 - dano
我在VS 2015中使用NUnit 2.5.9,并且它与名为“ NUnit 2 Test Adapter”的VS扩展一起工作。您可以在“测试资源管理器”窗口上执行测试。 - mggSoft

6

安装TestDriven.NET插件到Visual Studio中。

接下来,您可以右键单击单元测试程序集并选择“运行测试”以运行整个测试套件,右键单击TestFixure类以仅运行该类中的测试,或右键单击Test方法以仅运行该方法。

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


2
$170 对于这样的工具来说太过离谱了。价格欺诈,有人同意吗? - Ben Hardy
是的。对于这种金额,我宁愿投资于JetBrains Resharper,然后免费获得测试运行器、调试集成和一堆其他生产力功能。 - Roman
使用Visual Studio 2012,您可以免费通过Nuget获取NUnit测试运行器。 - Jon Limjap

6

这很不错,尽管我找不到一种方法来告诉它只运行一个测试(?) - Jon Cage

5
从项目文件中删除ProjectTypeGuids。

3
现在有图片说明:
  1. 运行 NUnit gui (从这里下载2.6.2版本),然后转到 File -> Open Project

enter image description here

  1. 选择 bin 文件夹中的测试 .dll (C:\......\[解决方案文件夹][项目文件夹]\bin\Debug\xxxxTests.dll)

  2. 转到 Visual Studio Debug -> Attach to process (将打开“附加到进程”窗口)

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

enter image description here

  1. 此时,你的测试断点应该变成红色(非空心)。

  2. 单击 Nunit Gui 上的 Run,然后应该就可以捕获到断点了...

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接