什么是调试 NUnit 测试的最佳方法?

12

我的平台:Visual C# 2008 Express Edition和NUnit 2.2.7

我的代码在一个项目中,我的NUnit单元测试在同一个解决方案的另一个项目中。

我一直很努力地调试和单步执行NUnit测试。我在网上找到了一些参考资料,建议调用以下内容:

NUnit.ConsoleRunner.Runner.Main(args);

但是这段代码甚至无法编译 - 它会出现编译器错误:

Error 1 类型或命名空间名称“Runner”在命名空间“NUnit.ConsoleRunner”中不存在(是否缺少程序集引用?)

我已经添加了所有可能找到的程序集引用,但没有效果。

最终,这是我所拼凑出来的代码,并且可以运行,但也许您读者可以提供更好的解决方案:

1) 在我的测试项目中,我想要调试的测试用例的类名为MyTestClass。它有一个名为Init()的[TestFixtureSetUp]方法和实际的测试用例在[Test]函数MyTest()中。

2) 在我的代码项目中,我有一个名为TestProgram.cs的控制台程序,它被编译为EXE。

在TestProgram.cs中,我以以下方式调用测试用例:

// First instantiate the test class
MyTestClass tc = new MyTestClass();

// Call the TestFixtureSetup method
tc.Init();

// Now call the actual test
tc.MyTest();

这行代码有效,我可以调试并单步执行测试用例。

如果有人在不支付额外插件的情况下使用 Visual Studio 2008 Express 有更好的建议,我会感激你的建议。


一般来说,如果你正确地进行操作并进行逐步开发,就不应该需要使用调试器。但是你可能处于不同的情况下.. - Gishu
6个回答

3

Jon有一种好方法,但不是更自动化的方法 ;)

这是我在SO上已经说过的

您可以创建一个空项目(例如选择控制台应用程序),在项目属性中选择DEBUG标记并选择Start External Program。放置Nunit的路径。然后,在开始选项中,命令行参数选择包含所有测试的DLL(我的始终位于nunit\bin...)。然后选择Enable unmanaged code debugging,您将能够在VS内启动项目,甚至使用调试器逐步进行。

这样,您无需每次都执行宏或任何其他操作,只需正常按F5即可 :)


3
你真的需要一个单独的项目吗?你不能只是在你的单元测试项目上设置这些选项吗? - Kent Boogaart
肯特是正确的。(当然,除非 Express 版本不允许按F5时启动外部程序) - Pedro
1
在 Visual C# 2010 Express 中,您无法使用“启动外部程序”。来自 http://msdn.microsoft.com/en-us/library/68c8335t.aspx 的说明:“Express 版本(如 Microsoft Visual C# Express)不支持更改 StartAction 属性;这仅受完整的 Visual Studio 产品支持。” - Zach Burlingame

2

感谢BlackWasp。此链接解决了付费版本具有“启动外部程序”选项,而Express版本则没有的问题。 - Zach Burlingame
1
有人能恢复那个网页吗?我真的很想读它,但URL已经失效了... - mtijn

2

由于您使用的是Visual Studio Express版本,因此无法使用免费的TestDriven.NET插件。这很不幸,因为那确实是我用来调试单元测试的最好工具。

Runner类可以在nunit-console-runner.dll程序集中找到,因此请确保添加对其的引用。我不确定它是否有什么功能是您的简单入口点没有的,但最好还是使用它以确保安全性和未来的兼容性。

另一个(肮脏的)值得一提的选项是让您的单元测试调用Debugger.Attach()。我没有尝试过Express安装,但运行单元测试时应提示您附加调试器。然后,您可以选择现有的VS实例并使用它进行调试。


1
你用过ReSharper的测试运行器吗?我发现它比TestDriven.NET好多了,当然它不是免费的。 - Jon Skeet
嗨Jon,是的,我使用过并且同意它是一个不错的代码编辑器。然而,因为其资源需求量,我不是ReSharper的粉丝。我尝试了相当长的时间(> 3个月)使用它,但发现它给我带来了很多困扰。 - Kent Boogaart

0
如果您安装了ReSharper,它应该能够检测到您的[Test]固定装置,并在每个方法左侧放置一个图标以运行,并在每个测试固定装置左侧放置一个图标以运行所有测试。我更喜欢这种方式。
我工作中的大多数人也有TestDriven.NET,但出于某种原因,我的机器上没有,所以他们想知道发生了什么事。这有点有趣。

0
在我的店里,我们正在按照您的方式进行操作。不足之处是,这意味着设置可能与 NUnit 的设置不完全相同。但好处是,这很容易做到,并且允许创建一个最小的环境来重现错误。

0
我在网上找到了一些参考资料,建议调用以下内容:NUnit.ConsoleRunner.Runner.Main(args); 但是这甚至无法编译 - 它有编译器错误:
JFYI 您需要在 NUnit DLL 组合中添加对 nunit-console-runner 程序集的 .NET DLL 引用(我有 2.2.4.0 版本) 似乎类名也已更改,但如果需要,它仍然存在。
NUnit.ConsoleRunner.ConsoleUi.Main(args);

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