zoukankan      html  css  js  c++  java
  • Python3|ddt|unittest|浅议数据驱动测试



    1、DDT简介

    Data-Driven Tests(DDT)即数据驱动测试。它允许您通过不同的测试数据来运行同一个测试用例,使它作为多个测试用例出现。其官方文档给出的定义如下:

    DDT (Data-Driven Tests) allows you to multiply one test case by running it with different test data, and make it appear as multiple test cases.

    DDT的经典使用场景之一是:测试用例的代码不变,只有测试数据在变化。DDT作为第三方库,使用前需要先安装:

    sudo  pip3 install ddt
    
    

    2、data装饰器

    @data()是一个装饰器,它包含了您想提供给测试方法的值,个数和测试方法参数一样多。使用方法:在测试类(继承于unittest.TestCase)上面设置装饰器@ddt,在测试方法上设置装饰器@data()
    [示例1] @data

    #coding:utf-8
    import unittest
    #从ddt模块导入装饰器ddt,file_data,unpack,data
    from ddt import ddt,file_data,unpack,data
    
    @ddt
    #定义测试类BoolTest
    class BoolTest(unittest.TestCase):
        @data(1,"hello",3>2)
        def test_true_001(self,value):
            self.assertTrue(value)
        @data("",1>2,{})
        def test_false_002(self,value):
            self.assertFalse(value)
    if __name__ == "__main__":
        unittest.main()
    
    

    示例1运行结果如下:

    我们只编写了两个测试方法,但是通过6组不同的测试数据,最终可以达到运行6个测试用例的目的。这就是数据驱动测试的强大之处。再来看一个多个输入值的示例。

    @unpack 自动解压元组,列表到多个参数;字典到多个关键字参数。

    3、unpack装饰器

    [示例2] unpack dict

    #coding:utf-8
    import unittest
    #从ddt模块导入装饰器ddt,file_data,unpack,data
    from ddt import ddt,file_data,unpack,data
    #测试取绝对值函数abs()
    @ddt
    class AbsTest(unittest.TestCase):
        @data({"val":1,"res":1},
              {"val":0,"res":0},
              {"val":-1,"res":1})
        @unpack
        def test_abs(self,val,res):
            self.assertEqual(abs(val),res)
    
    
    if __name__ == "__main__":
        unittest.main()
    

    示例2运行结果:

    [示例3] unpack list

    #测试取绝对值函数abs()
    @ddt
    class AbsTest(unittest.TestCase):
        # @data({"val":1,"res":1},
        #       {"val":0,"res":0},
        #       {"val":-1,"res":1})
        @data([-1,1],[0,0],[1,1])
        @unpack
        def test_abs(self,val,res):
            self.assertEqual(abs(val),res)
    
    if __name__ == "__main__":
        unittest.main()
    

    示例3运行结果同示例2。

    4、file_data装饰器

    ddt支持从文件中加载数据,@file_data()装饰器会从json或yaml中加载数据。只有以“.yml” 和 “.yaml” 结尾的文件被加载为Yaml文件。所有其他格式文件都作为json文件加载,比如txt。修改示例3。
    abs_data.json文件位于测试用例同级目录,内容如下:

    {
      "case1":{
        "val":1,
        "res":1
      },
      "case2":{
        "val":-1,
        "res":1
      },
      "case3":{
        "val":0,
        "res":0
      }
    
    }
    
    

    [示例4] load json
    在测试方法test_abs上设置@file_data装饰器:

    #测试取绝对值函数abs()
    @ddt
    class AbsTest(unittest.TestCase):
        # @data({"val":1,"res":1},
        #       {"val":0,"res":0},
        #       {"val":-1,"res":1})
        @file_data("./abs_data.json")
        def test_abs(self,val,res):
            self.assertEqual(abs(val),res)
    
    if __name__ == "__main__":
        unittest.main()
    

    示例4运行结果:

    5、总结

    使用数据驱动思想编写测试用例有以下优势:

    • 测试代码和测试数据分开,比较灵活,易维护。
    • 在测试代码相对健壮的情况下,新增用例只需新增测试数据即可,开发难度小。
    • 避免编写大量相同的测试代码,代码复用率高。

    劣势是对测试代码的质量要求相对较高,试想如果因为测试数据的变化而需要频繁改动测试方法,那也是一件很痛苦的事情哦。关于测试数据驱动测试,有的玩法是通过从Excel加载测试数据,这一定程度上来讲也是可行的,但是碰到复杂的业务场景和测试数据比较多的情况,非常容易翻车的哦。

    (完)
    点击这里返回本篇目录

  • 相关阅读:
    Swool的安装与使用
    Laravel策略(Policy)示例
    Laravel 查询&数据库&模型
    Laravel模板事项
    Laravel验证问题记录
    每日一练:排序题:一大一小,依次类推题
    java 保留小数点后N位数(若干位),几种实现的方式总结
    java 计算器SWT/RAP(版本3)键盘鼠标兼容
    java SWT/Rap 计算器版本2(键盘鼠标兼容)
    键盘按钮keyCode大全
  • 原文地址:https://www.cnblogs.com/webDepOfQWS/p/10767790.html
Copyright © 2011-2022 走看看