19.知识包测试
19.知识包测试
简介
我们知道,在URule Pro当中定义好各种类型的规则文件后,需要将要调用的规则文件通过规则项目的“知识包”节点将文件打包后才可以被业务系统调用。规则包在调用前需要对定义好的知识包进行各种测试,在URule Pro中就提供了两种不同类型的针对知识包的测试方法,分别是“快速测试”和“仿真测试”,如下图所示:
快速测试
所谓的快速测试,可以在弹出的窗口中输入相关业务数据后提交到后台即可对当前知识包进行的测试,选中一个知识包,点击工具栏上的“快速测试”按钮,即可弹出快速测试窗口进行测试。
在2.2.2以前的版本中快速测试较为简单,打开后的窗口是下面的样子。
在这个快速测试的窗口分左右两个部分,左边部分是当前知识包中用到的所有的变量及参数信息,点击具体的变量及参数名后就会在窗口右边显示具体的变量值及参数值。
我们可以在这里把规则需要的相关输入数据(变量或参数)填入右边窗口中,然后点击工具栏上的“测试决策包”或“测试决策流”按钮即可对当前知识包进行快速测试。知识包运行结果里有对当前变量或参数进行赋值的话,那么就可以在测试后通过个这窗口看到值回写后的效果。
在进行快速测试时,如果当前知识包中没有规则流,那么就可以点击工具栏上的“测试决策包”按钮来对当前知识包进行测试;如果当前知识包里有规则流,那么则需要点击工具栏上的“测试决策流”按钮,在弹出的窗口里选择要测试的规则流即可。
可以看到,这种在2.2.2以前版本中的快速测试非常的简单,我们之前章节内容中做的例子都是基于这种快速测试页面完成。
在2.2.2及以后的版本中,我们对快速测试功能进行了升级,打开后的快速测试窗口如下图所示:
在这个新的快速测试窗口当中,工具栏上只有两个按钮,第一个就是在定义好输入、输出数据后需要点击触发规则的按钮,另一个就是用于查看当前知识包编译后对应的规则树(如果当前知识包里只有一个规则流文件或规则中采用“顺序模式”执行,则不会显示树信息), 接下来我们需要添加“输入”对象,然后添加对象的具体字段并为字段填充合适的值(同种类型的输入对象可以添加多个,引擎会全部提交并触发执行);再往下是选择我们在执行规则后期望看到的输出信息,添加输出的方法也是先添加对象,再选择对象的字段即可; 如果不添加输出,那么执行规则后则看不到任何信息。
在添加输入字段时,如果字段类型是List或Object类型,那么输入框将是一个文本域,提示我们要输入一段集合类型的JSON或对象类型的JSON,当然我们也可以根据字段名旁边的按钮来快速添加一个对象的集合类型或一个对象的JSON格式,然后只需要修改JSON值即可。 关于JSON格式的详细要求,可以参照下面要介绍的“仿真测试”中针对复杂对象JSON格式的定义介绍,这里不再赘述。
一个定义好的输入、输出信息并执行完规则后的效果如下图所示:
一旦我们点击了工具栏上的“开始测试”按钮,引擎在提交数据进行规则测试的同时还会把当前定义的输入、输出信息保存起来,这样下次再打开这个知识包的快速测试窗口就可以看到上一次测试的输入、输出信息。
新版的快速测试窗口中,我们把老版中的测试规则与规则流合二为一,引擎在执行时会判断当前知识包中有没有规则流,如果有就执行这个规则流,如果没有就执行规则,这样对于我们使用来说要简单很多。
可以看到,2.2.2及以后版本中的快速测试功能要比老版中的清晰、直观很多。如果我们需要批量测试功能,那么可以采用仿真测试实现。 在本小节当中将重点介绍对知识包的仿真测试功能,仿真测试是一个基于方案的、复杂的、可生成测试报告的、批量测试功能。
仿真测试
选中一个知识包,点击工具栏上的“仿真测试”按钮,就可以进入针对当前知识包的仿真测试页面,如下图所示:
在这个页面中,可以通过工具栏上的“添加新的测试方案”按钮为当前知识包添加若干个仿真测试方案,点击该按钮后效果如下图所示:
对于一个仿真测试方案,需要有一个名称及描述信息,接下来可以点击“Excel模版配置与下载”按钮,对当前知识包的输入与输出数据进行配置,如下图所示:
如上图所示,在这个窗口中,有两大块内容,分别是输入数据定义和输出数据定义,这两块内容都把当前知识包中采用的变量及参数罗列出来,对于我们来说只需要选择相关的参数及变量即可。
在输出数据定义里,可以看到每一项后面都有一个比较操作符选择列表,它的作用是用来将Excel里输入的预期结果与知识包里运行结果进行比较的,从而判断我们在Excel里的定义预期结果是否正确,从而达到仿真测试目的。
勾选好输入和输入字段后就可以点击窗口下面的“下载Excel模版”按钮,下载后的Excel有两个Sheet页,分别显示输入和输出数据,我们需要做的就是填写对应的数据就好,下图向我们展示了下载后的Excel模版的输入数据页与输出数据页。
从截图上可以看出,生成的Excel严格按照我们配置的字段生成。
在“场景”这个sheet页中,定义了所有的输入数据信息,对每条输入数据都需要定义一个“方案标识”与“描述”信息。一般来说“方案标识”我们直接采用数字标识即可,要保证每条“方案标识”的唯一性;而“描述”则是一段文字 描述,可以根据这条数据定义情况加以描述;这两个字段后面就是我们定义的输入数据。
在“预期结果”sheet页中,定义了知识包计算完成后某些字段的预期结果。可以看到每条预期结果也有一个“方案标识”字段,这个“方案标识”字段与“场景”这个sheet页 中“方案标识”字段一一对应,也就是说只有“场景”sheet页里定义好的“方案标识”这里才可以使用,不能随意定义。下图中是个定义了三条场景数据的Excel模版:
在上图中,要特别注意红框标记的部分,在这里“客户”对象“拥有的卡”属性实际上是一个List集合,所有这里在Excel中对于这种类型的数据定义采用的是JSON的格式,对于URule Pro来说,复杂对象的输入可以采用标准的JSON格式,URule Pro会自动进行解析并填充。上图中List 类型的JSON内容如下所示:
[
{
"name": "卡",
"fields": [
{
"name": "no",
"value": "21412234"
},
{
"name": "name",
"value": "卡名称"
},
{
"name": "limit",
"value": 20000
}
]
}
]
在这段List类型的JSON表达式中,因为要表达的是一个List集合类型的数据,所以需要用[]将内容包裹,然后里面的每个对象都必须要有一个名为“name”的属性,比如这里的name属性值为“卡”,需要注意的是“卡”这个对象必须要在当前知识包引用的变量库里已定义好,否则会产生错误;然后对于“卡”对象的属性要通过名为“fields”的 属性名指定;每个属性名必须要有"name"和"value"两个属性,分别用于标识属性名和该属性的值。
JSON的每个属性名都需要有双引号包裹,这是JSON格式规范,这点很关键,否则系统将无法解析。
从2.1.7版本开始,对上述的JSON格式做了改进,改进后的JSON格式更为简洁,如下所示:
[
{
"name": "卡",
"fields":{
"no": "21412234",
"name": "卡名称",
"limit": 2000
}
}
]
可以看到相比改进之后,改进后的JSON更为简洁明了,无论采用哪种JSON格式,URule Pro皆支持。
我们知道了List类型值通过JSON填充的方式,那如果对应属性是单个对象又该如何处理呢?其实看看List类型的JSON我们就应该明白了,把List类型JSON外面[]去掉,里面就是一个个的对象, 拿出其中一个对象,就是我们需要的单个对象的JSON格式,比如上面的“卡”对象:
{
"name": "卡",
"fields": [
{
"name": "no",
"value": "21412234"
},
{
"name": "name",
"value": "卡名称"
},
{
"name": "limit",
"value": 20000
}
]
}
如果某属性对应的是一个普通的对象类型,不是一个List类型,那么就可以采用上面“卡”对象JSON格式来定义数据就好。实际使用中,可能我们的数据格式比较复杂,存在较多层的对象嵌套,对于多重对象嵌套,这里同样也是支持的,我们唯一需要做的就是按照格式要求定义好JSON数据就好,如下面的JSON数据所示:
[
{
"name": "卡",
"fields": [
{
"name": "no",
"value": "21412234"
},
{
"name": "name",
"value": "卡名称"
},
{
"name": "limit",
"value": 20000
},
{
"name": "cardDetails",
"value": [
{
"name": "卡明细",
"fields": [
{
"name": "id",
"value": "101"
},
{
"name": "time",
"value": "2019"
}
]
}
]
}
]
}
]
在上面这段JSON当中,它定义了一个List类型的集合对象,里面的元素是一个“卡”对象,其中“卡”对象的“cardDetails”属性也是一个List集合类型的对象,里面是若干个“卡明细”对象。在实际使用过程中,这种定义方式可以最大化实现规则运行时对输入数据的要求。
上述的JSON内容在2.1.7及以上版本中则可以写成下面的样子:
[
{
"name": "卡",
"fields": {
"no": "21412234",
"name": "卡名称",
"limit": 2000,
"cardDetails": [
{
"name": "卡明细",
"fields": {
"id": "101",
"time": "2019"
}
}
]
}
}
]
可以看到仿真测试中,复杂数据的JSON格式与我们通常看到的描述对象的格式不太一样,每个对象都需要一个name属性用于标识该对象对应的变量库里的对象分类名,同时,对象的属性名与属性值分别用name和value两个属性来标明,之所以这样做,是因为JSON的数据格式是一种弱类型的数据格式,而规则引擎里需要的数据 是一种需要指定对象类型及数据类型的强类型格式,所以才要求我们提供上述格式的JSON数据。 在实际使用过程中,如果我们已经有了一种普通的JSON对象数据,需要将其转换成仿真测试所需要的JSON格式,还是有一些麻烦的,为此,从2.1.5版本开始,URule Pro内置了一个用于转换普通JSON为仿真测试所需要的JSON的工具,其URL为:http://[ip]:[port]/[contextpath]/urule/json,打开后的效果如 下图所示:
输入一段普通的JSON对象数据,点击工具栏上的转换按钮,就可以将输入的普通JSON对象转换为URule Pro仿真测试时所需要的JSON格式,如下图所示:
转换完成后,余下的工作就是把转换好的JSON中的“待填写的变量分类名”换成当前待测试的知识包中引用的变量库里的具体的变量分类名称即可。
“场景”这个sheet页定义完后,就可以来看看“预期结果”sheet页定义情况,如下图:
可以看到,预期结果的数据定义中,“方案标识”字段完全与“场景”数据定义的一致,同时第2个方案“贷款信息”对象的两个字段都没有定义值,那么就表示规则运行完成后对这两个字段的预期结果为null。
Excel模版定义完成后,就可以在“测试方案配置”窗口中将其上传并保存,如下图:
配置好测试方案后,就可以点击方案记录上的测试按钮,对当前方案进行测试,如下图:
在弹出的窗口中点击“运行”按钮,运行完成后即可查看测试报告,如下图所示:
点击每条报告的“明细”链接,可查看测试结果的详情,如下图:
从测试报告中可以看到每条场景的用时、与预期结果的匹配情况以及其它明细信息,如果需要我们可以将这个报告的HTML直接保存到本地随时查看。
更多建议: