单元测试中的随机数据?
我有一个同事,他为用随机数据填充其字段的对象编写单元测试。他的原因是它提供了更广泛的测试范围,因为它将测试许多不同的值,而普通测试仅使用单个静态值。
我为此提出了许多不同的理由,主要的理由是:
- 随机值表示测试并非真正可重复(这也意味着如果测试可以随机失败,则可以在构建服务器上这样做并破坏构建)
- 如果它是一个随机值并且测试失败,则我们需要a)修复对象,b)每次都强迫我们测试该值,所以我们知道它是有效的,但是由于它是随机的,所以我们不知道该值是什么
另一位同事补充说:
- 如果我正在测试异常,则随机值将无法确保测试以预期状态结束
- 随机数据用于冲洗系统和负载测试,而不用于单元测试
还有谁能补充我可以给他的其他理由,让他停止这样做?
(或者,这是否是编写单元测试的可接受方法,而我和我的其他同事是错误的?)
解决方案
回答
根据对象/应用程序,随机数据将在负载测试中占有一席之地。我认为更重要的是使用显式测试数据边界条件的数据。
回答
我们能否一次生成一些随机数据(我的意思是一次,而不是每次测试运行一次),然后在以后的所有测试中使用它?
我绝对可以看到在创建随机数据以测试我们没有想到的情况下的价值,但是我们是对的,拥有可以随机通过或者失败的单元测试是一件坏事。
回答
if it's a random value and the test fails, we need to a) fix the object and b) force ourselves to test for that value every time, so we know it works, but since it's random we don't know what the value was
如果测试用例不能准确记录所测试的内容,则可能需要重新编码测试用例。我一直想拥有可供测试用例参考的日志,以便我确切地知道是什么原因导致了使用静态或者随机数据失败。
回答
这里有一个半途而废的房子,有一定用途,可以用一个常数为PRNG播种。这使我们可以生成可重复的"随机"数据。
我个人认为确实存在某些地方,在我们认为自己做了所有经过深思熟虑的角落之后,(恒定)随机数据对于测试很有用,使用PRNG的刺激有时可以找到其他东西。
回答
在"美丽代码"一书中,有一章称为"美丽测试",他在其中介绍了二进制搜索算法的测试策略。一段称为"测试的随机行为",其中他创建了随机数组以彻底测试算法。我们可以在第95页的Google图书上在线阅读其中的一些内容,但这是一本值得拥有的好书。
因此,基本上,这仅表明生成随机数据进行测试是可行的选择。
回答
有一个妥协。同事实际上是在做某事,但我认为他做错了。我不确定完全随机测试是否很有用,但肯定不是无效的。
程序(或者单元)规范是一种假设,即存在一些符合要求的程序。然后,程序本身就是该假设的证据。应该进行哪种单元测试是为了提供反证,以反驳该程序是否按照规范运行。
现在,我们可以手动编写单元测试,但这确实是一项机械任务。它可以是自动化的。我们所要做的就是编写规范,一台机器可以生成很多试图破坏我们代码的单元测试。
我不知道我们使用的是哪种语言,但请参见此处:
爪哇
http://functionaljava.org/
Scala(或者Java)
http://github.com/rickynils/scalacheck
哈斯克尔
http://www.cs.chalmers.se/~rjmh/QuickCheck/
。网:
http://blogs.msdn.com/dsyme/archive/2008/08/09/fscheck-0-2.aspx
这些工具将采用格式正确的规范作为输入,并使用自动生成的数据自动生成所需的任意单元测试。他们使用"缩小"策略(可以调整)来找到最简单的测试用例,以破坏代码并确保它很好地覆盖了边缘情况。
测试愉快!
回答
如果人看不到他是否已解决问题,该如何再次进行测试? IE。他失去了测试的可重复性。
虽然我认为在测试中暂存随机数据负载可能有一些价值,但正如其他答复所提到的那样,它比负载测试更容易受到负载测试的支配。这几乎是"希望测试"的做法。我认为,实际上,家伙根本没有考虑他要测试的内容,而希望通过随机性来弥补这种思想上的不足,最终会陷入一些神秘的错误。
所以我要和他一起使用的论据是他很懒。或者换一种说法,如果他不花时间去理解他要测试的内容,那可能表明他并不真正理解他正在编写的代码。
回答
我们今天碰到了这个。我想要伪随机(因此就大小而言,它看起来像压缩的音频数据)。我要做的事情是我也要确定性。 rand()在OSX和Linux上有所不同。除非我重新播种,否则它可能随时更改。因此,我们将其更改为确定性的,但仍然是伪随机的:该测试是可重复的,与使用固定数据一样多(但更方便编写)。
这不是通过某种随机的蛮力通过代码路径进行测试。区别在于:仍然是确定性的,仍然是可重复的,仍然使用看起来像真实输入的数据来对复杂逻辑中的边缘情况进行一组有趣的检查。仍然是单元测试。
那还符合资格是随机的吗?让我们来谈谈啤酒。 :-)
回答
这种测试称为猴子测试。如果操作正确,它可以从真正黑暗的角落冒出错误。
解决我们对可重复性的担忧:解决此问题的正确方法是记录失败的测试条目,生成单元测试,以探查特定缺陷的整个家族;并在单元测试中包括一个导致初始故障的特定输入(来自随机数据)。
回答
如果我们使用随机输入进行测试,则需要记录输入内容,以便查看值是什么。这样,如果遇到一些极端情况,我们可以编写测试以重现它。我听到人们不使用随机输入的相同原因,但是一旦我们了解了用于特定测试运行的实际值,那么就不再是问题。
"任意"数据的概念作为表示不重要内容的一种方式也非常有用。我们想到了一些验收测试,其中存在大量与手头测试无关的噪声数据。
回答
同事正在进行模糊测试,尽管他对此一无所知。它们在服务器系统中特别有价值。
回答
查看测试的人的一个优势是,任意数据显然并不重要。我见过太多涉及数十个数据的测试,可能很难分辨出需要哪种方式以及刚发生的那种方式。例如。如果使用特定的邮政编码对地址验证方法进行了测试,而所有其他数据都是随机的,那么我们可以确定邮政编码是唯一重要的部分。