如何在.NET 2.0中最佳实现BDD/TDD?

26

我想要在我的应用程序中添加一个测试套件,但是我不能使用较新的针对.NET 3.5的测试框架。

请问有什么好的测试框架建议可供使用吗?

12个回答

9
我们使用 MbUnitRihno Mocks,它们在一起的表现非常出色。在进行 TDD 时,您几乎肯定需要进行某种形式的依赖注入,虽然这可以手动完成,但最好看一下像 Castle Windsor 这样的 IoC 容器。
非常值得看一下 John Paul Bodhood 的屏幕录像,以帮助您入门。JPB's Blog

9
NUnit和Rhino非常适合,而自动模拟容器可能会引起兴趣。如果您也考虑BDD,那么NBehave可能是一个不错的选择。但是,如果您只是指与单元测试相关的BDD风格(xSpec),则可以通过添加框架来实现(尽管像specunit这样的东西会增加一些语法糖),但您可能需要查看MSpec,它也很有趣。

7

4

这可能是已经提到的概要,但对于TDD,我个人使用Rhino Mocks和MBUnit。Rhino Mocks是一个免费且开源的模拟框架。Rhino Mocks的优点在于我们不需要像在NMock中设置期望那样使用魔法字符串。

我喜欢MBUnit,因为MbUnit有RowTests的概念,可以让您改变测试方法的输入。MBUnit也是免费提供的。

您还需要确保您选择的单元测试框架得到您的CI(持续集成服务器)的支持。Nunit在Cruise Control.NET中默认受支持,而您需要做一些额外的工作才能使MBUnit在ccnet中工作。

从IDE的角度来看,您必须拥有TestDriven.NET。TestDriven.NET允许您在IDE中右键单击并运行测试,并支持MBUnit和Nunit等其他框架。

NBehave是我使用过的BDD库。我没有使用任何其他库,所以无法与您进行比较和对比,但NBehave受到来自MBUnit团队的Gallio的支持,这意味着您可以像运行单元测试一样使用TestDriven.NET运行BDD测试。

我还强烈推荐Resharper。使用此重构和指导工具,您会发现生产力显著提高。它将在您开发测试时帮助您更改代码。

希望这可以帮到您。


4

对于一个Mock Object库,我发现BSD许可的Rhino.Mocks非常令人满意。


4

我也很成功地使用了NUnit

当需要模拟对象时,我也使用NMock。额外的好处是,用于创建模拟对象的工厂被称为Mockery。

为了方便运行单元测试,我使用TestDriven.NET在编码时运行单元测试。此外,我还使用Cruise Control .NET监视SVN,并检查每个新提交是否构建并通过所有单元测试。


NMock过度使用魔法字符串使其成为模拟框架的不佳选择。RhinoMocks或Moq则是更好的选择,因为它们依赖于强类型。 - Ben Scheirman

3

我想给 Moq 喊个好。它是一个干净轻量级的模拟框架,能帮助你顺利完成测试。

内建于 TFS 的测试工具还不错,能完成任务,但使用起来通常有些繁琐。生成的报告、代码覆盖率和一些其他部分尤其糟糕。它们让你在 22 岁就秃顶,而不是在 50 岁。

如果你真的喜欢测试,请考虑尝试一些持续集成。你会很快感受到回归测试带来的痛苦,这种痛苦可能会帮助你更快地达到最终目标。

无论你做什么,请试用几个测试框架,并看看哪个最自然,如果有时间的话。祝好运,编码愉快。


Moq的问题在于它需要.NET 3.5,因为它使用lambda表达式和表达式树。 - Michaël Larouche
不一定是什么可怕的事情,但你说得对,这会阻碍 v2.0 商店的发展。 - smaclell

3

NUnit 可在http://www.nunit.org获取。 即使在使用 MS 技术栈时,我也建议使用它。MVC 预览版中对非 MS 框架的支持正在发生,这显示了正确方向上的明确动向,以允许我们所有人自定义我们的技术栈以适应需求。


3
使用nUnit与TFS并不太困难。甚至在codeplex上有一个项目可以实现这一点:NUnit for Team Build,它甚至会将结果“发布”到仓库中。
我没有尝试过,但是我建议那些对nUnit有大量投资(或者对MSTest工具有强烈偏好)并希望实施TFS的客户继续使用nUnit,而不是试图转换所有现有的测试。

2
对于我的项目,我非常成功地使用了NUnit和TestDriven.NET。你可以创建一个单独的库来托管你的测试代码,也可以将其放在可执行文件或库中。这完全取决于你是否希望将生产代码与测试代码交织在一起。
对于依赖注入,我在当前项目中使用NInject,它非常好用。如果你使用构造函数注入,就不需要在代码中添加[Inject]属性。
我还没有为我的.NET 2.0项目使用模拟库,但对于另一个.NET 3.5项目,我将使用Moq
请注意,所有这些都适用于.NET 2.0及更高版本。(除了Moq)

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