httprunner进行接口测试时,从上一个接口提取参数传递给下游接口,如何获取数据里最后一个值?
突然被学员问道一个httprunner的问题,惭愧的是大猫之前没有是通过httprunner,又不好意思说不会,只能硬着头皮去看源码了。

问题其实很简单,怎么处理我不管,反正你得给答案。看一眼同学反馈的截图,确实不难,问题很简单。请求某一个接口,接口返回的content里包含多个字段,需要获取到最后一个字典里的数据。是不是觉得很简单?

对于这么具体的问题,大猫当然是第一反应去百度啦!当然,如果能简单百度到答案,学员也不会来问我,因此,结果可想而知,百度没有标准答案!

不过百度一点用处也没有么,也不尽然,至少对于一只从来没有使用过httprunner的大猫来说,知道从响应提取数据使用extract关键字。
既然百度没有标准答案,我们就代码里找,大猫最不怕的就是看代码,大江大浪都走过来了,还能这几千行代码里翻船?
看代码先要去github把代码拉取到本地(这里就不写怎么做了),用pycharm打开,然后使用pycharm的“find in path...”进行全局查找,像这样:


我们点击去看下代码的实现细节,没准可以发现蛛丝马迹。
if not extractors:return {}logger.log_debug("start to extract from response object.")extracted_variables_mapping = OrderedDict()extract_binds_order_dict = utils.ensure_mapping_format(extractors)for key, field in extract_binds_order_dict.items(): extracted_variables_mapping[key] = self.extract_field(field)return extracted_variables_mapping代码实现相当简洁,实例化一个OrderedDict用于存储提取后的数据,采用extract_field函数来执行具体的提取数据操作。我们接着看extract_field函数。
text_extractor_regexp_compile = re.compile(r".*(.*).*")if text_extractor_regexp_compile.match(field): value = self._extract_field_with_regex(field)else: value = self._extract_field_with_delimiter(field)extract_field的核心逻辑也非常简洁,采用re.compile判断表达式是否为正则,是的话执行正则表达式提取_extract_field_with_regex,如果不是正则采用分隔符提取方式,_extract_field_with_delimiter,我们需要的是分隔符方式提取,因此看_extract_field_with_delimiter函数的实现。
_extract_field_with_delimiter函数实现略微复杂,函数里对查询字符串进行了分级处理,content.person.name.first_name被分成top_query:content和sub_query:[person, name, first_name]。
同时不同的top_query有不同的处理方法,例如top_query若是status_code,encoding,ok,reason,url等则不能有sub_query,否则会抛出异常(这里和响应对象结构有关系);
if top_query in ["status_code
学员询问httprunner进行接口测试时,如何获取数据里最后一个值。博主先尝试百度未得标准答案,后从代码里找答案。通过拉取代码、用pycharm全局查找,分析代码实现,涉及extract关键字、extract_field函数等,还介绍了分隔符提取方式的处理逻辑。

被折叠的 条评论
为什么被折叠?



