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'

 观察运行结果确实打印出了'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装饰器将集合数据进行二次拆解。

 


 1.1.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格式的数据内容定义是通过- 的方式来实现,一定注意-的后面要加上空格,不加则会变成普通文本。

       

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


 

2.2list格式的yaml文件的读取 

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)

查看结果,可以读取到list格式的内容 


 2.3dict格式yaml文件语法结构

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

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)

 查看运行结果:


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

一般情况下,我们会使用,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)

 2.6yaml的锚点与引用

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

语法规范:

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

  • <<表示追加写入

  • *表示引用指定的锚点

如果yaml有两套几乎相同的数据,可以把共同的部分可以定义到一个变量,其他变量定义一组数据不同的东西 

  • 19
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
pytest是一个Python的测试框架,用于编写和运行测试用例。而yaml则是一种常见的数据格式,用于存储和传输数据。 在pytest中,可以使用ddt(Data-Driven Testing)模块来进行数据驱动的测试。ddt模块允许我们将测试用例的输入数据和预期结果从代码中分离出来,以yaml格式存储在单独的文件中。这样一来,我们可以轻松地修改和扩展测试数据,而无需修改测试代码。 使用ddt进行数据驱动测试的步骤如下: 1. 安装ddt模块:在终端中运行`pip install ddt`命令来安装ddt模块。 2. 在测试类中引入ddt装饰器:在测试类上方添加`@ddt`装饰器,以告诉pytest该类将使用ddt模块。 3. 使用@data装饰器和@unpack装饰器:在测试方法上方添加`@data`装饰器,并传入从yaml文件中读取的测试数据。如果测试数据是一个列表,可以使用`@unpack`装饰器将其拆分为多个参数,方便使用。 4. 在测试方法中使用测试数据:在测试方法内部,使用传入的测试数据进行测试操作。通过调用断言函数来比较实际结果和预期结果,以判断测试是否通过。 5. 在命令行中运行测试用例:在终端中运行命令`pytest`来执行测试用例。pytest将自动查找和执行包含ddt装饰器的测试方法,并使用测试数据进行多次测试。 通过这种方式,我们可以通过简单修改或添加yaml文件中的测试数据,从而轻松地扩展和维护测试用例。同时,ddt模块还提供了更多的装饰器和功能,如@file_data、@cases、@data_class等,可以满足各种不同的测试需求。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值