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.列表

  1. listData=[[1,1,2],[2,3,4]]
  2. @pytest.mark.parametrize("a,b,result",listData,ids=["通过","失败"])
  3. def test_hello1(a,b,result):
  4. assert add(a,b)==result

list.png

2.元组

  1. tupleData=((1,1,2),(2,3,4))
  2. @pytest.mark.parametrize("a,b,result",tupleData,ids=["通过","失败"])
  3. def test_hello2(a,b,result):
  4. assert add(a,b)==result

tuple.png

3.字典

  1. dictData=[{"a":1,"b":1,"result":2},{"a":2,"b":3,"result":4}]
  2. @pytest.mark.parametrize("data", dictData, ids=["通过","失败"])
  3. def test_hello3( data ):
  4. assert add(data['a'],data['b'])==data['result']

dict.png

2.使用pytest.params()

格式 pytest.params(参数值)
说明 参数值的数据对象:list、tuple、dict

1.列表

  1. listData=[ pytest.param(1,1,2,id="通过"),
  2. pytest.param(2,3,4,id="失败") ]
  3. @pytest.mark.parametrize("a,b,result",listData)
  4. def test_hello1(a,b,result):
  5. assert add(a,b)==result

list-params.png

2.元组

  1. listData=[ pytest.param(1,1,2,id="通过"),
  2. pytest.param(2,3,4,id="失败") ]
  3. @pytest.mark.parametrize("a,b,result",listData)
  4. def test_hello1(a,b,result):
  5. assert add(a,b)==result

tuple_pa.png

3.字典

  1. dictData=[pytest.param({"a":1,"b":1,"result":2},id="通过"),
  2. pytest.param({"a":2,"b":3,"result":4},id="失败")]
  3. @pytest.mark.parametrize("data",dictData)
  4. def test_hello3(data):
  5. assert add(data['a'],data['b'])==data['result']

dict_pa.png

3.(数据驱动)@pytest.mark.paramtrize()

1.json文件

  1. # 读取json文件【readFileData.py】
  2. import json
  3. def myJsonData(filePath):
  4. myList=[]
  5. with open(filePath, 'r', encoding='utf-8') as f:
  6. myData = list(json.load(f))
  7. for i in myData:
  8. myList.append(i)
  9. return myList
  10. #--------------
  11. # json文件的数据驱动[test_param3.py]
  12. @pytest.mark.parametrize("data", myJsonData(filePath="../dataParam/resource/my.json"))
  13. def test_json(data):
  14. assert add(data['a'], data['b']) == data['result']
  1. # json数据
  2. [{
  3. "a": 1,
  4. "b": 1,
  5. "result": 2
  6. },
  7. {
  8. "a": 2,
  9. "b": 3,
  10. "result": 4
  11. }
  12. ]

json数据.png

2.yaml文件

  1. # 读取yaml文件【readFileData.py】
  2. import yaml
  3. def myJsonData(filePath):
  4. myList=[]
  5. with open(filePath, 'r', encoding='utf-8') as f:
  6. myData = list(json.load(f))
  7. for i in myData:
  8. myList.append(i)
  9. return myList
  10. #--------------
  11. # json文件的数据驱动[test_param3.py]
  12. @pytest.mark.parametrize("data", myJsonData(filePath="../dataParam/resource/my.json"))
  13. def test_json(data):
  14. assert add(data['a'], data['b']) == data['result']
  1. # 在单一文件中,可用连续三个连字号(---)区分多个文件
  2. ---
  3. "a": 1
  4. "b": 1
  5. "result": 2
  6. ---
  7. "a": 2
  8. "b": 3
  9. "result": 4

yaml.png

3.csv文件

  1. # 读取csv[readFileData.py]
  2. import pandas as pd
  3. def myCsvData(filePath):
  4. pd.set_option('display.max_columns', None)
  5. pd.set_option('display.max_rows', None)
  6. data = pd.read_csv(filePath)
  7. myList = data.values.tolist() # 将csv的dataFrame转为list类型
  8. # print(myList)
  9. return myList
  10. #----------------
  11. # csv文件的数据驱动[test_param3.py]
  12. @pytest.mark.parametrize("a,b,result", myCsvData(filePath="../dataParam/resource/my.csv"))
  13. def test_csv(a,b,result):
  14. print("csvTest")
  15. assert add(a,b) == result

image.png
image.png

4.excel文件

  1. # 读取excle[readFileData.py]
  2. import pandas as pd
  3. def myExcleData(filePath):
  4. pd.set_option('display.max_columns', None)
  5. pd.set_option('display.max_rows', None)
  6. data = pd.read_excel(filePath)
  7. myList = data.values.tolist() # 将excle的dataFrame转为list类型
  8. return myList
  9. #----------------
  10. # excle文件的数据驱动[test_param3.py]
  11. @pytest.mark.parametrize("a,b,result",myExcleData(filePath="../dataParam/resource/myExcle.xls"))
  12. def test_excle(a,b,result):
  13. print("csvTest")
  14. assert add(a,b) == result

image.png
image.png

3.@pytest.fixture()参数化

格式 @pytest.fixture(params=[ xxx ])
def init(request):
return request.param
说明 paramas的值必须为list类型

1.fixture_json

  1. import pytest
  2. from testCase.fixtureDemo.readFileData import myJsonData
  3. def add(a,b):
  4. return a+b
  5. myList=[[1,1,2],[2,3,4]]
  6. @pytest.fixture(params=myList)
  7. def initData(request):
  8. return request.param
  9. def test_hello1(initData):
  10. assert add(initData[0],initData[1])==initData[2]
  11. JsonData=myJsonData(filePath="../fixtureDemo/resource/my.json") # 数据与脚本分离
  12. @pytest.fixture(params=JsonData,name="jsondata") # name为别名,testcase可以引用别名
  13. def getJsonData(request):
  14. return request.param
  15. def test_hello2(jsondata):
  16. assert add(jsondata["a"], jsondata["b"]) == jsondata["result"]

image.png

2.fixture_excel

  1. def myExcleData(filePath,sheet_name):
  2. pd.set_option('display.max_columns', None)
  3. pd.set_option('display.max_rows', None)
  4. data = pd.read_excel(filePath,sheet_name)
  5. myList = data.values.tolist() # 将excle的dataFrame转为list类型
  6. return myList
  7. @pytest.fixture(params=myExcleData(filePath="../dataParam/resource/myExcle.xls",sheet_name='my'))
  8. def getExcle(request):
  9. return request.param
  10. def test2021(getExcle):
  11. assert add(getExcle[0],getExcle[1])==getExcle[2]

image.png