• unittest的ddt数据驱动


    什么是ddt:
    ddt是ddt+unittest来进行数据处理的第三方库
    装饰器:会在你的函数运行之前运行,不会改变代码结构
    一般进行接口测试时,每个接口的传参都不止一种情况,一般会考虑正向、逆向等多种组合。所以在测试一个接口时通常会编写多条case,而这些case除了传参不同外,其实并没什么区别。这个时候就可以利用ddt来管理测试数据,提高代码复用率。
    四种模式:第一步引入的装饰器@ddt;导入数据的@data;拆分数据的@unpack;导入外部数据的@file_data
    注意:之前说用例里面不能传参数,但是使用了ddt,就可以传参了
    1、读取元组数据

    #一定要和单元测试框架一起用
    import unittest,os
    from ddt import ddt,data,unpack,file_data
    
    '''NO.1单组元素'''
    @ddt
    class Testwork(unittest.TestCase):
        
        @data(1,2,3)
        def test_01(self,value):      #value用来接收data的数据
            print(value)
    if __name__ == '__main__':
        unittest.main()
    结果:
    =>1
      2
      3
    
    '''NO.2多组未分解元素'''
    @ddt
    class Testwork(unittest.TestCase):
    
        @data((1,2,3),(4,5,6))
        def test_01(self,value):       
            print(value)
    
    if __name__ == '__main__':
        unittest.main()
    结果:
    =>(1, 2, 3)
      (4, 5, 6)
    
    '''NO.3多组分解元素'''
    @ddt
    class Testwork(unittest.TestCase):
    
        @data((1,2,3),(4,5,6))
        @unpack          #拆分数据,会根据,号拆分数据
        def test_01(self,value1,value2,value3):    #每组数据有3个值,所以设置3个形参
            print(value)
    
    if __name__ == '__main__':
        unittest.main()
    结果:
    =>1 2 3
      4 5 6
    

    2、读取列表数据

    import unittest,os
    from ddt import ddt,data,unpack,file_data
    
    @ddt
    class Testwork(unittest.TestCase):
    
        @data([{'name':'lili','age':12},{'sex':'male','job':'teacher'}])
        # @unpack
        def test_01(self,a):
            print(a)
    
    if __name__ == '__main__':
        unittest.main()
    结果:
    =>[{'name': 'lili', 'age': 12}, {'sex': 'male', 'job': 'teacher'}]
    ※上面结果可以看出:无法运用到requests数据请求中,所以不是很实用※
    
    '''NO.2多组元素分解'''
    @ddt
    class Testwork(unittest.TestCase):
    
        @data([{'name':'lili','age':12},{'sex':'male','job':'teacher'}])
        @unpack
        def test_01(self,a,b):
            print(a,b)
    
    if __name__ == '__main__':
        unittest.main()
    结果:
    =>{'name': 'lili', 'age': 12} {'sex': 'male', 'job': 'teacher'}
    ※拆分后的运行结果,不带有[ ],拆分是将列表中的2个字典拆分,所以有2个数据※
    

    通过上述了解了ddt的用法,将ddt用到单元测试的用法,见下:
    class_http_ddt.py脚本

    @ddt  #装饰测试类
    class TestHttp(unittest.TestCase):
        def setUp(self):
            print ('ceshi')
    
        @data(*test_data)    #装饰测试方法,拿到几个数据,就执行几条用例
        def test_api(self,item):  #接口用例
                res = HttpRequest().http_request(item['url'],item['data'],item['method'],getattr(GetData,'Cookie'))
                if res.cookies:
                    setattr(GetData,'Cookie',res.cookies)
                try:
                    self.assertEqual(item['expected'],res.json()['status'])
                except AssertionError as e:
                    print ('test api error is {}'.format(e))
                    raise e
                print res.json()
    

    test_suit.py脚本:

    from class_5_27.class_http_ddt import TestHttp
    suite = unittest.TestSuite()  #存储用例
    loader = unittest.TestLoader()
    suite.addTest(loader.loadTestsFromTestCase(TestHttp))
    
    #生成html报告
    with open("test_report.html","wb") as file:
        runner = HTMLTestRunner.HTMLTestRunner(
            stream = file,
            verbosity = 2,
            title = "单元测试报告",
            description = "python单元测试报告-第一次",
            tester="么么哒"
        )
        runner.run(suite)
    声明 欢迎转载,但请保留文章原始出处:) 博客园:https://www.cnblogs.com/chenxiaomeng/ 如出现转载未声明 将追究法律责任~谢谢合作
  • 相关阅读:
    day20:正则表达式
    day19:os模块&shutil模块&tarfile模块
    zynq之TF卡写入常见问题
    verilog之random
    quartus之ram的IP测试
    verilog之readmemb
    verilog之monitor
    verilog之display
    源自opencore的fifo的IP核解析
    veriog之四位全加器
  • 原文地址:https://www.cnblogs.com/chenxiaomeng/p/14836720.html
Copyright © 2020-2023  润新知