咨询QQ:2083503238、1684129674、480934277(请勿重复咨询) 咨询微信:qiangfans
接口测试之DDT,纯代码实战,学起来
- 2020-12-09 09:50:00
- 韩小北
- 原创 972 投稿得红包
点击链接加入群138269539(全国招聘信息、免费公开课、视频应有尽有):https://jq.qq.com/?_wv=1027&k=5q0IklJ 更多内容可以关注公众号:测试帮日记
DDT,即数据驱动测试,简单的理解为数据的改变从而驱动自动化测试的执行,最终引起测试结果的改变。使用外部数据源实现对输入输出与期望值的参数化,避免在测试中使用硬编码的数据。
一、安装ddt模块
pip install ddt
ddt有四种模式:引入装饰器@ddt;导入数据@data;拆分数据@unpack;导入外部数据@file_data
二、参数化实现的方式
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
'''NO.1多组元素未分解'''
@ddt
class Testwork(unittest.TestCase):
@data([{'name':'lili','age':12},{'sex':'male','job':'teacher'}])
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个数据※
3、读取字典数据
import unittest,os
from ddt import ddt,data,unpack,file_data
'''※字典的读取比较特殊,因为在拆分的时候,形参和实参的key值要一致,否则就报错※'''
'''NO.1单组数据未分解'''
@ddt
class Testwork(unittest.TestCase):
@data({'name':'lili','age':'16'},{'sex':'female','job':'nurser'})
def test_01(self,a):
print(a)
if __name__ == '__main__':
unittest.main()
结果:
=>{'name': 'lili', 'age': '16'}
{'sex': 'female', 'job': 'nurser'}
※以上运行的结果数据,就可以用来作为requests的请求参数~!※
'''NO.2多数据拆分,重点来了'''
@ddt
class Testwork(unittest.TestCase):
@data({'name':'lili','age':'16'},{'name':'female','age':'nurser'})
@unpack
def test_01(self,name,age):
print(name,age)
if __name__ == '__main__':
unittest.main()
结果:
=>lili 16
female nurser
※重点来了:首先结果展示的数据是字典里的value,没有打印key的值;其次@data里的数据key值和def方法里的形参名称一定要一致,否则,打印的时候,就会报莫名的参数错误。※
4、读取json文件数据
# data_json.json文件
{
"test_case1": {
"key": "value1",
"status_code": 200
},
"test_case2": {
"key": "value2",
"status_code": 200
},
"test_case3": {
"key": "value3",
"status_code": 200
}
}
# python读取json文件
@ddt
class InterfaceTest(unittest.TestCase):
def setUp(self):
self.url = "http://httpbin.org/get"
def tearDown(self):
print(self.result)
@file_data("data_json.json") #如不在同一级目录下需另做处理
def test_get_request(self, key, status_code):
r = requests.get(self.url, params={"key": key})
self.result = r.json()
self.assertEqual(r.status_code, status_code)
if __name__ == '__main__':
unittest.main()