首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

HttpRunner 的结果校验器优化

在测试用例中,包含预期结果这么一项,用于辅助测试人员执行测试用例时判断系统的功能是否正常。而在自动化测试中,我们的目标是让测试用例自动执行,因此自动化测试用例中同样需要包含预期结果一项,只不过系统响应结果不再由人工来进行判断,而是交由测试工具或框架来实现。

这部分功能对应的就是测试结果校验器(validator),基本上能称得上自动化测试工具或框架的都包含该功能特性。

设计之初

在设计之初,结果校验器(validator)的实现比较简单。

对于每一个,可以指定0个或多个校验项,放置在中。在自动化测试执行的时候,会在发起HTTP请求、解析结果响应之后,逐个检查各个校验项,若存在任意校验项不通过的情况,则该将终止并被标记为失败。

如上例所示,每一个校验项均为一个结构,里面包含、、三个属性字段。其中,对应着要检查的字段,对应着检查字段预期的值,这两项是必须指定的;字段对应着比较方法,若不指定,则默认采用,即检查字段与预期值相等。

为了实现尽可能强大的检查功能,属性值可通过链式操作精确指定具体的字段,也内置实现了大量的检查功能。

举个例子可能会更清晰些。假如某结构的响应结果如下:

那么假如我们要检查,就可以指定为;假如要检查中的,就可以指定为;假如要检查中的,就可以指定为。可以看出,假如下一层级为字典结构,那么就可以通过运算符指定下一层级的,依次类推。

对于字段内容为列表的情况略有不同,我们需要通过序号来指定具体检查哪一项内容。例如,对应的检查项为,对应的检查项为。

在比较方式()方面,除了,还内置了大量的检查方法。例如,我们可以通过、、、等比较数值大小,通过、、等比较长度是否相等(列表、字典、字符串均适用),通过、来判断包含关系,通过、判断字符串的开头结尾,甚至通过来判断是否满足正则匹配等。详细的比较方式还有许多,需要时可查看comparator表格。

存在的局限性

在大多数情况下,的结果校验器(validator)是够用的。不过问题在于,框架不可能为用户实现所有的检查方法,假如用户需要某些特殊的检查方法时,就没法实现了。

这的确是一个问题,之前提的issue #29中举了一个例子,应该也算是比较有代表性。

发送请求时的数据使用了随机生成,然后需要比较结果中的数据是否是和这个相关(通过某个算法转换)。比如我输入的是321,我的结果是这种转化,目前的comparator是比较难于实现的。

要解决这个问题,最好的方式应该是在中实现自定义结果校验器的机制;用户在有需要的时候,可以自己编写校验函数,然后在中引用校验函数。之前也介绍过的热加载机制,《约定大于配置:ApiTestEngine实现热加载机制》,自定义结果校验器应该也是可以采用这种方式来实现的。

第二个需要优化的点,的结果校验器还不支持变量引用,会造成某些场景下的局限性。例如,曾提过一个issue #52:

接口response内,会返回数据库内的自增ID。ID校验的时候,希望为参数化的值。

另外,在《ApiTestEngine,不再局限于API的测试》一文中有介绍过,结果提取器()新增实现了通过正则表达式对任意文本响应内容的字段提取。考虑到结果校验器()也需要先从结果响应中提取出特定字段才能与预期值进行比较,在具体实现上完全可以复用同一部分代码,因此在的部分也可以进行统一化处理。

经过前面的局限性问题描述,我们的改造目标也明确了,主要有三个方面:

新增支持自定义结果校验器

结果校验器中实现变量引用

结果校验内容新增支持正则表达式提取

改造结果

具体的改造过程就不写了,有兴趣的同学可以直接阅读源码,重点查看中的、和三个函数。

经过优化后,改造目标中的三项功能都实现了。为了更好地展现改造后的结果校验器,此处将结合实例进行演示。

新增支持自定义结果校验器

先来看第一个优化项,新增支持自定义结果校验器。

假设我们需要使用HTTP响应状态码各个数字的和来进行校验,例如,状态码对应的数字和为3,状态码对应的数字和为8。该实例只是为了演示用,实际上并不会用到这样的校验方式。

首先,该种校验方式在中并没有内置,因此需要我们自己来实现。实现方式与热加载机制相同,只需要将自定义的校验函数放置到当前文件同级或者父级目录的中。

对于自定义的校验函数,需要遵循三个规则:

自定义校验函数需放置到中

参数有两个:第一个为原始数据,第二个为原始数据经过运算后得到的预期结果值

在校验函数中通过将实际运算结果与预期结果值进行比较

对于前面提到的演示案例,我们就可以在中编写如下校验函数。

然后,在格式测试用例的中,我们就可以将校验函数名称作为进行使用了。

由此可见,自定义的校验函数与内置的校验方法在使用方式上完全相同,应该没有理解上的难度。

结果校验器中实现变量引用

对于第二个优化项,结果校验器中实现变量引用。在使用方式上我们应该与中的变量引用一致,即通过的方式来引用变量。

通过以上示例可以看出,在结果校验器中,和均可实现实现变量的引用;而引用的变量,可以来自四种类型:

当前中定义的,例如

当前中提取()的结果变量,例如

当前测试用例集中,先前中提取()的结果变量

当前测试用例集中,全局配置中定义的变量

而字段除了可以引用变量,以及保留了之前的链式操作定位字段(例如上例中的)外,还新增了采用正则表达式提取内容的方式,也就是第三个优化项。

结果校验内容新增支持正则表达式提取

假设如下接口的响应结果内容为,那么要提取出部分进行校验,就可以采用如下描述方式。

可见在使用方式上与在结果提取器()中完全相同。

结果校验器的进一步简化

最后,为了进一步简化结果校验的描述,我在中新增实现了一种描述方式。

简化后的描述方式与原始方式对比如下:

同样是前面的例子,采用新的描述方式后会更加简洁。而两种方式表达的含义是完全等价的。

当然,此次优化保证了与历史版本的兼容,之前编写的测试用例脚本的运行是完全不会受到任何影响的。

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20171214G03RXW00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券