2010-09-19 143 views
1

我有一个单元测试,即使在代码没有错误的情况下,也可以在1,000,000(猜测)时间内自发失败1。这是一个可以接受的宽容,还是TDD宣言需要铁拳绝对?单元测试:是否足够好?

只为那些有兴趣谁它是这样的

 
stuff = randomCrap.get() 
stuff2 = randomCrap.get() 
assert(stuff != stuff2) 
+1

你不应该用随机数据做测试。 – halfdan 2010-09-19 12:55:35

+5

强制链接http://stackoverflow.com/questions/462219/xkcd-random-number/620835#620835 – 2010-09-19 13:10:38

+0

根据这个和墨菲法则,如果你只运行一次应用程序,它将失败:) – takeshin 2010-09-19 21:05:43

回答

3

嗯,这实际上取决于故障的来源。你知道为什么它失败?如果是这样,你是否试图隔离该故障,以便它不会使单元测试跳闸?

就我个人而言,如果是真的 1百万,你知道它为什么会发生,然后添加一个评论,不要担心。毕竟,它不太可能在连续构建中显着困扰人们。当然,如果真的是真的是或者类似的东西,这是一个非常不同的问题。

我会至少尝试删除不正确的来源,虽然。首先,它表明你的测试不可重复。 有时候没关系 - 有些随机性的来源很难提取出来 - 但我会尽量不去做。如果你已经尝试过并且达到了一个障碍,那么务实的事情就是记录下来,然后继续前进,IMO。

+0

可能是一个缓慢的一天在我相信测试将会运行一百万次之前,在地狱中。评论和忽略,陷入困境。 – mglmnc 2010-09-21 08:45:58

1

在发生这种错误之前应该怎么做?

你很舒服,你的功能用户,发生了什么?

你可能想要确定它被记录下来,你的随机生成将重复,有时是重复的请求。

对我来说,这是更令人担忧的部分,它可以发生在你上面显示的,我会认为这是要看的东西。

1

你绝对必须使用随机数据吗?你正在测试一个系统是否返回两个不同的随机值? 否则创建一个存根。 单元测试应该是100%可重复的,这很难做到,例如使用文件系统的东西线程,但这是存根。

1

如果代码中没有错误,则单元测试不能失败。有一个错误,无论是与时间,网络等有关......你还没有弄明白。一旦你明白了,你只是学到了一些你不知道的东西。 +1给你。

如果不固定的话,真正的问题是心理问题。只要系统中出现奇怪/随机/无法解释的情况,该方法就会受到指责。现在,当你考虑这个问题时,最好现在修好红鲱鱼。

和FYI,随机性并不意味着独特

3

问题不在于“TDD是否允许我允许偶尔失败的测试?”而是:“我的系统的要求是否允许偶尔出现故障?”只有你可以回答这个问题。

从TDD的角度来看,偶尔会出现失败的测试很笨拙 - 你不知道,什么时候失败,是因为这是罕见的允许失败之一,还是因为你的代码被破坏了不可接受的方式。所以偶尔失败的测试对你来说总是比总是通过的测试少得多。

如果您的要求是在百万以内有一个不同的行为,那么您应该测试该要求。测试一般情况,不是用随机数,而是用有意义的输入子集。用应该导致特殊行为的值来测试特例。

+0

你有我*你不知道,当他们失败... * – 2010-09-20 14:11:24

0

你的测试断言stuff1是从来没有等于stuff2,但偶尔看到测试失败意味着这是不正确的。

你也许可以断言stuff1是偶尔等于通过采取万个样本,并声称要stuff2说的是平等的频率小于10,但仍这偶尔会失败 - 但往往可能要少得多,其可能可以接受。

你可能会更好过:

stuff = 4 
stuff2 = 5 
assert(stuff != stuff2) 

你可以相当肯定的是,上面的代码将在百万亿次执行一次与您的原码 - 但你肯定这个代码将每次通过!