使用Randoop生成测试用例(基于前置条件和Post-条件)

Using Randoop To Generate Test Cases (Based on Pre- and Post- Conditions)

我正在尝试使用 Randoop(通过遵循 Randoop Manual)根据存储在 JSON 文件中的预条件和 post- 条件规范生成测试用例。

目标程序是以下(错误)Java 方法。

package com.example.math;

public class Math {
    /*Expected Behavior:
          Given upperBound >= 0, the method returns
               1 + 2 + ... + upperBound                 
      But This method is buggy and works only on
      inputs with odd value, e.g. for upperBound == 4,
      the method returns 1 + 2 + 3 + 4 + 1 instead of
      1 + 2 + 3 + 4                                   */
    public static int sum(int upperBound) {
        int s = 0;
        for (int i = 0; i <= upperBound; i++) {
            s += i;
        }
        if (upperBound % 2 == 0) {// <--------- BUG!
            s++;                  // <--------- BUG!
        }                         // <--------- BUG!
        return s;
    }
}

并且我使用以下 JSON 文件来指定方法的所需行为:

[
  {
    "operation": {
      "classname": "com.example.math.Math",
      "name": "sum",
      "parameterTypes": [ "int" ]
    },
    "identifiers": {
      "parameters": [ "upperBound" ],
      "returnName": "res"
    },
    "post": [
      {
        "property": {
          "condition": "res == upperBound * (upperBound + 1) / 2",
          "description": ""
        },
        "description": "",
        "guard": {
          "condition": "true",
          "description": ""
        }
      }
    ],
    "pre": [
      {
        "description": "upperBound must be non-negative",
        "guard": {
          "condition": "upperBound >= 0",
          "description": "upperBound must be non-negative"
        }
      }
    ]
  }
]

我编译了程序,运行下面的命令应用Randoop来生成基于正确性规范的测试用例:

java -cp my-classpath:$RANDOOP_JAR randoop.main.Main gentests --testclass=com.example.math.Math --output-limit=200 --specifications=spec.json

其中 spec.json 是包含上述方法契约规范的 JSON 文件。我有两个问题:

  1. 为什么不改变 --output-limit 改变生成的测试用例的数量?对于足够大的数字,似乎我总是只得到 8 个回归测试用例,其中两个检查方法 getClass 不 return null 值(即使这不是我的规范的一部分).请让我知道如何生成更多回归测试用例。我是否缺少命令行选项?
  2. 当 Randoop 尝试生成 error-revealing 测试用例时,它似乎没有参考 spec.json 中的规范。我们能否让 Randoop 在每个违反提供的 post 条件的输入上生成错误显示测试用例?

谢谢。

  1. Why does not changing --output-limit change the number of generated test cases?

Randoop 生成测试,然后输出其中的一个子集。例如,Randoop 不输出包含的测试,它显示为一些较长测试的子序列。

这在 documentation for --output-limit.

中被间接提及

two of which checking the method getClass does not return null value (even though that is not part of my specification)

getClass()Math中的一个方法(测试中的class),所以Randoop调用了getClass()。在测试生成时,return 值不为空,因此 Randoop 对此做出了断言。

getClass()没什么特别的; Randoop 将为其他方法创建类似的回归测试。

  1. It seems that Randoop does not consult the specification inside spec.json

Randoop 在处理静态方法的后置条件规范时存在错误。该错误已 fixed.

要报告错误,最好使用 Randoop's issue tracker, as noted in the Randoop manual. The options for getting help 也包括邮件列表。与 Stack Overflow 不同,问题跟踪器和邮件列表允许讨论和跟踪当前状态。谢谢!