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