Spec Explorer: ложные тесты
В данный момент я оцениваю Spec Explorer 2010 от Microsoft Research. Мне немного интересно, как генерируются тестовые случаи.
Я играю с моделью тестового образца (Accumulator), созданной SE. Есть метод Accumulator.Add, который добавляет натуральное число> 0 к переменной-члену.
Модель определяет:
[Rule(Action = "Add(x)")]
static void AddRule(int x)
{
Condition.IsTrue(x > 0);
accumulator += x;
}
Как видите, указанное выше условие (x > 0) указано в коде модели. Кроме того, я указал возможные входные данные для Accumulator.Add в файле CORD:
config ParameterCombination: Main
{
action abstract static void Accumulator.Add(int x)
where x in {-3..3};
}
Но оператор Condition.IsTrue(x > 0) заставляет SpecExplorer генерировать только тесты со значениями> 0. Это не то, что я ожидал: тип входного параметра - int, поэтому в метод можно передать неположительное число. По спецификации метод не должен разрешать такие числа. С моей точки зрения, SE должен генерировать тесты, используя неположительные входные данные, чтобы убедиться, что алгоритм их не принимает.
Можно ли как-то моделировать это поведение? Пожалуйста, не указывайте мне на такие решения, как PEX, так как PEX посвящен тестам белого ящика. SE скорее фокусируется на тестах черного ящика, и из того, что я узнал, тест черного ящика должен работать с использованием классов эквивалентности, основанных на моей спецификации. Это будет:
Equivalence class 1: Positive input
Equivalence class 2: Non-positive input
Но SE никогда не генерирует тестовые случаи для последнего случая.
Какие-либо предложения? Заранее спасибо.
1 ответ
Afaik Spec Explorer будет генерировать тесты на основе исследования, проведенного на модели. Поэтому, если правило не срабатывает из-за невыполнения (предварительного) условия, Spec Explorer не будет создавать тесты.
Мое предложение смоделировать это - создать классы эквивалентности вручную, т.е. создать другое правило для отрицательных значений, но для того же действия:
[Rule(Action="Add(x)")]
static void AddRule2(int x)
{
Condition.IsTrue(x <= 0);
}
Файл конфигурации и реализация могут остаться прежними, и набор тестов сообщит об ошибке, если будет добавлено отрицательное значение (я только что попробовал это).
Вам также нужно будет создать второе правило для отрицательных значений или удалить условие в начале.