java中的随机测试 - 它是什么以及如何实现它?

时间:2017-07-21 05:03:09

标签: java unit-testing random junit

我对随机测试感到困惑。 它引用了proj1b规范:

  

“自动编程项目1A很大程度上依赖于随机测试。 For   例如,我们对gradecope的JUnit测试只需调用随机方法   您的LinkedListDeque类和我们正确的实现   LinkedListDequeSolution,一旦我们看到任何意见分歧,   测试失败并打印出一系列导致该操作的操作   失败。 “

http://datastructur.es/sp17/materials/proj/proj1b/proj1b.html

我不明白这是什么意思:

  

“调用测试类的随机方法和正确的类”

我需要写一些与自动编程器非常相似的东西。但是我不知道是否需要通过使用循环随机选择一些来测试来为不同的方法编写测试?

如果是这样,我们可以使用JUnit测试所有方法,为什么我们需要随机化测试?

另外,如果我将所有测试组合在一起,为什么我称之为JUnit?

如果你不介意,一些例子会更容易理解。

2 个答案:

答案 0 :(得分:1)

只是详细说明“随机”测试。

有一个名为QuickCheck的框架,最初是为Haskell编程语言编写的。但它已被移植到许多其他语言 - 也适用于Java。 junit5有jqwik,或者(可能已过时)jcheck

这个想法是“简单地”:

  • 您描述了方法的属性,例如(a(b(x))== b(a(x))
  • 然后框架为方法调用创建随机输入,并尝试查找属性不存在的示例

答案 1 :(得分:0)

我认为他们正在谈论基于模型的测试。为此,您必须创建模型 - 生产行为的简化版本。然后,您可以列出可以调用的可能方法以及这些方法之间的依赖关系。之后,您必须选择一个随机的方法并同时调用模型的方法和应用程序的方法。如果结果相同,那么它可以正常工作。如果结果不同 - 您的模型或应用中存在错误。您可以阅读更多in this article

在Java中,您可以自己编写此逻辑,也可以使用现有框架。我在Java中唯一知道的是GraphWalker。但我还没有使用它,也不知道它有多好。

原始框架(如QuichCheck)也能够"收缩" - 如果需要50次调用随机方法来查找错误,那么他们将尝试找到导致该错误的几个步骤的确切顺序。我不知道Java框架中是否存在这样的可能性,但如果您需要JVM(但不一定是Java解决方案),可能值得研究ScalaCheck