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

Я пытаюсь использовать 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 Ответ

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

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

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

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

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

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

Похоже, что Randoop не обращается к спецификации внутри spec.json

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

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

...