接口测试(Python)之DDT
本文是学习了小二哥很二的简书,链接地址:https://www.jianshu.com/p/78998bcf3e05
一、安装ddt模块
1 pip install ddt
ddt有四种模式:引入装饰器@ddt;导入数据@data;拆分数据@unpack;导入外部数据@file_data
二、参数化实现的方式
1、读取元组数据
1 #一定要和单元测试框架一起用 2 import unittest,os 3 from ddt import ddt,data,unpack,file_data 4 5 '''NO.1单组元素''' 6 @ddt 7 class Testwork(unittest.TestCase): 8 9 @data(1,2,3) 10 def test_01(self,value): #value用来接收data的数据 11 print(value) 12 if __name__ == '__main__': 13 unittest.main() 14 结果: 15 =>1 16 2 17 3 18 19 '''NO.2多组未分解元素''' 20 @ddt 21 class Testwork(unittest.TestCase): 22 23 @data((1,2,3),(4,5,6)) 24 def test_01(self,value): 25 print(value) 26 27 if __name__ == '__main__': 28 unittest.main() 29 结果: 30 =>(1, 2, 3) 31 (4, 5, 6) 32 33 '''NO.3多组分解元素''' 34 @ddt 35 class Testwork(unittest.TestCase): 36 37 @data((1,2,3),(4,5,6)) 38 @unpack #拆分数据 39 def test_01(self,value1,value2,value3): #每组数据有3个值,所以设置3个形参 40 print(value) 41 42 if __name__ == '__main__': 43 unittest.main() 44 结果: 45 =>1 2 3 46 4 5 6
2、读取列表数据
1 import unittest,os 2 from ddt import ddt,data,unpack,file_data 3 4 '''NO.1多组元素未分解''' 5 @ddt 6 class Testwork(unittest.TestCase): 7 8 @data([{'name':'lili','age':12},{'sex':'male','job':'teacher'}]) 9 def test_01(self,a): 10 print(a) 11 12 if __name__ == '__main__': 13 unittest.main() 14 结果: 15 =>[{'name': 'lili', 'age': 12}, {'sex': 'male', 'job': 'teacher'}] 16 ※上面结果可以看出:无法运用到requests数据请求中,所以不是很实用※ 17 18 19 '''NO.2多组元素分解''' 20 @ddt 21 class Testwork(unittest.TestCase): 22 23 @data([{'name':'lili','age':12},{'sex':'male','job':'teacher'}]) 24 @unpack 25 def test_01(self,a,b): 26 print(a,b) 27 28 if __name__ == '__main__': 29 unittest.main() 30 结果: 31 =>{'name': 'lili', 'age': 12} {'sex': 'male', 'job': 'teacher'} 32 ※拆分后的运行结果,不带有[ ],拆分是将列表中的2个字典拆分,所以有2个数据※
3、读取字典数据
1 import unittest,os 2 from ddt import ddt,data,unpack,file_data 3 4 '''※字典的读取比较特殊,因为在拆分的时候,形参和实参的key值要一致,否则就报错※''' 5 6 '''NO.1单组数据未分解''' 7 @ddt 8 class Testwork(unittest.TestCase): 9 10 @data({'name':'lili','age':'16'},{'sex':'female','job':'nurser'}) 11 def test_01(self,a): 12 print(a) 13 14 if __name__ == '__main__': 15 unittest.main() 16 结果: 17 =>{'name': 'lili', 'age': '16'} 18 {'sex': 'female', 'job': 'nurser'} 19 ※以上运行的结果数据,就可以用来作为requests的请求参数~!※ 20 21 22 '''NO.2多数据拆分,重点来了''' 23 @ddt 24 class Testwork(unittest.TestCase): 25 26 @data({'name':'lili','age':'16'},{'name':'female','age':'nurser'}) 27 @unpack 28 def test_01(self,name,age): 29 print(name,age) 30 31 if __name__ == '__main__': 32 unittest.main() 33 结果: 34 =>lili 16 35 female nurser 36 ※重点来了:首先结果展示的数据是字典里的value,没有打印key的值;其次@data里的数据key值和def方法里的形参名称一定要一致,否则,打印的时候,就会报莫名的参数错误。※
4、读取json文件数据
1 # data_json.json文件 2 { 3 "test_case1": { 4 "key": "value1", 5 "status_code": 200 6 }, 7 "test_case2": { 8 "key": "value2", 9 "status_code": 200 10 }, 11 "test_case3": { 12 "key": "value3", 13 "status_code": 200 14 } 15 } 16 17 18 # python读取json文件 19 @ddt 20 class InterfaceTest(unittest.TestCase): 21 22 def setUp(self): 23 self.url = "http://httpbin.org/get" 24 25 def tearDown(self): 26 print(self.result) 27 28 @file_data("data_json.json") #如不在同一级目录下需另做处理 29 def test_get_request(self, key, status_code): 30 r = requests.get(self.url, params={"key": key}) 31 self.result = r.json() 32 self.assertEqual(r.status_code, status_code) 33 34 if __name__ == '__main__': 35 unittest.main()