data driver test,ddt不是数据驱动。只是在数据驱动过程中,实现数据传递和交互的一个模块,可以作为数据驱动的形式,但不是专门做数据驱动的。在UnitTest中是一个完美的搭档。当我们的测试数据不需要用到用到文件时,使用ddt是一个很好的选择。但是他适用于简单数据的管理。
ddt是属于python的第三方库,安装指令:pip install ddt/pip3 install ddt
ddt的基本使用: 1.ddt在整个类之中是通过装饰器形态来实现。一定要在class之前添加@ddt装饰器,表示这个类会调用ddt来实现数据的驱动管理。 2. @data实现测试用例的数据管理: 只需要做基本简单的数据管理和使用 在data装饰器中,定义有数据内容,则将数据内容直接传入到对应的测试用例之中.
所以在使用过程中@ddt和@data缺一不可,通过将data后面的数据直接传到函数中。
import unittest
from ddt import ddt,data
@ddt
class TestDemo(unittest.TestCase):
#测试用例本身是函数形态,所以支持传参
@data('cc')
def test_01(self,name):
print(name)
if __name__ == '__main__':
unittest.main()
按照之前的解释,data后面的'cc'可以直接传入到函数name参数中,我们可以print出'cc'
观察运行结果确实打印出了'cc'。
如果是想要输入两个不同的参数,则需要给数据进行list或者元组的形式进行管理。并且需要添加@unpack装饰器将集合数据进行 二次拆解。
@data(['cc', 18], ['xzl', 16])
@unpack
def test_02(self, name, age):
print('这是{},年龄是{}'.format(name, age))
if __name__ == '__main__':
unittest.main()
@data如果需要进行多个参数的同时传递,则需要再额外添加一个新的装饰器@unpack @data(['cc', 18], ['xzl', 16]) ——> 解析后:['cc', 18]和['xzl', 16]两组数据 @unpack ——> 解析后:'cc'和18、'xzl'和16 所以如果说需要一次性传入多个不同的参数,则需要给数据进行list或者元组的形式进行管理。并且需要添加@unpack装饰器将集合数据进行二次拆解。
需要提前准备想要传入参数的文件
需要定义一个读文件的函数:
#读取文件的数据内容
def read_file():
value = list()
file = open('./data.txt','r',encoding='utf-8')
for line in file.readlines():
value.append(line)
return value
仍然通过@data和@unpack将一个文件传入,具体实现为:
@data(read_file())
@unpack
def test_03(self,username,password):
print(username,password)
使用excel作为数据驱动的话,我们需要做大量数据的处理。yaml作为数据驱动很方便,是因为在实际测试中需要传入非常多的数据,这些数据一般情况下我们希望是直接打包传递,会更加方便一些。原因就是因为支持list和dict格式的数据管理。
环境部署:pip install pyyaml/pip3 install pyyaml
yaml是对于缩进敏感的规范化格式。文件的上下级区分都是基于缩进来进行控制。在编写的时候一定要注意到缩进的问题。
list格式的数据内容定义是通过- 的方式来实现,一定注意-的后面要加上空格,不加则会变成普通文本。
还可以有list的嵌套:下方也会有相应的提示
yaml文件的读取,不能使用基本读文件的方式:
import yaml
file = open('./demo.yaml', 'r', encoding='utf-8')
#基本的文件读取方式,只能获取到内容,但是数据类型无法改变
for line in file.readlines():
print(line)
需要特定的读取格式:
# #读取指定的文件
values = yaml.load(stream=file, Loader=yaml.FullLoader)
# Loader参数是固定内容,不用更改,必须添加
print(values)
dict格式的数据内容定义是通过key: value的格式来实现。一定要注意:后面要加上空格,不然会变成普通文本
对于dict格式的读取和list格式读取格式一致:不能是基本读入,也是特定的写法。
import yaml
file = open('./demo_dict.yaml', 'r', encoding='utf-8')
#基本的文件读取方式,只能获取到内容,但是数据类型无法改变
# for line in file.readlines():
# print(line)
# #读取指定的文件
values = yaml.load(stream=file, Loader=yaml.FullLoader)
# Loader参数是固定内容,不用更改,必须添加
print(values)
查看运行结果:
一般情况下,我们会使用,list+dict的格式传递数据,yaml文件的话,就按照2.1和2.3的原则写入就行
对于yaml文件,要使用 @file_data装饰器
@file_data('./demo_plus.yaml')
#基于yaml实现数据驱动内容的传递
def test_04(self,user,password):
print(user)
print(password)
运行结果为:
注意: @file_data进行yaml文件的数据传入。传参的入参名称一定要与yaml文件中的key相同 。入参的顺序无所谓。
在参数很多的情况下,还可以用**kwargs:
@file_data('./demo_plus.yaml')
def test_05(self, **kwargs): # 如果入参有很多,则可以通过**kwargs来进行传递。
print(kwargs)
如果yaml文件中冗余过高,可以通过合理化地设计数据内容,从而实现更加灵活的管理手段。设计的方法就是通过定义锚点以及引用锚点。锚点相当于是变量
语法规范:
&表示定义一个锚点,也就是定义一个变量。
<<表示追加写入
*表示引用指定的锚点