Junit 在Drools单元测试中在何处创建知识库? 简明的

Junit 在Drools单元测试中在何处创建知识库? 简明的,junit,drools,Junit,Drools,我希望在JUnit中编写单元测试来检查各个drools规则。单元测试应该编写简单,运行快速。如果单元测试很慢,那么开发人员将避免运行它们,并且构建将变得非常慢。考虑到这一点,我正试图找出编写这些单元测试的最佳方法(执行最快,编写最容易) 第一次尝试 我尝试的第一个选项是创建KnowledgeBase作为静态类属性,并在一个.drl文件上初始化。然后,每个测试在@Before方法中创建一个新会话。这是基于Drools JBoss规则开发人员指南中的代码示例 通过创建一些注释来抽象初始化代码,这会稍

我希望在JUnit中编写单元测试来检查各个drools规则。单元测试应该编写简单,运行快速。如果单元测试很慢,那么开发人员将避免运行它们,并且构建将变得非常慢。考虑到这一点,我正试图找出编写这些单元测试的最佳方法(执行最快,编写最容易)

第一次尝试 我尝试的第一个选项是创建
KnowledgeBase
作为静态类属性,并在一个.drl文件上初始化。然后,每个测试在
@Before
方法中创建一个新会话。这是基于Drools JBoss规则开发人员指南中的代码示例

通过创建一些注释来抽象初始化代码,这会稍微整理一下,但基本上是相同的方法

我注意到,在一个.drl文件上运行这个基本单元测试需要几秒钟的时间。对于一个单元测试来说,这并不太糟糕,但一旦它被放大,我就会发现这是一个问题。我读了一些书,发现创建
KnowledgeBase
成本很高,而会话成本很低。这就是为什么示例中的
KnowledgeBase
是静态的,因此只创建了一次,但是,对于多个单元测试类,它可能会被创建很多次

可供替代的 我尝试的另一种方法是创建一个singleton
KnowledgeBase
,它将加载所有.drl文件。这将在测试套件中全局执行一次,然后自动连接到每个测试类中。我使用了一个spring
@Configuration
类,并将
KnowledgeBase
定义为一个
@Bean
。现在我发现
KnowledgeBase
需要2秒(但只运行一次),会话创建需要大约0.2秒,测试本身根本不需要时间

似乎spring方法可以更好地扩展,但我不确定在测试单个规则但在所有文件上使用初始化的
KnowledgeBase
时是否会遇到其他问题?我正在使用
AgendaFilter
以我想要测试的特定规则为目标。而且我在网上搜索了很多次,没有发现其他人这样做

总结
编写这些测试的最具伸缩性的方式是什么?谢谢

这是一个非常好的经验集合。让我提出一些想法

如果您有一个场景,其中大量规则对于测试结果至关重要,因为规则彼此竞争,那么您应该创建包含所有规则的KieBase并将其序列化一次。对于单个测试,可以为每个测试从会话派生一个会话,插入事实并触发所有规则,或者,也可以提前派生会话并运行测试,清除会话(!),插入事实并触发所有规则


用于测试单个规则或小规则(谢谢你的回答。我发现我们有一些在规则之间共享的声明类型和函数。它们在一个单独的文件中声明,因此使用spring方法加载所有文件是有意义的。此外,我们有一个初始化工作内存的规则,它可以实例化伪枚举类型设置为更复杂的规则,则需要触发此规则。我现在想知道每次清除的缓存会话与新会话的优缺点。我不相信您可以将会话还原到以前的状态。ad“还原到以前的状态:”这是可能的,但通常只适用于工作内存为空的状态。收回所有内容是一个简单的过程,应该非常快。