目的:将数据和代码进行分离,便于批量执行多个用例,且修改数据上方便
问题:所有的请求和请求参数的写在了代码中,不利于批量测试多个用例,一旦有修改工作量大
原代码:
class TestApi:
# get请求
def test_phpwind(self):
url = 'http://aaa/phpwind/'
res = RequestUtil().send_request(method="get",url=url)
res_token = re.search('name="csrf_token" value="(.*?)"', res.text)
data = {"csrf_token":res_token.group(1)}
writer_yaml(data)
# post请求
def test_phpwind_login(self):
url = 'http://aaa/phpwind/index.php?m=u&c=login&a=dorun'
header = {
"Accept": "application/json, text/javascript, /; q=0.01"
"X-Requested-With": "XMLHttpRequest"
}
data = {
"username": "aaa",
"password": "aaa",
"csrf_token": read_yaml('csrf_token')
"backurl": "http://aaa/phpwind/",
"invite": ""
}
res = RequestUtil().send_request(method="post",url=url, data=data, headers=header)
print(res.json())
# 文件上传。需要获取上面的token
def test_file_upload(self):
url = 'https://api.weixin.qq.com/cgi-bin/media/uploadimg'
params = {
'access_token':read_yaml('csrf_token')
}
file = {
'media':'D:\\1.jpg'
}
res = RequestUtil().send_request(method="post", url=url, params=params, files=file)
print(res.json())
修改后:
1. 在原有读取yaml文件代码基础上,新增一个读取所有用例的方法,注意这里传入的yaml_path不能写死,需要根据不同用例不同的传参
2. 根据每个用例的需求分别写一个对应的yaml文件(这样的弊端是会有很多yaml文件,后期需要优化冗余代码)
3. yaml文件是无法调用方法的,所有当需要调用token等参数的时候,在用例中调用,此时只需要将yaml中的该字段置位‘’即可
1. 新增读取所有用例的方法
def read_testcase(yaml_path):
with open(yaml_path,encoding="utf-8") as f:
value = yaml.safe_load(f)
return value
2. 根据用例数新增对应的yaml文件--根据需求写
2.1 对应test_phpwind用例的yaml文件--test_phpwind.yaml
-
request:
method: get
url: http://aaa/phpwind/
2.2 对应test_phpwind_login用例的yaml文件--test_phpwind_login.yaml
-
request:
method: post
url: http://aaa/phpwind/index.php?m=u&c=login&a=dorun
header:
Accept: "application/json, text/javascript, /; q=0.01"
X-Requested-With: "XMLHttpRequest"
data:
username: aaa
password: aaa
csrf_token: ''
backurl: "http://aaa/phpwind/"
invite: ""
2.3 对应test_file_upload用例的yaml文件--test_file_upload.yaml
-
request:
method: post
url: https://api.weixin.qq.com/cgi-bin/media/uploadimg
params:
access_token: ''
file:
media: 'D:\\1.jpg'
3. 修改后的用例
class TestApi:
@pytest.mark.parametrize('caseinfo',read_testcase('./test_study/test_pytest/test_phpwind.yaml'))
def test_phpwind(self,caseinfo):
method = caseinfo['request']['method']
url = caseinfo['request']['url']
res = RequestUtil().send_request(method=method,url=url)
res_token = re.search('name="csrf_token" value="(.*?)"', res.text)
data = {"csrf_token":res_token.group(1)}
writer_yaml(data)
@pytest.mark.parametrize('caseinfo', read_testcase('./test_study/test_pytest/test_phpwind_login.yaml'))
def test_phpwind_login(self,caseinfo):
method = caseinfo['request']['method']
url = caseinfo['request']['url']
header = caseinfo['request']['header']
data = caseinfo['data']
# 这里通过读取yaml的方式重新将token赋值使用
data['csrf_token'] = read_yaml('csrf_token')
res = RequestUtil().send_request(method=method,url=url, data=data, headers=header)
print(res.json())
@pytest.mark.parametrize('caseinfo', read_testcase('./test_study/test_pytest/test_file_upload.yaml'))
def test_file_upload(self,caseinfo):
method = caseinfo['request']['method']
url = caseinfo['request']['url']
params = caseinfo['request']['params']
params['access_token'] = read_yaml('access_token')
# 通过yaml的方式传入文件
file = caseinfo['request']['file']
res = RequestUtil().send_request(method=method, url=url, params=params, files=file)
print(res.json())