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 json
def 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 yaml
def 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 pd
def 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 pd
def 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 pytest
from testCase.fixtureDemo.readFileData import myJsonData
def add(a,b):
return a+b
myList=[[1,1,2],[2,3,4]]
@pytest.fixture(params=myList)
def initData(request):
return request.param
def 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.param
def 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.param
def test2021(getExcle):
assert add(getExcle[0],getExcle[1])==getExcle[2]