DDT+Yaml实现数据驱动

一、DDT应用与原理

data driver test,ddt不是数据驱动。只是在数据驱动过程中,实现数据传递和交互的一个模块,可以作为数据驱动的形式,但不是专门做数据驱动的。在UnitTest中是一个完美的搭档。当我们的测试数据不需要用到用到文件时,使用ddt是一个很好的选择。但是他适用于简单数据的管理

ddt是属于python的第三方库,安装指令:pip install ddt/pip3 install ddt

1.1DDT的基本使用

1.1.1单个参数的情况
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'

DDT+Yaml实现数据驱动_第1张图片

 观察运行结果确实打印出了'cc'。


1.1.2多个参数的情况

如果是想要输入两个不同的参数,则需要给数据进行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装饰器将集合数据进行二次拆解。

DDT+Yaml实现数据驱动_第2张图片 


 1.1.3通过文件传参的情况

需要提前准备想要传入参数的文件

DDT+Yaml实现数据驱动_第3张图片

需要定义一个读文件的函数:

#读取文件的数据内容
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)

二、 Yaml实现数据驱动

使用excel作为数据驱动的话,我们需要做大量数据的处理。yaml作为数据驱动很方便,是因为在实际测试中需要传入非常多的数据,这些数据一般情况下我们希望是直接打包传递,会更加方便一些。原因就是因为支持list和dict格式的数据管理。 

2.1list格式的yaml文件语法结构 

环境部署:pip install pyyaml/pip3 install pyyaml

yaml是对于缩进敏感的规范化格式。文件的上下级区分都是基于缩进来进行控制。在编写的时候一定要注意到缩进的问题。

list格式的数据内容定义是通过- 的方式来实现,一定注意-的后面要加上空格,不加则会变成普通文本。

       DDT+Yaml实现数据驱动_第4张图片

还可以有list的嵌套:下方也会有相应的提示

DDT+Yaml实现数据驱动_第5张图片


 

2.2list格式的yaml文件的读取 

yaml文件的读取,不能使用基本读文件的方式:

import yaml

file = open('./demo.yaml', 'r', encoding='utf-8')
#基本的文件读取方式,只能获取到内容,但是数据类型无法改变
for line in file.readlines():
    print(line)

 这种基本读文件的方式,只能获取到内容,但是数据类型无法改变DDT+Yaml实现数据驱动_第6张图片

 需要特定的读取格式:

# #读取指定的文件
values = yaml.load(stream=file, Loader=yaml.FullLoader)
# Loader参数是固定内容,不用更改,必须添加
print(values)

查看结果,可以读取到list格式的内容 DDT+Yaml实现数据驱动_第7张图片


 2.3dict格式yaml文件语法结构

dict格式的数据内容定义是通过key: value的格式来实现。一定要注意:后面要加上空格,不然会变成普通文本

DDT+Yaml实现数据驱动_第8张图片

2.4dict格式yaml文件的读取 

对于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)

 查看运行结果:

DDT+Yaml实现数据驱动_第9张图片


 2.5基于yaml实现数据内容的传递

一般情况下,我们会使用,list+dict的格式传递数据,yaml文件的话,就按照2.1和2.3的原则写入就行

DDT+Yaml实现数据驱动_第10张图片

对于yaml文件,要使用 @file_data装饰器

@file_data('./demo_plus.yaml')
    #基于yaml实现数据驱动内容的传递
    def test_04(self,user,password):
        print(user)
        print(password)

运行结果为:

DDT+Yaml实现数据驱动_第11张图片

注意: @file_data进行yaml文件的数据传入。传参的入参名称一定要与yaml文件中的key相同 。入参的顺序无所谓。

在参数很多的情况下,还可以用**kwargs:

@file_data('./demo_plus.yaml')
    def test_05(self, **kwargs):    # 如果入参有很多,则可以通过**kwargs来进行传递。
        print(kwargs)

 2.6yaml的锚点与引用

如果yaml文件中冗余过高,可以通过合理化地设计数据内容,从而实现更加灵活的管理手段。设计的方法就是通过定义锚点以及引用锚点。锚点相当于是变量

语法规范:

  • &表示定义一个锚点,也就是定义一个变量。

  • <<表示追加写入

  • *表示引用指定的锚点

如果yaml有两套几乎相同的数据,可以把共同的部分可以定义到一个变量,其他变量定义一组数据不同的东西 DDT+Yaml实现数据驱动_第12张图片

你可能感兴趣的:(python,测试工具,开发语言,网络协议)