场景:有环境变量需要替换到用例数据中去,
解决的问题:多条接口用例的通用配置和token之类的参数要写在每条测试用例中,替换不方便。
场景一:字符串中只有一个变量需要替换
原始数据:(数据来源:execl中读取,或者数据库中读取出来的,都可以)
params= '{"_ver":"3.18.1","_ct":"101","token":${token}'
在进行接口请求前,需要把数据中的变量${token} ,替换成环境变量,${} 只是一个特殊的标识符,目的的方便使用正则表达式匹配,换成你自己喜欢的都可以
在此处使用python的re模块的re.search和re.sub ,不清楚的可以在菜鸟站上搜到教程
下面是实现的代码
思路:
1、写出正则匹配式
2、取出字符串中匹配成功的变量
3、取出匹配到的值,也就是需要替换掉的变量
4、从环境变量中获取要变量值
5、使用re.sub进行替换。
sub的四个属性代表的意思:正则匹配式,要替换变量的字符串或者函数,要被查找替换的原始字符串,该模式匹配成功后的最大替换次数(默认为替换所有匹配到的)
import re
import Config
# 定义一个字符串,里面有一个变量
params= '{"_ver":"3.18.1","_ct":"101","token":${token},"order_id":${order_id}}'
# 写出正则匹配式
ru = r'\${(.*?)}'
# 进行正则匹配
while re.search(ru,params):
# 取出字符串中匹配成功的变量
res = re.search(ru, params)
# 取出匹配到的值,也就是需要替换掉的变量
key = res.group(1)
print(key)
# 从环境变量中获取要变量值
# value = Config.token
value = getattr(Config,key)
print(value)
# 进行替换,正则匹配式,要替换变量的字符串或者函数,要被查找替换的原始字符串,该模式匹配成功后的最大替换次数(默认为替换所有匹配到的),
params = re.sub(ru,value,params,1)
print(params)
运行的结果:
场景二:一个字符串中有多个变量需要替换
原始数据:
params= '{"_ver":"3.18.1","_ct":"101","token":${token},"order_id":${order_id}}'
思路:
1、写出正则匹配式
2、取出字符串中匹配成功的多个变量
3、循环多个变量取出匹配到的值,也就是需要替换掉的变量
4、从环境变量中获取要变量值
5、使用re.sub进行替换。
实现代码:
import re
import Config
# 定义一个字符串,里面有一个变量
params= '{"_ver":"3.18.1","_ct":"101","token":${token},"order_id":${order_id}}'
# 写出正则匹配式
ru = r'\${(.*?)}'
# 进行正则匹配,匹配多个变量
while re.search(ru,params):
# 取出字符串中匹配成功的多个变量
res = re.search(ru, params)
# 取出匹配到的值,也就是需要替换掉的多个变量
keys = res.groups()
# 循环对匹配到的值进行替换
for key in keys:
print(key)
# 从环境变量中获取要变量值
value = getattr(Config, key)
print(value)
# 进行替换,正则匹配式,要替换变量的字符串或者函数,要被查找替换的原始字符串,该模式匹配成功后的最大替换次数(默认为替换所有匹配到的),
params = re.sub(ru, value, params, 1)
print(params)
运行结果:
getattr是用来获取对象中的属性或者方法的,在属性名或者方法名不确定是变量时使用。
在上面的例子中getattr(Config, key) 等价于 Config.token或者Config.order_id
token和order_id是key 在运行中对应的值
不能直接使用Config.key,因为这种情况下key就是属性名或者方法名,不能替换成key对应的变量