unittest和pytest数据驱动分析

数据驱动的思想在于参数与参数名的对应关系,一对一,多对多,然后对数据进行拆分

1、首先我们分析一下unittest的DDT数据驱动:

第一步,导包这里要用到ddt,data,unpack
先讲一下unpack的作用就是拆分,要不然数据就是一个整体

from ddt import ddt, data, unpack

注意看清楚@data里面的内容:
{‘name’: ‘1’,‘password’:‘111’},
{‘name’: ‘2’,‘password’:‘222’}

    @data({'name': '1','password':'111'},{'name': '2','password':'222'})
    @unpack
    def test_01(self,name,password):
        print(name)
        print(password)

此时这是两个单字典,这个时候要注意参数名要和字典的键值对应来读取,此时结果应该为

1
111
2
222

注意这是如果@data变成了
@data([{‘name’: ‘1’,‘password’:‘111’},{‘name’: ‘2’,‘password’:‘222’}])
多了列表嵌套

    @data([{'name': '1','password':'111'},{'name': '2','password':'222'}])
    def test_01(self,name,password):
        print(name)
        print(password)

如果还是和之前一样读取的话结果就变成了

{'name': '1', 'password': '111'}
{'name': '2', 'password': '222'}

这样就不好搞了,他就是一个单列表了不能再拆分就失去了参数化的效果
接着看后面有字典形式怎么操作。

参数化总不能手写吧,肯定要读取文件
搞一个execl文件
在这里插入图片描述

    def ReadExecl(self,filename):
        path=os.path.abspath('..')+'/'+'data'+'/'+filename+'.xlsx'
        work=xlrd.open_workbook(path)
        sheet=work.sheet_by_name('Sheet1')
        nrows=sheet.nrows
        dataList=[]
        for rows in range(nrows):
            data=sheet.row_values(rows)
            dataList.append(data)
        # 第一行是标题
        title=dataList[0]
        data=dataList[1:]
        return data

这是搞成了列表形式

[['1','111'],['2','222'],['3','333']]

如何引入呢?这里*表示所有数据

    @data(*Read().ReadExecl('data_execl'))
    @unpack
    def test_01(self,name,password):
        print(name,password)

如果写文件读取的时候不小心搞成了字典形式呢?

    def ReadExecl1(self,filename):
        path=os.path.abspath('..')+'/'+'data'+'/'+filename+'.xlsx'
        work=xlrd.open_workbook(path)
        sheet=work.sheet_by_name('Sheet1')
        nrows=sheet.nrows
        dataList=[]
        for rows in range(nrows):
            data=sheet.row_values(rows)
            dataList.append(data)
        # 第一行是标题
        title=dataList[0]
        datas=dataList[1:]
        new=[]
        for data in datas:
            dic={}
            for i in range(len(data)):
                dic[title[i]]=data[i]
            new.append(dic)
        return new

上面是写成字典形式

[{'name': '1', 'password': '111'}, {'name': '2', 'password': '222'}, {'name': '3', 'password': '333'}, {'name': '4', 'password': '444'}]

这个时候就不能用unpack了因为已经只是一个列表了

    @data(*Read().ReadExecl1('data_execl'))
    def test_01(self,name):
        print(name['name'],name['password'])

二、pytest参数化

pytest参数化的话自带方法
@pytest.mark.parametrize(‘参数名’,[参数])
两个参数的话

@pytest.mark.parametrze('参数名1,参数名2'[['1','111'],['2','222'])
	#Read().ReadExecl('data_execl')=
    # [['1', '111'], ['2', '222'], ['3', '333'], ['4', '444']]
    @pytest.mark.parametrize('name,password',Read().ReadExecl('data_execl'))
    def test_03(self,name,password):
        print(name,password)
#Read().ReadExecl1('data_execl')=
#[{'name': '1', 'password': '111'}, {'name': '2', 'password': '222'}, {'name': '3', 'password': '333'}, {'name': '4', 'password': '444'}]
    @pytest.mark.parametrize('name',Read().ReadExecl1('data_execl'))
    def test_03(self,name):
        print(name['name'],name['password'])

数据驱动主要还是数据文件的读取的问题,给他处理成相应的格式,然后记住一对一原则多对多原则就不难了
@pytest的参数一定要列表嵌套

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值