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)
posted @ 2021-06-01 12:31  陈晓猛  阅读(161)  评论(0编辑  收藏  举报