前面几章我们学了一个自动化用例应该怎么写,今天我们来实现一个任务跑多个参数不同的自动化用例。
首先我们在pm_get_token.yaml里新增一个参数parameterize,该参数为一个列表,第一行为我要替换的参数名,后面几行为每一个参数名实际对应的值。
后面的参数如果需要替换值我们都用$ddt{xxx} 来替换。这样我们可以实现写一个yaml文件,同时跑【密码正确】和【密码不正确】两个测试用例。
-
parameterize:
- [ 'name','appid','secret','validate']
- [ '密码正确','wxxx8b67ced3c4b884','xxxx24bd9ca932e31e229be30b0a805b', 'access_token' ]
- [ '密码错误','wxxx8b67ced3c4b884','xxxx24bd9ca932e31e229be30b0a8033', 'errcode' ]
name: $ddt{name}
request:
method: get
url: https://api.weixin.qq.com/cgi-bin/token
params:
grant_type: client_credential
appid: $ddt{appid}
secret: $ddt{secret}
validate:
- contains: $ddt{validate}
extract:
access_token: '"access_token":"(.*?)"'
expires_in: $.expires_in
下面我们来看看如何实现:
1、新建commons/parameterize.py
read_testcase_ddt方法主要是判断参数里是否有parameterize,如果有则去替换ddt{XXX},如果没有就不用替换值直接返回yaml文件里的数据。
import json
import os
import yaml
#获取项目根路径
def get_object_path():
# print(os.getcwd())
return os.getcwd()
#读取测试用例
def read_testcase_ddt(yaml_path):
with open(get_object_path()+yaml_path,encoding='utf-8') as f:
arg_names = yaml.load(f,Loader=yaml.FullLoader)
# 判断yaml里是否有parameterize参数
if "parameterize" in dict(*arg_names).keys():
new_arg_names = get_ddt(*arg_names)
return new_arg_names
else:
return arg_names
def get_ddt(arg_names):
print("--------------get_ddt---------------")
try:
arg_names_str = json.dumps(arg_names)
data_list = arg_names["parameterize"]
key_length = len(data_list[0])
# 循环数据-判断参数个数是否有误
for param in data_list:
if len(param) != key_length:
print("参数个数有误")
return arg_names
# 替换值
new_art_names = []
for x in range(1, len(data_list)):
# print(data_list[x])
temp_arg_names = arg_names_str
for y in range(0, len(data_list[x])):
# print(data_list[x][y])
# 如果要替换的参数是整形,需要将引号一起替换掉
if isinstance(data_list[x][y], int) or isinstance(data_list[x][y], float):
temp_arg_names = temp_arg_names.replace('"$ddt{' + data_list[0][y] + '}"', str(data_list[x][y]))
else:
temp_arg_names = temp_arg_names.replace("$ddt{" + data_list[0][y] + "}", str(data_list[x][y]))
#将temp_arg_names字符串变成json对象
# print(json.loads(temp_arg_names))
#数组添加json对象
new_art_names.append(json.loads(temp_arg_names))
# print(new_art_names)
return new_art_names
except Exception as e:
print("数据驱动异常")
2、接着我们把用例代码里的read_testcase_yaml改成read_testcase_ddt读取yaml文件
from test9.commons.parameterize import read_testcase_ddt
from test9.commons.request_util import RequestUtil
from test9.commons.yaml_util import read_testcase_yaml
class TestProductApi:
@pytest.mark.parametrize("caseinfo", read_testcase_ddt('/testcase/pm_get_token.yaml'))
def test_get_token(self, caseinfo):
caseinfo.pop('parameterize')
print(caseinfo)
RequestUtil().standard_yaml(caseinfo)
3、执行一次任务可以看到该用例执行了2次,每次参数都替换成功。
这一章代码不多,但如何实现的思路很重要,建议反复观看。
学习资源分享
最后感谢每一个认真阅读我文章的人,看着粉丝一路的上涨和关注,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走
这些资料,对于做【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!凡事要趁早,特别是技术行业,一定要提升技术功底。希望对大家有所帮助…….