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