前言
数据驱动,顾名思义就是用数据驱动测试用例的执行,那为什么要用数据驱动的模式呢?它的优势有哪些呢?
- 减少代码冗余,同一个测试场景只需要编写一次,不需要针对每一组测试数据来写一个测试方法。
- 代码复用率高,不同的数据可以用同一个测试方法执行。
- 代码的可维护性高,清晰的测试框架,数据和代码分离,实现解耦合,增加了代码的可维护性。
正文
前面有讲到使用excel来存放测试数据openpyxl操作excel,实现测试数据参数化,拿到数据后可以通过循环读取每一行的测试数据,也能顺利通过数据执行测试,但是这样处理存在两个问题:
- 读取excel数据通过for循环取数据进行参数化,如果中间有断言异常,就会跳出for循环,导致无法继续执行下面的用例。
- unittest框架是根据test开头的方法数来计算用例总数的,如果一个test方法对应多组测试数据,那么在循环多次后实际上方法只进入了一次,导致用例数统计不准确。
DDT模块
为了解决上面提到的这两个问题,就需要使用DDT模块了,DDT会根据data装饰器中位置参数的个数自动创建多个实例方法。
DDT组成
-
DDT由一个类装饰器(ddt)和两个方法装饰器(data,file_data)组成:
-
ddt.ddt:用于继承unittest模块中TestCase类的子类(也就是你的测试类)
-
ddt.data:装饰器用于需要引入数据的测试方法,往往data中的参数个数和测试方法所需的数据一样多,如果是多组数据,比如读取excel的数据是一个嵌套字典的字典,会被识别为一条数据,如果是一行一行的传到测试方法中,就需要将其进行拆包。
-
file_data装饰器可以从json或yaml文件中获取测试数据。
注意,如果文件是以“.yml”或者".yaml"结尾,ddt会作为yaml类型处理,其他文件都会作为json文件处理。
如果文件是列表,列表的值会作为测试用例参数,同时,会作为测试用例方法名后缀显示。
如果文件是字典,字典的key会作为测试用例方法的后缀显示,字典的value会作为测试用例参数
-
ddt.unpack 的作用是把参数中 元祖 或者 列表 的元素对应到多个参数上,没有加 ddt.unpack 表示把元组 或者 列表本身当成一个参数传入。
-
-
测试用例方法名生成规则
使用ddt后,会产生一个新的测试用例方法名,即定义的测试用例方法名,比如:def test_one(),这里就是test_one。
data:如果传递过来的数据存在__ name__ 属性,则这里就是该数据的__ name__ 值。如果未定义__ name__ 属性,ddt会尽量将传递过来的值转化为python标识符,作为data显示。比如:(1,3)就转为1_3。需要注意的是,如果数据是字典,则这里就是字典的key。
DDT安装
pip为pyton的第三方库,可以直接用pip安装
pip install ddt
DDT应用
-
测试用例需要一条数据
from ddt import ddt, data, unpack import unittest @ddt class TestCase(unittest.TestCase): @data(一条数据) def test_1(self, a): print(a)
运行结果:
一条数据 test_1_1_一条数据 (__main__.TestCase) ... ok
-
测试用例需要多组一条数据
from ddt import ddt, data, unpack import unittest @ddt class TestCase(unittest.TestCase): @data(1,