python+接口参数化(ddt和pytest.mark.parametrize())使用

一、ddt(基于unittest)

实例:字典解包【{},{}】

test_data=t.read_excel(mode,case_list)
@ddt
class Interface(unittest.TestCase): def setUp(self): logger.info("测试用例开始了。。。。") @data(*test_data) @unpack def test_case(self,id,interface,method,url,data,sql,Expected_code):#直接拆开用 #logger.info("正在执行%s条用例:"%id) logger.info("正在执行"+"["+str(interface)+"]"+"接口"+str(id)+"条用例") dict={} request_result = HttpRequest().http_request(method, url, data)

 

二、pytest.mark.parametrize()

示例:test.py

import pytest
class TestApi:

#第一种: 列表args解包,输出多个参数
@pytest.mark.parametrize('name,age,a', [["百里", "18","19"], ["星耀", "20","21"]]) # 解包操作,输出多个参数
def test_api_1(self, name, age,a):
print(name, age)

# 第二种 字典 args解包,输出多个参数
t=[{'id': 1, 'module': '注册', 'description': '输入手机号、密码、注册名', 'method': 'get', 'url': 'http://test.lemonban.com//futureloan/mvc/api/member/register','data': {'mobilephone': '18501026696', 'pwd': '123456', 'regname': '666'},'sql': {'my_sql': 'select count(*) from member where mobilephone=%s', 'condition': '18501026696', 'result': 1, 'code': 0},'exception_code': 10001, 'exception_sql_select': 1},
{'id': 2, 'module': '登录', 'description': '输入正确手机号、密码', 'method': 'get', 'url': 'http://test.lemonban.com//futureloan/mvc/api/member/login', 'data': {'mobilephone': '18501026696', 'pwd': '123456'}, 'sql': {'my_sql': 'select count(*) from member where mobilephone=%s', 'condition': '18501026696', 'result': 1, 'code': 0}, 'exception_code': 10001, 'exception_sql_select': 1},
{'id': 3, 'module': '充值', 'description': '输入手机号,充值金额为空', 'method': 'get', 'url': 'http://test.lemonban.com//futureloan/mvc/api/member/recharge', 'data': {'mobilephone': '', 'amount': ''}, 'sql': {'my_sql': 'select LeaveAmount from member where mobilephone=%s', 'result': 'None', 'condition': '', 'code': 0}, 'exception_code': 20103, 'exception_sql_select': 'None'},
{'id': 4, 'module': '充值', 'description': '输入手机号、充值金额', 'method': 'get', 'url': 'http://test.lemonban.com//futureloan/mvc/api/member/recharge', 'data': {'mobilephone': '18501026696', 'amount': 600.0}, 'sql': {'my_sql': 'select LeaveAmount from member where mobilephone=%s', 'result': 600.0, 'condition': '18501026696', 'code': 0}, 'exception_code': 10001, 'exception_sql_select': '600.00'
}]
@pytest.mark.parametrize('caseinfo',t) # 解包操作,输出多个参数
def test_api_11(self,caseinfo):
print(caseinfo["id"],caseinfo["module"])

if __name__ == '__main__':
pytest.main(["-vs", "test.py"])

结果:

 具体应用:

第一种:列表【[],[]】 args解包

test_data_list = t.read_data()
class
Test_insterface: #COOKIES=None # 全局变量 @allure.description('测试接口:采用正向和反向用例测试') @pytest.mark.parametrize('id,module,description,method,url,data,sql,exception_code,exception_sql_select', test_data_list) def test_case_ykt(self,id,module,description,method,url,data,sql,exception_code,exception_sql_select): logging.info("正在运行{}接口:第{}条测试用例".format(module, id)) logging.info("测试数据:{},{},{}".format(method, url, data)) result_dict = {} #创建空字典,用于存在请求返回结果的数据

 

第二种:字典【{},{}】 args解包

test_data=t.read_excel(mode,case_list)
class
Test_interFaceCase: @pytest.mark.parametrize('caseinfo',test_data)#获取数据test_data的方式是字典格式,不能caseinfo数据拆开 def test_interface(self,caseinfo): id=caseinfo["id"] #因为数据是字典格式[{}],需要拆开使用 module=caseinfo["module"] method=caseinfo["method"] url=caseinfo["url"] data=caseinfo["data"] logging.info("正在运行{}接口:第{}条测试用例".format(module, id)) logging.info("测试数据:{},{},{}".format(method, url, data))

 

posted @ 2021-08-30 23:36  syy714363310  阅读(279)  评论(0编辑  收藏  举报