Использование Randoop для генерации тестовых случаев (на основе предварительных и последующих условий)

Я пытаюсь использовать Randoop (следуя руководству Randoop) для генерации тестовых случаев на основе спецификации до и после условия, хранящейся в файле JSON.

Целевой программой является следующий (глючный) метод 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 не возвращается null значение (хотя это не является частью моей спецификации). Пожалуйста, дайте мне знать, как я могу создать больше регрессионных тестов. Я пропускаю опцию командной строки?
  2. Кажется, что Randoop не консультируется со спецификацией внутри spec.json когда он пытается сгенерировать обнаруживающие ошибки тестовые случаи. Можем ли мы заставить Randoop генерировать тестовые примеры, выявляющие ошибки, на каждом входе, который нарушает предоставленное постусловие?

Спасибо.

1 ответ

Решение
  1. Почему не меняется --output-limit изменить количество сгенерированных тестовых случаев?

Randoop генерирует тесты, а затем выводит их подмножество. Например, Randoop не выводит вложенные тесты, которые отображаются как последовательность более длинных тестов.

Это косвенно упоминается в документации для --output-limit,

два из которых проверяют метод getClass не возвращает нулевое значение (хотя это не является частью моей спецификации)

getClass() это метод в Math (тестируемый класс), поэтому Randoop вызывает getClass(), Во время генерации теста возвращаемое значение не было нулевым, поэтому Randoop подтвердил это.

В этом нет ничего особенного getClass(); Randoop создаст аналогичные регрессионные тесты для других методов.

  1. Кажется, что Randoop не консультируется со спецификацией внутри spec.json

Была ошибка в обработке Randoop спецификаций постусловий для статических методов. Ошибка была исправлена.

Чтобы сообщить об ошибке, лучше использовать средство отслеживания проблем Randoop, как указано в руководстве к Randoop. Варианты получения справки также включают списки рассылки. В отличие от переполнения стека, система отслеживания проблем и список рассылки позволяют обсуждать и отслеживать текущее состояние. Спасибо!

Другие вопросы по тегам