Java中的随机测试

时间:2016-06-16 01:11:46

标签: java unit-testing testing

我写了很多单元测试。通常,您需要手动编写经过仔细考虑的测试用例,这是一种白盒测试形式。如果您有幸为一家拥有独立质量保证工程师的公司工作,也许其他人会为您编写测试用例(白盒和黑盒测试之间的混合)。

然而,很多时候,随机测试会发现许多错误,并且可以作为手写案例的一个很好的补充。

例如,我可能有一个自包含的类,并且能够简单地表达类的不变量和宽笔画行为(例如“此方法永远不会抛出异常”或“此方法始终返回正值“)。我想要一个仅仅依赖于我的类并检查不变量的测试框架。

类似的情况:我经常有一个类实现与另一个类相似的功能(但它具有不同的性能特征或一些附加功能)。我希望A vs B以随机方式测试这两个类。例如,如果我正在实施TreeMap,我可以使用HashMap作为可比较的实现(由于TreeMap的排序行为导致一些差异,并检查大多数基本功能)一种随机的方式。同样地,实施LinkedList的人可以使用ArrayList作为可比较的实现,反之亦然。

我过去曾写过一些基本的东西来做这件事,但要将所有样板设置为:

  1. 创建具有随机初始状态的对象
  2. 应用随机突变
  3. 在A对B测试的“喜欢”对象之间创建映射
  4. 定义不变量和规则,例如“何时会抛出异常”
  5. 我仍然不时地这样做,但我想减少我的努力程度。例如,是否有框架可以删除或简化所需的样板?

    否则,在Java中使用哪些技术进行随机测试?

    这与模糊测试有关,但不一样。模糊测试似乎侧重于单个实体的随机输入,希望触发不良行为,通常使用基于动态覆盖观察的自适应输入模型。这涵盖了上面的很多内容,但没有涵盖,比较A类和B类测试时可比较的实现,或不变检查。无论如何,我也对Java的体面模糊测试库感兴趣。

1 个答案:

答案 0 :(得分:2)

我认为您尝试查找的是Java中基于属性的测试的库(请参阅types of randomized testing)。简而言之:不是测试结果的值,而是测试它的属性。例如。而不是检查2 + 2是否为4,您需要检查以下属性:

  • random1 + 0 = random1
  • random1 + random2 >= random1
  • ...

详细了解解释基于属性的测试的this article

你提到的另一个选择是检查你的测试Oracle - 知道真正答案的东西(例如旧的防弹算法)。因此,您将随机变量传递给旧算法和新算法,并检查结果是否相等。

一些 Java库

  • JUnit QuickCheck - 基于属性的测试的专用库。允许您定义属性并传递这些属性的随机值以进行检查。到目前为止(06/2016),它还很年轻,所以你可能想看看ScalaCheck,因为它可以为Java代码编写Scala测试。
  • Datagen - Java的随机值生成器,以防标准随机数发生器不够用。免责声明:我是作者。