Пускает слюни при составлении тестового примера

#drools

#пускает слюни

Вопрос:

Я тестирую довольно сложную систему, которая ведет себя в соответствии с некоторыми бизнес-правилами (написанными в виде полуофициального текста).

Цель состоит в том, чтобы создать тестовые примеры, которые охватывают как можно больше состояний системы. Я хочу автоматизировать эту задачу следующим образом:

1) Формализуйте бизнес-правила в Drools 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) amp;amp; (condition2 == true));
    then
        outErrorCodes.add("ERROR_CODE2");
end
  

условие1, условие2 и условие3 являются входными данными.
outErrorCode — это результат.

То есть условие1, условие2 и условие3 описывают определенную ситуацию, а outErrorCode описывает ожидаемое поведение системы в этой конкретной ситуации.

Я хочу создать механизм, который автоматически создает список всех возможных кортежей (condition1, condition2, condition3, outErrorCodes), основанный на логике в правилах. Каждый кортеж представляет состояние системы.

Затем эти кортежи будут использоваться в качестве основы для создания реальных тестовых примеров.

Возможно ли это с Drools? Если да — то как?

Заранее большое спасибо

Дмитрий

Ответ №1:

Нам удалось взять набор правил, развернуть его как службу с помощью drools-server, а затем написать скрипт для выполнения вызовов веб-службы, использующий каждое возможное значение каждой входной переменной. Примерно за час мы смогли выполнить более 5000 обращений к нашей базе правил и увидеть результаты для каждого случая.

Недостатком (и я не думаю, что вы сможете обойти это каким-либо решением) является то, что вы тестируете бизнес-логику. Когда вы думаете об этом, вы можете сгенерировать все тестовые данные, которые вы хотите, но вы не можете сгенерировать тестовые входные данные и ожидаемый результат без запуска бизнес-логики (которую вы тестируете). Просто говорю, что если вы перейдете к автоматической генерации входных данных для бизнес-логики, вы не сможете на самом деле узнать ожидаемые результаты, не нарушая целостности теста.