一、@pytest.mark.parametrize介绍
@pytest.mark.parametrize(argnames, argvalues, indirect=False, ids=None)
参数说明:
argnames: 一个或多个参数名,用逗号分隔的字符串,如"arg1,arg2,arg3",参数名与用例入参数一致。
argvalues:参数值,必须是列表类型;如果有多个参数,则用元组存放值,一个元组存放一组参数值,元组放在列表中。
indirect:如果设置成True,则把传进来argnames的参数当函数执行,而不是一个参数
ids:用例的ID,传一个字符串列表,可以标识每一个测试用例,自定义测试数据结果的显示,为了增加可读性,ids的长度需要与测试数据列表的长度一致。
@pytest.mark.parametrize("para1",[1,2,3,4,5])
@pytest.mark.parametrize("para1,para2,para3",[(a,b,c),(1,2,3)])
@pytest.mark.parametrize("para1,para2,para3",get_list())
二、登录接口使用@pytest.mark.parametrize
1、将接口测试数据写道yaml文件中
以下为登录接口的三组数据
-feature: 用户管理story: 登录接口title: USER-登录-错误密码request:method: posturl: http://IP:81/api/loginheaders: ""data:username: admin@qq.compassword: 123456validate: 用户名或密码错误-feature: 用户管理story: 登录接口title: USER-登录-用户名错误request:method: posturl: http://114.55.135.15:81/api/loginheaders: ""data:username: adminpassword: passwordvalidate: 用户名不存在!-feature: 用户管理story: 登录接口title: USER-登录-成功request:method: posturl: http://114.55.135.15:81/api/loginheaders: ""data:username: admin@qq.compassword: pass123validate: 操作成功
2、编写读取测试用例yaml的工具类
以列表形式,返回3条数据[data1,data2,data3]
import yamldef read_yaml(path):with open(path,encoding="utf-8",mode='r') as f:value = yaml.load(f,yaml.FullLoader)return valueif __name__ == "__main__":print(read_yaml("./login_01.yaml"))
3、封装请求工具
使用RequestUtil类,作为所有请求发送的入口,可以在此类中,进入异常处理、日志监控、请求信息处理等。
类变量session,所有的请求都使用该session,可解决后续的Cookie关联问题
import requestsclass RequestUtil():session = requests.session()def send_request(self,method,url,**kwargs):res = RequestUtil.session.request(method,url,**kwargs)print(res.json())return res
4、测试用例类
@pytest.mark.parametrize(‘casedata’,YamlReadUtil.read_yaml(“./testcases/login_01.yaml”))
从login_01.yaml文件中读到3条测试用例,循环将3组用例数据传递给casedata。
from TestPytest.testcases import YamlReadUtil
from TestPytest.testcases.RequestUtil import RequestUtilclass TestRequests():@pytest.mark.parametrize('casedata',YamlReadUtil.read_yaml("./testcases/login_01.yaml"))def test_01_login(self,casedata):method=casedata["request"]["method"]url = casedata["request"]["url"]data = casedata["request"]["data"]res = RequestUtil().send_request(method=method,url=url,data=data)result = jsonpath.jsonpath(res.json(),"$.message")[0]print(result)# assert casedata["validate"] == result
执行结果
三、将用例写在yaml文件的优点与问题
优点:
用例编写只用写yaml文件,不需要再编写代码
缺点:
(1)接口关联处理,如编写文章接口入参需要上一个接口返回的access_token,在yaml文件中不好提取对应值。
(2)接口需要上传文件数据,yaml文件中不能执行open函数,无法写对应的文件数据。