本文是学习了小二哥很二的简书,链接地址: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()