Вопрос

Какова лучшая практика для тестирования правил слюни с Junit?

До сих пор мы использовали JUNIT с DBUNIT для тестирования правил. У нас были примерные данные, которые были помещены в HSQLDB. У нас была пара пакетов правил, и к концу проекта очень трудно сделать хороший тестовый вход для проверки определенных правил и не огонь других.

Таким образом, точный вопрос в том, то как я могу ограничить тесты в Junit к одному или нескольким определенным правилам для тестирования?

Это было полезно?

Решение

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

Вы можете написать изолирующие тесты с Agendafilter. и царствование

StatelessSession session = ruleBase.newStatelessSesssion();

session.setAgendaFilter( new RuleNameMatches("<regexp to your rule name here>") );

List data = new ArrayList();
... // create your test data here (probably built from some external file)

StatelessSessionResult result == session.executeWithResults( data );

// check your results here.

Источник кода: http://blog.cathico.com/2007/07/my-rules-dont-work-as-expected-what-can.html.

Другие советы

Я создал простую библиотеку, которая помогает писать модульные тесты для слюни. Одной из функций является именно то, что вам нужно: объявить конкретные файлы DRL, которые вы хотите использовать для теста устройства:

@RunWith(DroolsJUnitRunner.class)
@DroolsFiles(value = "helloworld.drl", location = "/drl/")
public class AppTest {

    @DroolsSession
    StatefulSession session;

    @Test
    public void should_set_discount() {
        Purchase purchase = new Purchase(new Customer(17));

        session.insert(purchase);
        session.fireAllRules();

        assertTrue(purchase.getTicket().hasDiscount());
    }
}

Для получения более подробной информации о посте в блоге: http://maciejwalkowiak.pl/blog/2013/11/24/jboss-drools-unit-testing-with-junit-drools/

Не пытайтесь ограничить выполнение правила в одно правило для теста. В отличие от классов OO, единые правила не зависят от других правил, поэтому оно не имеет смысла проверять правило в изоляции так же, как вы испытаете один класс, используя единичный тест. Другими словами, чтобы проверить одно правило, проверьте, что он имеет правильный эффект в сочетании с другими правилами.

Вместо этого запустите тесты с небольшим количеством данных по всем вашим правилам, т.е. с минимальным количеством фактов в сеансе правила, и тестируйте результаты и, возможно, что конкретное правило было уволено. Результатом на самом деле не так сильно отличается от того, что вы имеете в виду, потому что минимальный набор данных теста может активировать только один или два правила.

Что касается пример данных, я предпочитаю использовать статические данные и определить минимальные данные теста для каждого теста. Существуют различные способы этого, но программно создание объектов фактов в Java может быть достаточно хорошим.

Агрегат с DBUNIT на самом деле не работает. Тест интеграции с DBUNIT делает. Вот почему: - тест на единицу должно быть быстро. - Восстановление базы данных DBUNIT является медленным. Занимает 30 секунд легко. - Приложение Real-World имеет много ненужных колонн. Таким образом, данные, выделенные для одной функции, все еще легко используют половину таблиц базы данных. - Агрегатный тест должен быть изолирован. - Восстановление базы данных DBUNIT для каждого теста, чтобы держать их изолированными, имеет недостатки: --- Продолжительность всех тестов занимает несколько часов (тем более, что приложение растет), поэтому никто не работает, поэтому они постоянно ломаются, поэтому они отключены, так что там Нет тестирования, поэтому вы приложение полно ошибок. --- Создание половины базы данных для каждого теста на единицу - это много создания работы, множество работ по техническому обслуживанию, может легко стать недействительными (в отношении проверки, в которой схема базы данных не поддерживает, см. Hibernate Validator) и в использовании работа представлять реальность.

Вместо этого пишите интеграционные тесты с DBUNIT: - One Dbunit, то же самое для всех испытаний. Загрузите его только один раз (даже если вы запустите 500 тестов). - Оберните каждый тест в транзакции и отката от базы данных после каждого теста. Большинство методов используют распространение в любом случае. Установите только TEXTDATA TOPTDATE (чтобы сбросить его в следующем тесте, если есть следующий тест), только когда требуется размножение_new. - Заполните эту базу данных с угловыми случаями. Не добавляйте более распространенные случаи, чем строго необходимы для проверки ваших бизнес-правил, поэтому мы только 2 общих случая (чтобы иметь возможность тестировать «один со многими»). - Напишите будущие тесты: - Не проверяйте количество активированных правил или количество вставленных фактов. - вместо этого тестируйте, если в результате присутствует определенный вставленный факт. Фильтровать результат на определенном свойстве, установленном на X (отличается от общего значения этого свойства) и проверьте количество вставленных фактов с помощью этого свойства, установленного на X.

Почему бы не выбрать тот же подход, так как у нас есть для кода Java с модулями и тестами интеграции? Тест подразделения: принять минимальный кусок кода и проверять все возможные упреки, определяющие спецификацию. С помощью интеграционных тестов ваша цель - не все возможные упреки, а интеграция нескольких единиц, которые работают вместе. Сделайте то же самое с правилами. Разделите правила по значению и целям бизнеса. Простейший «блок под тестом» может быть файл с одним или Высокое одноохира Набор правил и то, что требуется для его работы (если есть), как общий файл определения DSL и таблица решений. Для теста интеграции вы можете предпринять значимое подмножество или все правила системы.

С таким подходом у вас будет много изолированных модульных тестов, которые не будут затронуты и не потребуют поддержки, когда вы добавляете новые правила, поскольку у вас будет изолированный набор бизнес-правил с подмножеством входных данных для проверки соответствующих бизнес-сценариев. И у вас будет мало интеграционных тестов с ограниченным количеством общих входных данных для воспроизведения и тестирования «общих сценариев». Добавление новых правил к тесту в интеграции потребуется для обновления вывода теста и будет отражать, как новые правила воздействуют общих данных.

Рассмотреть возможность Правило теста Junit Это дает вам возможность загружать ресурсы в декларативном порядке, и утверждают, что правила утверждают, что правила. Он сохранит сбои внутренних утверждений и сообщают о любых правилах, вызывающих несоответствие, которое намекает вас о том, что пошло не так с первого взгляда. Регистрация навеса света на причинно-следственные отношения между событиями. Работает с SpringRunner.class для весенних интеграционных испытаний.

Пример:

@DroolsSession(resources = {
        "classpath*:/org/droolsassert/rules.drl",
        "classpath*:/com/company/project/*/{regex:.*.(drl|dsl|xlsx|gdst)}",
        "classpath*:/com/company/project/*/ruleUnderTest.rdslr" },
        ignoreRules = { "before", "after" })
public class DroolsAssertTest {

    @Rule
    public DroolsAssert drools = new DroolsAssert();

    @Test
    @AssertRules("atomic int rule")
    public void testInt() {
        drools.insertAndFire(new AtomicInteger());
        assertEquals(1, drools.getObject(AtomicInteger.class).get());
    }
}

Видеть правила
Более: https://github.com/drooolsassert/droolsassert.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top