什么是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)