使用junit进行Drools测试

Hub*_*ubi 10 junit rule-engine jboss-rules drools drools-flow

使用junit测试drools规则的最佳做法是什么?

到目前为止,我们使用junit和dbunit来测试规则.我们有样本数据放到hsqldb.我们有几个规则包,到项目结束时,很难做出一个好的测试输入来测试某些规则而不是激发其他规则.

所以确切的问题是,如何将junit中的测试限制为一个或多个特定的测试规则?

感谢帮助,

Hubidubi

Ton*_*ola 7

我个人使用单元测试来测试孤立的规则.我不认为它有什么不妥,只要你不会因为孤立的规则正在运作而陷入虚假的安全感,你的知识库就会起作用.测试整个知识库更为重要.

您可以使用AgendaFilter和StatelessSession 编写隔离测试

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.
Run Code Online (Sandbox Code Playgroud)

代码来源:http://blog.athico.com/2007/07/my-rules-dont-work-as-expected-what-c​​an.html


Pet*_*ton 5

不要试图将规则执行限制为测试的单个规则。与 OO 类不同,单个规则不独立于其他规则,因此以与使用单元测试测试单个类相同的方式单独测试规则是没有意义的。换句话说,要测试单个规则,请测试它与其他规则组合是否具有正确的效果。

相反,对所有规则使用少量数据运行测试,即在规则会话中使用最少数量的事实,并测试结果以及可能触发特定规则。结果实际上与您的想法没有太大的不同,因为最少的一组测试数据可能只会激活一两个规则。

至于样本数据,我更喜欢使用静态数据,并为每个测试定义最少的测试数据。有多种方法可以做到这一点,但在 Java 中以编程方式创建事实对象可能就足够了。


Mac*_*iak 5

我创建了一个简单的库,该库有助于编写Drools的单元测试。功能之一正是您所需要的:声明要用于单元测试的特定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());
    }
}
Run Code Online (Sandbox Code Playgroud)

有关更多详细信息,请参见博客文章:http : //maciejwalkowiak.pl/blog/2013/11/24/jboss-drools-unit-testing-with-junit-drools/

  • 链接无效:“找不到服务器” (2认同)