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