2010-08-31 193 views
5

每个测试有多个断言是否真的很难闻?我通常尝试遵循“安排,行动,断言”模式以及每个测试指南的单个断言。我认为干净,小型,孤立的测试纯粹是令人敬畏的。大多数情况下,我设法做到这一点。然而,有时候我发现我自己声称“前提条件”之后就像这样排列:在单元测试中声明设置和预置条件

'arrange: 
'pre-conditions:  
    Assert the arrange worked 
'act: 
'assert: 

我的测试测试是否过多?它关心的是它不应该关心的事情吗?我很想听听这方面的一些意见。

+0

可能的重复[在单元测试中是否存在多于Assert的错误练习?](http://stackoverflow.com/questions/762512/is-it-bad-practice-to-have-more-than -a-unit-test) – 2010-08-31 12:54:21

+1

如果从验证测试夹具设置与使用多个断言来验证结果的角度来看,我不认为这是重复的。重新命名问题以反映这一点可能会有所帮助。 – Jay 2010-08-31 13:31:36

+0

我将重新命名以反映该建议。 @Carl Manaster:真棒胡子伙计! – Buzzer 2010-08-31 14:54:37

回答

3

正如我所说here,我想也许我们最好的做法应该是,没有安排-ACT-断言,而是Arrange- 假设 -act断言。在代理之前,我们断言该行动的预期结果尚未生效。这不是,正好与你所要求的相同;一般来说,我认为验证设置并不重要,因为设置错误在任何情况下都倾向于表现得非常“大声”;但是在测试中有第二个断言是一个很好的理由。

1

我认为必须使用Assert来验证设置是不理想的,因为它会使结果混淆(如果只是查看输出,可能很难弄清楚您正在测试的内容)。

我认识到有时候这是必要的,或者你只是想确保一切都按照你打算的方式进行测试。

我的做法是使用Debug.Assert(在C#中)用于此目的,以便安装验证不会成为测试输出的一部分。

如果安装程序没有将系统置于预期状态,则可以通过抛出异常来实现其他语言中的相同功能。

不同的测试跑步者可能会有不同的处理方式,因此您应确保此方法具有预期的效果(测试失败,但只要Debug.Assert通过或没有异常抛出,不会有额外的报告输出)。

+0

所有这些都是很好的答案。但是,我选择了Jay's,因为我喜欢Debug.Assert在测试中的读取方式。再次感谢。 – Buzzer 2010-09-23 15:34:03

1

我不会使用香草“断言”,而是Assert.Inconclusive(MSTest)¹。测试没有失败,所以你不想失败测试运行。

1)Assume在JUnit和NUnit我相信。

+0

链接到[Assert.Inconclusive](http://msdn.microsoft.com/en-us/library/ms243750.aspx) – 2014-11-11 19:10:37

+0

谢谢Derek,更新了答案。 – 2014-11-13 15:14:03