• Python:数据驱动测试DDT


    参考博客:https://www.cnblogs.com/miniren/p/7099187.html

    一、DDT介绍

    1. 数据驱动思想:数据和用例进行分离,通过外部数据去生成测试用例

    2. 适用场景:进行接口测试时,每个接口的传参都不止一种情况,一般会考虑正向、逆向等多种组合。所以在测试一个接口时通常会编写多条case,而这些case除了传参不同外,没其他什么区别。这个时候就可以利用ddt来管理测试数据,提高代码复用率。

    3. DDT: “Data-Driven Tests”的缩写。数据驱动测试,就是说由数据的改变从而驱动自动化测试的执行,最终引起测试结果的改变。通过使用数据驱动测试的方法,可以在需要验证多组数据测试场景中,使用外部数据源实现对输入输出与期望值的参数化。也就是测试数据和用例脚本代码分离。

    4. DDT作用:

    • 通过使用数据驱动测试,一个测试逻辑可以供多条测试数据复用,代码复用率高,避免编写重复代码

    • 数据与测试脚本分离,某条用例失败时不会影响其他测试用例,异常排查效率高

    • 通常来说,多用于单元测试和接口测试。简洁明了的测试框架,利于其他同事阅读,代码的可维护性高。

    二、使用方法

    DDT组成:一个类装饰器ddt;两个方法装饰器data(直接输入测试数据)、file_data(从json或yaml中加载测试数据)

    方法使用小结:

    • @data(a,b):a和b各运行一次用例

    • @data(*(a,b):a和b各运行一次用例,使用*解包,相当于@data(a,b)

    • @data([a,d],[c,d]):如果没有unpack,那么[a,b]当成一个参数传入用例运行; 如果有unpack,那么[a,b]被分解开,按照用例中的两个参数传递

    • @file_data(filename):对于json的文件,每一个json元素按照一个用例运行

    1. ddt.ddt:

    装饰测试类,也就是继承自TestCase的类。告诉ddt这个测试用例类要使用数据驱动。

    2. ddt.data:

    装饰测试方法。data中的数据类型包含单个值,元组,列表和字典。

    data把测试数据作为一个参数传递给测试用例,一个数据对应生成一条测试用例。如果data里面有多个数据那么就对应生成多条测试用例。

    如果data里放的类似是元组、列表等这样的序列类型的数据,data会把他们当成是一个整体,即一个测试数据。

    3. ddt.file_data:

    装饰测试方法。从json或yaml中加载测试数据,参数是文件名。只有以“.yml” 和 “.yaml” 结尾的文件被加载为Yaml文件。所有其他格式文件都作为json文件加载。

    4. ddt.unpack:

    装饰测试方法。作用:分割元素。传递的是复杂的数据结构时使用。

    如:添加unpack之后,ddt会自动把data中的元组或者列表对应到测试用例方法的多个参数上。字典对应到多个关键字参数上,注意字典的key和用例方法定义的参数名需要保持一致。

    三、使用示例

    1. data直接放入数值

    需要导入ddt包,然后再TestCase类上用@ddt进行装饰,测试方法上用@data()装饰。

    import unittest
    from ddt import ddt, data
    
    @ddt  # 等同于代码:MyTest = ddt(MyTest),类名传给ddt,告诉ddt这个测试用例类要使用数据驱动
    class MyTest(unittest.TestCase):
        @data('数据1', '数据2')  # 传递多个参数,一个参数作为一条测试数据被传递给下面的参数a
        # @data({"a": "1", "b": 2})  # 传递字典类的序列类型的数据,data会当作为一条数据
        # @data((1, 2))  # 传递元组,同字典
        def test(self, a):
            print(a)
    
    if __name__ == '__main__':
        unittest.main(verbosity=2)  # verbosity是一个选项,表示测试结果的信息复杂度。2: 会显示每个测试用例的相关信息
    1. 在data中传递多个参数时,输出如下:

    可以看到上面只写了1个测试方法,但是最后执行了2个用例。使用ddt后,会产生一个新的测试用例方法名:测试用例方法名_ordinal_data

    • ordinal:整数,从1开始递加。

    • data:如果传递过来的数据存在__name__属性,则data就是这个__name__值。如果未定义__name__属性,ddt会尽量将传递过来的数据转化为python标识符,作为data显示。如(3,2)就转化为3_2。需要注意的是,如果数据是字典,则这里就是字典的key。

    1. 在data中传递元组时,输出如下:

    2. data放入复杂的数据结构

    先看下面这个错误用法,运行后会报错:test01() missing 1 required positional argument: 'b'

    import unittest
    from ddt import ddt, data, unpack
    
    @ddt
    class MyTest(unittest.TestCase):
        @data([1, 2], [3, 4])  # 这里没有解包,两个列表都作为测试数据传递给a,而b没有传入任何参数,所以会报错
        def test01(self, a, b):
            print(a, b)
    
    if __name__ == '__main__':
        unittest.main(verbosity=2)

    让列表中的两个值对应到测试用例方法中的参数,加上@unpack即可,如下:

    @ddt
    class MyTest(unittest.TestCase):
        @data([1, 2], [3, 4])
        @unpack  # 有了unpack,[1,2]会被分解开,按照用例中的两个参数传递
        def test01(self, a, b):
            print(a, b)

    加入了@unpack后,如果@data中传入的是字典时,字典的key和用例方法定义的参数名需要保持一致,否则会报错。示例如下:

    @ddt
    class MyTest(unittest.TestCase):
        @data({"key1": '1', "key2": "10"}, {"key1": '2', "key2": "20"})
        @unpack  # 有了unpack,[1,2]会被分解开,按照用例中的两个参数传递
        def test01(self, key1, key2):
            print(key1, key2)

    3. fila_data传入json文件

    json文件中如果需要传入多组数据进行测试,可以写一个列表,然后列表里面包含多个json串。如下面的文件 json_file:

    [
      {
        "data": [1, 2, 3],
        "message": "good!"
      },
      {
        "data": [4, 5, 6],
        "message": "amazing!"
      }
    ]

    测试用例的方法如下:

    @ddt
    class MyTest(unittest.TestCase):
        @file_data("json_file")  # 这里没用unpack,但json的key和用例方法定义的参数名需要保持一致
        def test01(self, data, message):
            print(data, message)

    注意:json的key和用例方法定义的参数名需要保持一致

  • 相关阅读:
    使用 Redis 实现分布式锁(转载)
    使用Redis SETNX 命令实现分布式锁(转载)
    linux目录(转载)
    sleep函数作用(转)
    大数据量高并发的数据库优化(转)
    java获取request的url方法区别
    java获取request的头信息
    打分排序系统漫谈2
    打分排序系统漫谈1
    Tree
  • 原文地址:https://www.cnblogs.com/mind18/p/14646558.html
Copyright © 2020-2023  润新知