D05_用例中提取数据:delimiter 界定符方式源码解读
在 HttpRunner 中提取数据时,根据界定符的方式进行提取,涉及到的内容包括如下:
- ["status_code", "encoding", "ok", "reason", "url"]
- cookies
- elapsed
- headers
- ["body", "content", "text", "json"]
从源码角度分析 httprunner-2.5.5\httprunner\response.py:
# 以下只提取了原函数中的重要代码
def _extract_field_with_delimiter(self, field):
# 取出以界定符 “.” 为分隔的前后两部分,而且只分割1次
# 如: "content.person.name" 分割处理后变为: ["content", "person.name"]
# 其中:"content"为顶级项,"person.name"为子项
top_query, sub_query = field.split('.', 1)
# 1.------ 如果顶级项,即提取数据的目标区域为列表中内容
if top_query in ["status_code", "encoding", "ok", "reason", "url"]:
return getattr(self, top_query)
# 2.------ 提取数据的目标区域为cookies
elif top_query == "cookies":
cookies = self.cookies
if not sub_query:
# 如果没有子项,返回全部cookies内容(可能有多个cookie)
return cookies
# 如果有子项,返回指定cookie子项值
return cookies[sub_query]
# 3.------ 提取数据的目标为响应时间
elif top_query == "elapsed":
# 支持的时间格式
available_attributes = u"available attributes: days, seconds, microseconds, total_seconds"
if not sub_query:
raise exceptions.ParamsError(err_msg)
# 以 天、秒、微秒为子项
elif sub_query in ["days", "seconds", "microseconds"]:
return getattr(self.elapsed, sub_query)
# 以总秒数为子项
elif sub_query == "total_seconds":
return self.elapsed.total_seconds()
else:
raise exceptions.ParamsError(err_msg)
# 4.------ 提取数据的目标为响应头部区域
elif top_query == "headers":
headers = self.headers
if not sub_query:
# 没有子项,返回整个头域
return headers
# 有子项,返回头域中该子项的值
return headers[sub_query]
# 5.------ 如果顶级项为列表中内容
elif top_query in ["body", "content", "text", "json"]:
try:
# 返回json类型响应实体
body = self.json
except exceptions.JSONDecodeError:
# 如果响应实体不是json类型,则返回text类型
body = self.text
if not sub_query:
# 没有子项,返回整个实体内容
return body
# 如果实体属于 dict 或者 list 类型
if isinstance(body, (dict, list)):
# content = {"xxx": 123}, content.xxx
# 返回子项对应的值
return utils.query_json(body, sub_query)
elif sub_query.isdigit():
# content = "abcdefg", content.3 => d
# 如果子项是数字,返回该数字序号位置的字符
return utils.query_json(body, sub_query)
else:
raise exceptions.ExtractFailure(err_msg)
else:
raise exceptions.ParamsError(err_msg)