1. 预告
到了本节,已经完成了基本的大用例执行框架的一部分。已经在那个demo函数中 获取到了步骤step的一切数据。
剩下的代码大概有几部分:
-
提取步骤所有请求数据和断言/参数化提取 设置
-
检查请求数据中是否有需要进行承接上一个接口返回值参数化的字段,有则替换,无则过。
-
进行requests请求,拿到返回值
-
对返回值进行参数化提取和断言
其实这里要对所有接口的请求参数中,需要获取到之前接口提取的参数的字段的值,进行标记或者说占位准备替换,就好比html中,用 {{ apis }} 来表示这里是接口一样。
但是{{ }} 在html中有着标准的规范,规则。而在请求数据中,用此占位则很危险,请求数据中可能会出现各种各样的字符串,很容易被程序识别成占位符。所以要用一套新的 不经常出现的/而且易于输入的 符号表示。这里用的: ##参数名## 来代替。当然要是有其他的也可以。
2. 要提取出来所有的数据
def demo(self, step):
time.sleep(3)
print(step.api_url)
# 提取所有请求数据
api_method = step.api_method
api_url = step.api_url
api_host = step.api_host
api_header = step.api_header
api_body_method = step.api_body_method
api_body = step.api_body
get_path = step.get_path
get_zz = step.get_zz,
assert_zz = step.assert_zz
assert_qz = step.assert_qz
assert_path = step.assert_path
接下来就是检查是否需要替换那些##参数名##了:
3. 找出所有符合的替换参数
用正则再好不过了,在开头引入re:
要替换的请求数据中的位置基本只有三处:header,body,ulr:
# 检查是否需要进行替换占位符的
rlist_url = re.findall(r"##(.+?)##", api_url)
rlist_header = re.findall(r"##(.+?)##", api_header)
rlist_body = re.findall(r"##(.+?)##", api_body)
4. 替换
整理出来这三个列表,rlist_url/header/body。依次进行替换:
# 检查是否需要进行替换占位符的
rlist_url = re.findall(r"##(.+?)##", api_url)
for i in rlist_url:
api_url = api_url.replace("##" + i + "##", eval(i))
rlist_header = re.findall(r"##(.+?)##", api_header)
for i in rlist_header:
api_header = api_header.replace("##" + i + "##", eval(i))
rlist_body = re.findall(r"##(.+?)##", api_body)
for i in rlist_body:
api_body = api_body.replace("##" + i + "##", eval(i))
全部忠实替换好,其中的eval就很显然的是 去获取那些变量了。不过目前这里的代码并不是最终版,等我们全写完是要改一点的。
5. 发送请求
继续去写调用requests发送请求:先在顶部引入json和requests
6. 对返回值进行参数化提取和断言
此时已经拿到了 提取/断言设置,然后进行公式带入,就可以完成了,但是现在还没有对提取 / 断言 的几种方式 制定规则。
所以回到P_cases.html中,好好想想规则。这里就直接套用之前设计过的规则了,也欢迎大家集思广益,想出更合理的规则:
首先来设计提取返回值路径法:
由用户 按规则 写入 即将被作为参数名的字符串=路径 这种方式提取,多个用换行分隔
例子如:
name=/data/[3]/username
id=/data/[2]/userid
用户如何使用呢?在后续接口的请求url/body/header中,用##name## 和 ##id## 来占位。
比如 url 写:/aaa/bb?index=zsd&uname=##name##&uid=##id##
然后经过第一个接口请求后,提取真实结果,并替换就变成来:
/aaa/bb?index=zsd&uname=wangzijia&uid=00100
所以先把这个规则,放在多行文本框的中的默认文案里:
<!-- 断言和提取返回值 -->
<br>
<textarea id="get_path" rows="3" style="width: 90%;background-color: rgba(245,236,222,0.29)" placeholder="提取返回值-路径法:
参数名的字符串=路径 这种方式提取,多个用换行分隔。例子如:
name=/data/[3]/username
id=/data/[2]/userid"></textarea>
后续4个多行文本框均用此方式即可。
继续另一个提取正则法的规则设置:
<textarea id="get_zz" rows="3" style="width: 90%;background-color: rgba(245,236,222,0.29)" placeholder="提取返回值-正则法:
参数名的字符串=左边界字符串(.*?)有边界,多个用换行分隔,例子如
name=username':(.*?),
id=d'(.*?),"></textarea>
如上图,等号右侧采用 左边界(.*?)右边界的方式存储。这样代码中实际提取的时候 也方便了很多。