如何用JUnit测试Drools规则的最佳实践?
目前为止,我们使用dbunit和junit来测试规则。我们有一些样例数据被放入hsqldb中。在项目结尾时,很难创建一个好的测试数据输入,以测试特定的规则而不触发其他规则。
准确的问题是如何在JUnit中限制测试范围,只测试一个或多个特定的规则?
如何用JUnit测试Drools规则的最佳实践?
目前为止,我们使用dbunit和junit来测试规则。我们有一些样例数据被放入hsqldb中。在项目结尾时,很难创建一个好的测试数据输入,以测试特定的规则而不触发其他规则。
准确的问题是如何在JUnit中限制测试范围,只测试一个或多个特定的规则?
个人而言,我使用单元测试来测试隔离的规则。我认为这并没有什么太大的问题,只要你不会因为隔离的规则有效就产生虚假的安全感,认为你的知识库能够正常工作。测试整个知识库更加重要。
您可以使用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.
代码来源: http://blog.athico.com/2007/07/my-rules-dont-work-as-expected-what-can.html
这篇文章是关于IT技术的,讲述了一些规则在实际使用中可能会出现的问题,以及如何解决这些问题。作者提供了一些有用的提示和技巧来帮助读者更好地理解和应用这些规则。如果您对IT技术感兴趣,可以点击上面的链接查看完整的文章。我创建了一个简单的库,帮助编写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());
}
}
要了解更多详细信息,请查看博客文章:https://web.archive.org/web/20140612080518/http://maciejwalkowiak.pl/blog/2013/11/24/jboss-drools-unit-testing-with-junit-drools/
单元测试是指对最小的代码片段进行测试,以定义规范并测试所有可能的用例。而集成测试的目标不是所有可能的用例,而是多个一起工作的单元的集成。同样的方法也适用于规则。按业务含义和目的将规则分离。最简单的“测试单元”可以是具有单个或高内聚性规则集合的文件,以及其所需的内容(如果有),例如常见的DSL定义文件和决策表。对于集成测试,您可以选择系统中有意义的子集或所有规则。
采用这种方法,您将拥有许多隔离的单元测试和少量集成测试,其中包含有限数量的公共输入数据,以重现和测试常见情况。添加新规则不会影响大多数单元测试,但会影响少数集成测试,并反映新规则如何影响公共数据流。
考虑使用适合此方法的JUnit测试库testing library。