【问题标题】:Randomized testing in JavaJava中的随机测试
【发布时间】:2016-06-16 01:11:45
【问题描述】:

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

但是,很多时候,随机测试会发现许多错误,并且可以作为手写案例的重要补充。

例如,我可能有一个自包含的类,并且能够简单地表达该类的不变量和粗略的行为(例如“这个方法从不抛出异常”或“这个方法总是返回一个正值”)。我想要一个测试框架,它只针对我的类并检查不变量。

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

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

  1. 创建具有随机初始状态的对象
  2. 应用随机突变
  3. 为 A 与 B 测试创建“相似”对象之间的映射
  4. 定义不变量和规则,例如“何时抛出异常”

我仍然会时不时地这样做,但我想减少我的努力程度。例如,是否有框架可以删除或简化所需的样板?

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

这是相关的,但与模糊测试不同。模糊测试似乎专注于单个实体的随机输入,希望触发不良行为,通常使用基于动态覆盖观察的自适应输入模型。这涵盖了上述很多内容,但不涵盖诸如 A vs B 测试(当存在可比较的实现时)或不变检查之类的内容。无论如何,我也对不错的 Java 模糊测试库感兴趣。

【问题讨论】:

  • 这可能与您正在搜索的内容类似:pitest.org
  • 我已经编辑了这个问题以删除“给我找一个图书馆”的焦点,所以它现在描述了我的问题(当然,指向图书馆来解决这个问题的答案可能仍然存在 -主题)。
  • @SilasReinagel - 我看过突变测试(pitest 提供的),它非常酷。也就是说,我认为这是对我所追求的一种补充方法——它更多的是随机改变你的应用程序代码以更好地确定测试的有效性,而不是随机生成输入来对你的代码进行单元测试。
  • 啊。我不知道有什么工具与您所描述的非常相似。如果您发现任何问题,请务必将它们放在这个问题中。我有兴趣发现它们。

标签: java unit-testing testing


【解决方案1】:

我认为您要查找的是 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 的随机值生成器,以防标准随机发生器不够用。免责声明:我是作者。

【讨论】:

    猜你喜欢
    • 2014-02-08
    • 1970-01-01
    • 2015-03-04
    • 1970-01-01
    • 1970-01-01
    • 2021-06-02
    • 1970-01-01
    • 2014-07-25
    • 1970-01-01
    相关资源
    最近更新 更多