unittest10--数据驱动测试-DDT

什么是DDT

Data Driver Test
由外部数据集合来驱动测试用例,一组不同的数据来执行相同的操作(一份脚本),测试数据和测试操作进行完全的分离的脚本设计模式
从数据文件读取输入数据,通过变量的参数化,将测试数据传入测试脚本,不同的数据文件对应不同的测试用例
    在这种模式下数据和脚本分离,脚本的利用率、可维护性大大提高,数据的覆盖率也较高
ddt只需要读文件并按格式返回数据以及指定参数名,对参数的处理ddt都已经封装好,不再需要自己写循环

ddt使用方法

安装ddt第三方模块
    pip  install  ddt
导入ddt相关模块
    from ddt import ddt, data, unpack
使用@ddt装饰器修饰测试类
    表示使用ddt数据驱动方式
    放在类的定义之前,紧挨着
使用@data进行数据解包(拆出用例中的多行)
    @data(case_data)
    放在测试方法之前
    将case_data拆分成一个或多个一维列表,相当于获得用例中的多行
使用@unpack继续数据解包(拆出一行用例中的多列)
    @unpack
    放在@data之后,测试方法之前
    将@data解包出的每一个一维列表继续拆分成多个数据,按顺序传递给测试用例的形参,相当于获得一条用例中的多列

data(多个数据)

@data(多个数据)
    @ddt
    class  ClassName(unittest.TestCase):
        @data(1, 2, 3)
        def test(self, a):
            @data根据最外层的逗号拆分数据为3个
            循环执行test方法3次,并将数据分3次传给形参

目的:读取一维数据

from ddt import ddt,data,unpack
import unittest
@ddt()
class testdemo01(unittest.TestCase):
    @data(1,2,3)
    def test01(self,a):
        print(a)
if __name__=='__main__':
    unittest.main()

data(一个一维列表)

    @ddt
    class  ClassName(unittest.TestCase):
        @data(['zhsan',1])
        @unpack
        def  test(self, arg1, arg2):
    [ ]不能省略
    @data(['zhsan',1])取到一个一维列表['zhsan',1],循环执行test方法1次
    @unpack在每次循环中拆出2列数据
    接收数据的参数的个数与列表元素个数要一致

读取一个一维列表

import unittest
from ddt import ddt,data,unpack
@ddt
class  ClassName(unittest.TestCase):
    @data(['zhsan',1])
    @unpack
    def  test(self, arg1, arg2):
        print(arg1,arg2)
if __name__=='__main__':
    unittest.main()

data(多个一维列表)

@data(多个一维列表)
    @data(['zhsan',1], ['lisi',2])
    @unpack
    @data(['zhsan',1], ['lisi',2])取到2个一维列表,循环2次
    @unpack表示将@data拆出的2个一维列表,继续进行拆分出元素
        第1次拆出2个数据zhsan和1
        第2次拆出2个数据lisi和2
    接收数据的参数的个数与列表元素个数要一致

读取多个一维列表

import unittest
from ddt import ddt, data, unpack


@ddt()
class Testdemo02(unittest.TestCase):
    @data(['zhsan', 1], ['lisi', 2])
    @unpack
    def test02(self, uname, upasswd):
        print(uname, upasswd)


if __name__ == '__main__':
    unittest.main()

data(一个字典)

    @data({'uname':'zhsan','passwd':1})
    @unpack
    def  test(self, uname, passwd)
        测试方法中的参数名要与字典键同名,顺序可以不一致

读取一个字典

import unittest
from ddt import ddt, data, unpack


@ddt()
class Testdemo02(unittest.TestCase):
    @data({'uname': 'zhsan', 'passwd': 1})
    @unpack
    def test02(self, uname, passwd):
        print(uname, passwd)


if __name__ == '__main__':
    unittest.main()

data(多个一维字典)

@data(多个一维字典)
    @data({'uname':'zhsan','passwd':1},{'uname':'lisi','passwd':2})
    @unpack
    def  test(self, uname, passwd):
        测试方法中的参数名要与字典键同名,顺序可以不一致

读取多个一维字典

import unittest
from ddt import ddt, data, unpack


@ddt()
class Testdemo02(unittest.TestCase):
    @data({'uname': 'zhsan', 'passwd': 1}, {'uname': 'lisi', 'passwd': 2})
    @unpack
    def test02(self, uname, passwd):
        print(uname, passwd)


if __name__ == '__main__':
    unittest.main()

ddt读取二维数据

@data(*一个二维列表)
    @data(*[['zhsan',1], ['lisi',2]])
    @unpack
    @data表示取到2个一维列表
        两层 [ ] 不能省略
        * 表示去掉一层[ ],* 不能省略
        @unpack表示将@data拆出的2个一维列表,继续进行拆分出元素
            第1次拆出2个数据zhsan和1
            第2次拆出2个数据lisi和2

读取二维数据

import unittest
from ddt import ddt, data, unpack


@ddt()
class Testdemo02(unittest.TestCase):
    @data(*[['zhsan', 1], ['lisi', 2]])
    @unpack
    def test02(self, uname, passwd):
        print(uname, passwd)


if __name__ == '__main__':
    unittest.main()

使用变量定义二维列表

    casedata=[['zhsan',1],['lisi',2]]
    @data(*casedata)
    @unpack
        casedata是二维列表

读取使用变量定义二维列表

import unittest
from ddt import ddt, data, unpack


@ddt()
class Testdemo02(unittest.TestCase):
    casedata = [['zhsan', 1], ['lisi', 2]]

    @data(*casedata)
    @unpack
    def test02(self, uname, passwd):
        print(uname, passwd)


if __name__ == '__main__':
    unittest.main()

data(字典列表)

   @data(*[{'uname':'zhsan','passwd':1},{'uname':'lisi','passwd':2}])
   @unpack
        不能使用嵌套字典
        *不能省略

使用变量定义字典列表

    casedata=[{'uname':'zhsan','passwd':1},{'uname':'lisi','passwd':2}]
    @data(*casedata)
        * 不能省略

读取使用变量定义字典列表

import unittest
from ddt import ddt, data, unpack


@ddt()
class Testdemo02(unittest.TestCase):
    casedata = [{'uname': 'zhsan', 'passwd': "1"}, {'uname': 'lisi', 'passwd': "2"}]

    @data(*casedata)
    @unpack
    def test02(self, uname, passwd):
        print(uname, passwd)


if __name__ == '__main__':
    unittest.main()

使用ddt数据驱动读取login.xlsx

在project_M1目录下创建.py文件完成下列代码:

from ddt import ddt, data, unpack
import unittest, pandas

date = pandas.read_excel('./excelcases/login.xlsx')  # DataFram字典
cases = date.values.tolist()  # 二维列表


@ddt  # 紧邻类,放类前面
class Test(unittest.TestCase):
    @data(*cases)  # 循环两次,@data以最外层逗号拆分
    @unpack  # 对@data每次拆除的数据根据逗号拆成多个数据
    def test1(self, a, b, c):
        print(a, b, c)


if __name__ == '__main__':
    unittest.main()

ddt使用注意事项

    ddt:数据驱动测试,用于执行大量用例
    之前执行大量用例是写for循环,其实ddt就是封装了循环
    ddt是与unittest结合使用的,是跟测试类相结合的

ddt数据驱动模块使用步骤

from ddt import ddt,data,unpack
import unittest
@ddt # 紧邻类,放类前面
class Test(unittest.TestCase):
    @data([1,2,3],[4,5,6])#data相当于循环两次,根据最外侧逗号拆分一次
    # data中各组数据要对应,如果不对应要用none代替
    @unpack # 对@data每次拆除的数据根据逗号拆成多个数据
    def test1(self,a,b,c):
        print(a,b,c)
if __name__=='__main__':
    unittest.main()
posted @ 2021-11-07 23:48  暄总-tester  阅读(231)  评论(0)    收藏  举报