Здравствуйте!
Есть цель — протестировать некую сложную систему, поведение которой определяется правилами. Сейчас правила записаны в полу-формальной форме (текст плюс псевдокод).
Надо сделать тесты, которые покрывают максимально возможное количество состояний системы.
Я хочу ускорить этот процесс следующим образом:
1) Формализовать правила, например, на
Drools
2) Автоматически сгенерировать перечень всех возможных ситуаций
Пример. Есть некий пакет с 2 правилами:
global List outErrorCodes;
global Boolean condition1;
global Boolean condition2;
global Boolean condition3;
rule "01"
when
eval( condition3 == false);
then
outErrorCodes.add("ERROR_CODE1");
end
rule "02"
when
eval((condition1 == true) && (condition2 == true));
then
outErrorCodes.add("ERROR_CODE2");
end
condition1, condition2 и condition3 описывают некую ситуацию, в которой находится система. outErrorCodes описывает ожидаемое поведение системы в данной ситуации.
Мне нужен механизм, который на основе этих правил автоматически сгенерирует перечень всех возможных пар (Ситуация; Ожидаемое поведение).
Примеры пар:
1)
Ситуация: condition1==false, condition2==false, condition3==false
Ожидаемое поведение: outErrorCodes ["ERROR_CODE1"]
2)
Ситуация: condition1==false, condition2==false, condition3==true
Ожидаемое поведение: outErrorCodes []
Я предполагаю, что я не первый представитель человечества, который сталкивается с этой задачей.
Вопрос: Как её можно решить?
Меня интересуют как готовые софтовые решения, так и матчасть (на какие алгоритмы стоит посмотреть).
Заранее благодарен
Дмитрий
Здравствуйте!
Если кому интересно, вот моё решение проблемы: Эту задачу можно разделить на 2 части:
1) Составление перечня всех возможных ситуаций в виде
таблицы истинности.
2) Определение ожидаемого поведения для каждой ситуации (строки таблицы истинности из пункта 1).
Первый пункт реализуется относительно просто, при условии, что описание ситуации можно свести к набору булевых переменных. Небулевые переменные мне пока были не нужны.
Таблица истинности для булевых переменных состоит из 2^N строк (комбинаций), где N — количество переменных (2 для одной, 4 для двух, 8 для трёх и т. д.).
Второй пункт можно реализовать следующим образом:
Сначала надо формализовать описание ожидаемого поведения системы при помощи Drools. Например вот так:
import java.util.List;
import api.Situation;
global List outErrorCodes;
rule "01"
when
Situation( condition3 == false);
then
outErrorCodes.add("ERROR_CODE1");
end
rule "02"
when
Situation(condition1 == true, condition2 == true);
then
outErrorCodes.add("ERROR_CODE2");
end
Здесь у нас
а) 3 переменные, описывающие ситуацию (condition1, condition2 и condition3) и
б) одна переменная, описывающая ожидаемое поведение системы (outErrorCodes).
При условии, что значения переменных, описывающих ситуацию не зависят друг от друга, достаточно 8 раз подставить нужные значения в указанный файл, запустить правила, а потом вычитать ожидаемое значение из переменной outErrorCodes.
Это всё довольно тривиальные вещи, которые можно реализовать при помощи стандартных инструментов Drools.
Всего доброго
Дмитрий