在单元测试中使用随机性和/或迭代?

Pet*_*ter 8 unit-testing

在单元测试中,我已经习惯了测试应用一些常规值的方法,一些违反方法合同的值,以及我能想出的所有边界情况.

但这是非常糟糕的做法

  • 测试随机值,这是一个你认为永远不会给任何麻烦的范围内的值,这样每次测试运行时,会传入另一个值?作为一种对常规值的广泛测试?
  • 使用迭代测试整个范围?

我觉得这两种方法都没有任何好处.通过范围测试,我可以想象,这样做是不切实际的,因为它需要时间,但随机性?

更新:

我自己并没有使用这种技术,只是想知道它.如果你能在需要的时候使用它,那么随机性可以成为一个很好的工具.
最有趣的回答是Lieven的'模糊'提示:

http://en.wikipedia.org/wiki/Fuzz_testing

TX

ffo*_*orw 5

单元测试需要快速.如果他们不是,人们不会经常运行它们.有时我会检查整个范围的代码,但@ Ignore'd最后评论了它,因为它使测试太慢了.如果我要使用随机值,我会选择带有固定种子的PRNG,以便每次运行实际检查相同的数字.


Gis*_*shu 5

  1. 随机输入 - 测试不可重复(每次运行时产生一致的结果,因此不被认为是良好的单元测试.测试不应改变他们的想法.
  2. 范围测试/ RowTests - 只要它们不会减慢测试套件运行速度就很好..每个测试都应该尽可能地运行.(30秒内完成测试套件的运行频率超过10分钟) - 最好是100毫秒或更短.那说每个输入(测试数据)应该是'代表'输入.如果所有输入值都相同,则测试每个输入值不会添加任何值,而只是常规数字运算.您只需要该组值中的一个代表.您还需要代表边界条件和"特殊"值.

有关指导原则或更多内容的更多信息 - 请参阅"什么是良好的单元测试?"

那就是说...你提到的技术可以很好地找到代表性的输入.所以用它们来找到代码失败或成功错误的scenarioX - 然后写一个可重复的,快速的,仅测试一次的单元测试scenarioX并将其添加到您的测试套件中.如果您发现这些工具继续帮助您找到更多优秀的测试用例..坚持使用它们.

回应OP的澄清:

  • 如果在每次测试运行中对随机无生成器使用相同的种子值(测试输入),则测试不是随机的 - 可以预先确定值.但是,理想情况下,单元测试不需要任何输入/输出 - 这就是xUnit测试用例具有void TC()签名的原因.
  • 如果在每次运行中使用不同的种子值,那么现在您的测试是随机的,不可重复.当然,您可以搜索日志文件中的特殊种子值以了解失败的内容(并重现错误),但我喜欢我的测试,以便立即让我知道失败的原因 - 例如Red TestConversionForEnums()让我知道枚举转换代码被破坏而没有任何检查.

可重复 - 意味着每次在SUT上运行测试时,它都会产生相同的结果(通过/失败)..不能'我能再次重现测试失败吗?' (可重复!=可重复).重申..这种探索性测试可能很好地识别更多测试用例,但我不会将其添加到我每次在白天进行代码更改时运行的测试套件中.我建议手动进行探索性测试,找到一些好的(有些人可能会使用虐待狂)测试人员会对你的代码进行锤子和钳子...会发现你比测试案例更多的随机输入生成器.


Lie*_*ers 3

我一直在测试用例中使用随机性。它在 SUT 中发现了一些错误,并在测试用例中给出了一些错误。

请注意,使用随机性会使测试用例变得更加复杂。

  • 您需要一种方法来使用失败的随机值来运行测试用例
  • 您需要记录每次测试使用的随机值。
  • ...

总而言之,我正在努力重新使用随机性,但不会完全拒绝它。与每一种技术一样,它都有其价值。

为了更好地解释您所追求的内容,请查找术语模糊测试