我读过很多关于可用的.NET单元测试框架。 什么是我不明白是什么是区分可用框架的关键特性。 什么是你看评估的单元测试框架时必须具备的功能?
Answer 1:
我同意,他们都相当类似的,当涉及到断言和其他基本功能。 当他们开始不同是更高级的选项,如脚本框架,构建工具,自动化集成等
如果您打算有很多定制的运行使用像CruiseControl.NET一个高度自动化的构建过程构建选项和自定义scritpting我可能会使用NUnit。 有触发基于测试结果的其他行动有更多的钩子。
如果你是刚开始接触单元测试,只打算做基本的集成测试,我会坚持MSTest的,因为它与Visual Studio紧密集成的2008年(NUnit的有选项,可与IDE集成,但更好的工具,费钱。)
这里是一个小对比表:
| NUnit | MStest
---------------------------------------------------------------------------------
Asserts | missing some collection asserts | missing some numeric/date asserts
---------------------------------------------------------------------------------
Speed | test run fast, faster setup on | w/ VS 2008 no setup necessary on
| servers and the like | the client, test run fairly fast.
---------------------------------------------------------------------------------
Options | a lot of 3rd party add-ons and | some 3rd party tools
| other tools |
---------------------------------------------------------------------------------
CC.NET | good integration, lots of tools | newer versions of CC.NET support
| and options | MS test out of the box, not as
| | many add on tools
---------------------------------------------------------------------------------
Answer 2:
这里有一些事情我找
- 速度。 框架(和测试跑步者)不都是一样的。 如果你的单元测试落后,你的生产时间被浪费了。
- 断言。 这些都需要大量提供许多场景。 你喜欢使用属性或捕获的异常
Assert.Throws
,例如? 是声称能够做数字比较与指定的宽容? - 杂记。 有用的东西,某些框架有诸如行测试或能够在测试数据以XML格式阅读。
Answer 3:
我寻找的东西是工具集支持,我特别的优先级为持续集成的支持。 单元测试的最重要的部分(至少对我来说,不是TDD一个巨大的风扇)是将它们插入到我的CI构建服务器。
出于这个原因,我喜欢NUnit的,因为在CruiseControl的,这是选择我的构建服务器,它预建的建设任务。 这并不是说,你可以不插任何其他测试框架到CC,NUnit的恰好是一个容易使用。
至于可用的功能,MSTest的,当你与定价飞驰的Visual Studio Team System中与后端TFS运行它有一些非常好的插件。
说到这一切,是不是真的有在个别测试框架的functionalty(我有一个的xUnit,NUnit的和MSTest的经验)相差太大了 - 他们都允许你定义单元测试,并报告如何mnay过去了,如何许多失败。 他们都有某种GUI的,并且可以将它们全部与构建服务器整合。
Answer 4:
他们都做同样的事情,如果他们不这样做,他们有这意味着你可以完成同样的事情扩展点。 在这个意义上,您可以根据选择任何框架时使用相同的标准来评估它们(如流行(NUnit的),MS-Certiffied(MS-测试)等等等等)
但是,如果你选择一个想要建议,我建议你上的xUnit读了“为什么我们要建立的xUnit”网页,其中指出,某些周边的单元测试框架的问题。
如果你想看到所有的框架有一些相似之处,你可以从上表看到这里 ,他们都有很多相似的特征,只是为了不同的事情的话。
当然,选择一个BDD框架是鱼的不同水壶。
Answer 5:
我在几乎每一个测试框架错过一件事是统一的说法 ,我的意思是测试应看起来是一样的,无论什么,我主张的。 无论是我做的值基于状态的断言,基于行为的一个模拟或断言异常应抛出断言。
我将使用Ruby作为一个例子,但适用于任何环境。 (而且,顺便说一句,你是不是仅限于C#框架测试.NET应用程序,你可以使用任何 .NET语言,其中当然Ruby是一个,因为是Python的,计划,F#,...)
这是test/unit
(的JUnit的早期版本的端口)与摩卡为嘲笑。
def test_state
assert_equal 2, 1+1
end
def test_exception
assert_raises(NoMethodError) { [].not_a_method }
end
def test_behavior
o = Object.new
o.expects(:ping).with(:pong)
o.ping(:pong)
end
注意:所有的断言如何看起来不同,在不同的地方,实际的测试代码是在三个不同的地方为好。
这是预期,这AFAIK是得到它的权利的唯一框架。 (事实上,它是专为均匀断言的目的而创建的。)不幸的是,它不再维持或支持作为笔者没有做任何的Ruby工作了。
expect 2 do
1+1
end
expect NoMethodError do
[].not_a_method
end
expect Object.new.to.receive(:ping).with(:pong) do |o|
o.ping(:pong)
end
注意断言怎么总是一样的,两者的断言和测试代码总是在同一地点。
较新的框架,如xUnit.Net和被的Mockito肯定越来越接近,虽然。
Answer 6:
面向开发者的单元测试(!请注意,我说的不是面向客户的验收测试)都是这样的产品代码:他们应该以这样的方式,这是显而易见的,他们在做什么来写。 事实上,这是即使测试更重要的不是它是生产代码,因为生产代码必须测试告诉你的代码是否工作,与试验,所有你正在读他们,看他们是否有意义或不。
因此,面向开发者的单元测试应该不需要注释。 而测试的名称是注释,因此,您的框架应该不会强迫你命名你的测试。
下面是一个例子(在RSpec的,这当然也可以在.NET被使用,此时间):
describe Array do
it 'should be empty' do
Array.new.should be_empty
end
end
这仅仅是愚蠢的。 需要测试名了解该测试是做应该认真地重新思考自己的职业选择的任何开发者。 此外,所有与意见相同的问题需要注意:如果有人有什么改变了测试,但忘记改名字? 现在,这个名字不仅无益,而且还误导! 这是好多了:
describe Array do
it do
Array.new.should be_empty
end
end
RSpec的还有一个漂亮的几招:它会自动创建您要为您测试的类的实例,让你不必说做ClassUnderTest.new.should
一遍又一遍,你可以说should
:
describe Array do
it { should be_empty }
end
而且,顺便说一句,就像一个开发人员可以弄清楚这是什么测试,所以可以RSpec的。 这是它吐出来在这三种情况下,如果你问它的测试套件的客户可读的总结:
Array
- should be empty