D05_用例中提取数据:delimiter 界定符方式源码解读

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)

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值