1.参数化概述
1.参数化的场景
针对一个测试场景中,操作的步骤是一致的,但其每次的数据是不同的。
2.参数化的本质
对列表中的对象(list,tuple,dict)循环,然后一一赋值。
3.pytest参数化的方式
| 序号 | 方式 |
|---|---|
| 1 | @pytest.mark.parametrize(参数名,参数值) |
| 2 | @pytest.fixture(params) |
2.@pytest.mark.parametrize()
1.(硬代码)@pytest.mark.parametrize()
1.不使用pytest.params()
格式 @pytest.mark.paramtrize(参数名,参数值)
说明 参数值(必须为list数据类型)的子数据对象:list、tuple、dict【即 参数值= [list/tuple/dict] 】
1.列表
listData=[[1,1,2],[2,3,4]]@pytest.mark.parametrize("a,b,result",listData,ids=["通过","失败"])def test_hello1(a,b,result):assert add(a,b)==result
2.元组
tupleData=((1,1,2),(2,3,4))@pytest.mark.parametrize("a,b,result",tupleData,ids=["通过","失败"])def test_hello2(a,b,result):assert add(a,b)==result
3.字典
dictData=[{"a":1,"b":1,"result":2},{"a":2,"b":3,"result":4}]@pytest.mark.parametrize("data", dictData, ids=["通过","失败"])def test_hello3( data ):assert add(data['a'],data['b'])==data['result']
2.使用pytest.params()
格式 pytest.params(参数值)
说明 参数值的数据对象:list、tuple、dict
1.列表
listData=[ pytest.param(1,1,2,id="通过"),pytest.param(2,3,4,id="失败") ]@pytest.mark.parametrize("a,b,result",listData)def test_hello1(a,b,result):assert add(a,b)==result
2.元组
listData=[ pytest.param(1,1,2,id="通过"),pytest.param(2,3,4,id="失败") ]@pytest.mark.parametrize("a,b,result",listData)def test_hello1(a,b,result):assert add(a,b)==result
3.字典
dictData=[pytest.param({"a":1,"b":1,"result":2},id="通过"),pytest.param({"a":2,"b":3,"result":4},id="失败")]@pytest.mark.parametrize("data",dictData)def test_hello3(data):assert add(data['a'],data['b'])==data['result']
3.(数据驱动)@pytest.mark.paramtrize()
1.json文件
# 读取json文件【readFileData.py】import jsondef myJsonData(filePath):myList=[]with open(filePath, 'r', encoding='utf-8') as f:myData = list(json.load(f))for i in myData:myList.append(i)return myList#--------------# json文件的数据驱动[test_param3.py]@pytest.mark.parametrize("data", myJsonData(filePath="../dataParam/resource/my.json"))def test_json(data):assert add(data['a'], data['b']) == data['result']
# json数据[{"a": 1,"b": 1,"result": 2},{"a": 2,"b": 3,"result": 4}]
2.yaml文件
# 读取yaml文件【readFileData.py】import yamldef myJsonData(filePath):myList=[]with open(filePath, 'r', encoding='utf-8') as f:myData = list(json.load(f))for i in myData:myList.append(i)return myList#--------------# json文件的数据驱动[test_param3.py]@pytest.mark.parametrize("data", myJsonData(filePath="../dataParam/resource/my.json"))def test_json(data):assert add(data['a'], data['b']) == data['result']
# 在单一文件中,可用连续三个连字号(---)区分多个文件---"a": 1"b": 1"result": 2---"a": 2"b": 3"result": 4
3.csv文件
# 读取csv[readFileData.py]import pandas as pddef myCsvData(filePath):pd.set_option('display.max_columns', None)pd.set_option('display.max_rows', None)data = pd.read_csv(filePath)myList = data.values.tolist() # 将csv的dataFrame转为list类型# print(myList)return myList#----------------# csv文件的数据驱动[test_param3.py]@pytest.mark.parametrize("a,b,result", myCsvData(filePath="../dataParam/resource/my.csv"))def test_csv(a,b,result):print("csvTest")assert add(a,b) == result
4.excel文件
# 读取excle[readFileData.py]import pandas as pddef myExcleData(filePath):pd.set_option('display.max_columns', None)pd.set_option('display.max_rows', None)data = pd.read_excel(filePath)myList = data.values.tolist() # 将excle的dataFrame转为list类型return myList#----------------# excle文件的数据驱动[test_param3.py]@pytest.mark.parametrize("a,b,result",myExcleData(filePath="../dataParam/resource/myExcle.xls"))def test_excle(a,b,result):print("csvTest")assert add(a,b) == result
3.@pytest.fixture()参数化
格式 @pytest.fixture(params=[ xxx ])
def init(request):
return request.param
说明 paramas的值必须为list类型
1.fixture_json
import pytestfrom testCase.fixtureDemo.readFileData import myJsonDatadef add(a,b):return a+bmyList=[[1,1,2],[2,3,4]]@pytest.fixture(params=myList)def initData(request):return request.paramdef test_hello1(initData):assert add(initData[0],initData[1])==initData[2]JsonData=myJsonData(filePath="../fixtureDemo/resource/my.json") # 数据与脚本分离@pytest.fixture(params=JsonData,name="jsondata") # name为别名,testcase可以引用别名def getJsonData(request):return request.paramdef test_hello2(jsondata):assert add(jsondata["a"], jsondata["b"]) == jsondata["result"]
2.fixture_excel
def myExcleData(filePath,sheet_name):pd.set_option('display.max_columns', None)pd.set_option('display.max_rows', None)data = pd.read_excel(filePath,sheet_name)myList = data.values.tolist() # 将excle的dataFrame转为list类型return myList@pytest.fixture(params=myExcleData(filePath="../dataParam/resource/myExcle.xls",sheet_name='my'))def getExcle(request):return request.paramdef test2021(getExcle):assert add(getExcle[0],getExcle[1])==getExcle[2]




