Использование 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 генерировать тестовые примеры для выявления ошибок при каждом входе, нарушающем заданное постусловие?

Спасибо.


person RealNamesOrHandles    schedule 10.02.2019    source источник


Ответы (1)


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

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

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

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

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

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

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

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

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

person mernst    schedule 12.02.2019