我写了很多单元测试。通常,您需要手动编写经过仔细考虑的测试用例,这是一种白盒测试形式。如果您有幸为一家拥有独立质量保证工程师的公司工作,也许其他人会为您编写测试用例(白盒和黑盒测试之间的混合)。
然而,很多时候,随机测试会发现许多错误,并且可以作为手写案例的一个很好的补充。
例如,我可能有一个自包含的类,并且能够简单地表达类的不变量和宽笔画行为(例如“此方法永远不会抛出异常”或“此方法始终返回正值“)。我想要一个仅仅依赖于我的类并检查不变量的测试框架。
类似的情况:我经常有一个类实现与另一个类相似的功能(但它具有不同的性能特征或一些附加功能)。我希望A vs B以随机方式测试这两个类。例如,如果我正在实施TreeMap
,我可以使用HashMap
作为可比较的实现(由于TreeMap
的排序行为导致一些差异,并检查大多数基本功能)一种随机的方式。同样地,实施LinkedList
的人可以使用ArrayList
作为可比较的实现,反之亦然。
我过去曾写过一些基本的东西来做这件事,但要将所有样板设置为:
我仍然不时地这样做,但我想减少我的努力程度。例如,是否有框架可以删除或简化所需的样板?
否则,在Java中使用哪些技术进行随机测试?
这与模糊测试有关,但不一样。模糊测试似乎侧重于单个实体的随机输入,希望触发不良行为,通常使用基于动态覆盖观察的自适应输入模型。这涵盖了上面的很多内容,但没有涵盖,比较A类和B类测试时可比较的实现,或不变检查。无论如何,我也对Java的体面模糊测试库感兴趣。
答案 0 :(得分:2)
我认为您尝试查找的是Java中基于属性的测试的库(请参阅types of randomized testing)。简而言之:不是测试结果的值,而是测试它的属性。例如。而不是检查2 + 2是否为4,您需要检查以下属性:
random1 + 0 = random1
random1 + random2 >= random1
详细了解解释基于属性的测试的this article。
你提到的另一个选择是检查你的测试Oracle - 知道真正答案的东西(例如旧的防弹算法)。因此,您将随机变量传递给旧算法和新算法,并检查结果是否相等。
一些 Java库: