NUnit vs MSTest - 一个变幻无常的TDD新手对它们的体验

时间:2010-03-03 16:50:18

标签: nunit continuous-integration mstest build-server

关于NUnit与MSTest,关于SO的问题有很多,我已经阅读了不少相关内容。我认为我的问题略有不同,可以单独发布。

当我开始使用C#时,我从未考虑过使用MSTest,因为我以前习惯使用C ++时已经习以为常。我基本上忘记了它。 :)所以我从NUnit开始,并喜欢它。测试很容易设置,测试也不是太痛苦 - 只需启动IDE并运行测试!

正如许多人已经指出的那样,NUnit经常更新,而MSTest只会像IDE一样频繁更新。如果你不需要处于TDD(我不是)的最前沿,这不一定是个问题,但我经常更新的问题是让所有系统都保持最新状态。我每天使用大约四到五台不同的PC,虽然更新所有这些并不是一件大事,但我希望有一种方法可以在使用旧版NUnit的系统上正确编译我的代码。由于我的项目引用了NUnit安装文件夹,因此当我升级框架时,任何安装了旧框架的计算机将无法再编译我的项目。我试图通过在SVN中创建一个只有NUnit DLL的公共文件夹来解决这个问题,但即使这样,它也会以某种方式抱怨二进制文件的版本号。 有没有办法解决这个问题?这是让我第一次停止使用的原因。

然后有一天我记得MSTest,并决定尝试一下。我喜欢它已集成到IDE中。 CTRL-R,CTRL-A,所有测试都在运行。多么简单!但后来我发现MSTest中可用的测试类型非常有限。我不知道我真正需要多少,但我想我应该回到NUnit,我做了。

现在我开始调试单元测试了,我在NUnit中弄清楚如何做的唯一方法是将NUnit设置为启动应用程序,然后在我的测试中设置断点。然后在NUnit GUI中,我将运行测试以达到断点。这是一个完整的PITA。然后我再次查看MSTest GUI,看到我可以在那里单击Debug,它将执行我的测试!哇!现在,这是一个让我回到有利于MSTest的杀手锏。

现在,我回来使用MSTest了。不幸的是,今天我开始考虑每日构建,并对Tinderbox进行了一些搜索,这是我之前听过的唯一一个这样的工具。然后,我开始关注buildbot和TFS等其他工具。所以这里的问题是我认为MSTest可以保证将我锁定到TFS以进行自动日常构建,或持续集成,或者任何流行语。我的公司无法承受锁定仅限MS的解决方案(VS除外),所以我想检查其他选择。

我很高兴回到NUnit。我对重写100多个单元测试并不感到兴奋,但这就是它的方式。但是,我真的很想有人解释如何压制我的两个问题,总结如下:

  1. 如何设置NUnit和我的项目,以便我不必在每个系统上继续升级以使我的项目构建?
  2. 如何更轻松地调试单元测试?我的方法很痛苦,因为我必须在NUnit和默认应用程序之间切换以测试/运行我的应用程序。我在SO上看到了一篇提到NUnitIt on codeplex的帖子,但我没有任何经验。
  3. UPDATE - 我正在比较我的开发虚拟机中的内容,到目前为止,NUnitit非常好用。它很容易安装(一键),我只是指向我的SVN外部文件夹中的任何NUnit二进制文件。不错!我也进入了VS - >工具 - >选项 - >键盘并更改了我的CTRL-R映射,CTRL-A映射到NUnitit.Connect.DebugGUI。不完美,因为我还没弄明白如何让NUnit在打开时自动运行测试,但它非常好。调试现在就可以了!

    更新#2 - 我安装了TestDriven.Net并快速浏览了一下。总的来说,我比NUnitit更喜欢它,但目前,NUnitit因为它是免费的而获胜,而且由于它也适用于NUnit,它将允许我在时机成熟时“升级”到TestDriven.Net。我最喜欢TestDriven.Net的是,当我双击失败的测试时,它使我在测试中失败了,而NUnit + NUnitit似乎没有能力。有没有人能够在NUnit GUI和VS IDE之间建立这种联系?

3 个答案:

答案 0 :(得分:2)

为了便于调试(以及运行)单元测试,我建议您查看TestDriven.Net。 “使用>调试器测试”功能非常方便。个人版是免费的。

答案 1 :(得分:2)

我参与过的许多项目都在其源代码管理中的“lib”或“extrernal”或“libraries”文件夹中包含了特定版本的NUnit(或xUnit.net,无论如何)的副本,并参考了用于构建所有测试的位置。这大大减少了“升级所有人”的麻烦,因为你真的不需要安装 NUnit或xUnit.net来使用它。

这种方法仍然允许你使用类似TestDriven.Net的东西来执行测试,在调试器中运行测试等。

答案 2 :(得分:0)

您是否在NUnit.framework引用中使用了“特定版本”属性?我们将我们的设置设置为true,以便为给定的nunit版本编码的测试需要执行特定版本。

我不确定它会如何处理,例如,如果你的机器上有2.5但另一台机器只有2.4 - 会很快地绑定到2.4版本,或者它只会从早期版本绑定到更高版本一个程序集(例如,编译为2.4,但在运行时可用2.5?)

相关问题