Python接口自动化测试:DDT数据驱动框架详解与实例
本文介绍如何在Python接口自动化测试中使用DDT库实现数据驱动。通过结合unittest,利用ddt.data直接传入参数或ddt.file_data读取JSON/YAML文件,实现测试代码与数据的分离。文章包含具体代码示例,展示如何处理多组测试数据、参数解包及文件读取,提升测试用例的可维护性与复用性。
在接口自动化测试场景中,单个接口往往需要覆盖正常、异常、边界值等多种用例。若手动编写大量代码仅改变参数,不仅工作量大,且测试数据与逻辑耦合会导致维护困难。采用数据驱动模式可将代码逻辑与测试数据解耦,封装代码以提高复用率,并将测试数据独立存储于本地文件或数据库中。
在Python中进行接口自动化测试时,构建自动化测试框架是首要任务。其中,结合unittest与ddt库是一个高效的选择,下文将重点介绍ddt在unittest环境下的具体应用方法。
ddt库主要提供两个方法装饰器:ddt.data用于直接传入测试数据,以及ddt.file_data用于从文件读取测试数据。
一、ddt.data(直接输入测试数据)
ddt.unpack装饰器的作用是将元组或列表中的元素解包并对应到测试函数的多个参数中。若不使用ddt.unpack,则会将整个元组或列表作为单一参数传入。
以下代码示例中,ddt.data()定义了三组测试数据。针对test_login()方法,每一组数据都会触发一次独立的用例执行。
import json
import unittest
from common.readConfig import readConfig
import requests
from ddt import ddt,data,file_data,unpack
@ddt # 在测试类前必须首先声明使用 ddt.ddt
class Mytest(unittest.TestCase):
def setUp(self):
# 获取测试接口的url
self.url = readConfig().getHttp('usercenter') + readConfig().get_UC('login')print('setup')
@data(({"isRememberMe": True ,"password": "111111","username": "root"},200),
({"isRememberMe": True, "password": "1111111", "username": "root"},406),
({"isRememberMe": True, "password": "111111", "username": "rot"},406))
@unpack
# 后台人员登录
def test_login(self,data,status):
body = json.dumps(data)
header = {"Content-Type":"application/json","Accept": "application/json","token": "1231"}
re = requests.post(self.url,data=body,headers = header,verify = False)
code = re.status_code
print(re.text,re.status_code)
# 断言
self.assertEqual(int(status),int(code))
def tearDown(self):
print('tearDown')
if __name__ == '__main__':
unittest.main()
二、ddt.file_data(参数为文件名,支持JSON或YAML格式)
当数据文件为列表时,列表中的每个值将作为测试用例的参数,并显示为测试用例方法名的后缀。若数据文件为字典,则字典的key将作为测试用例方法名的后缀,而字典的值将作为测试用例参数。下文将分别针对这两种文件类型给出示例。
新建文件testdata.json:
{
"first": ["{'isRememberMe': True,'password': '111111','username': 'root'}", "200"],
"second": ["{'isRememberMe': True, 'password': '1111111', 'username': 'root'}", "406"],
"third": ["{'isRememberMe': True, 'password': '111111', 'username': 'rot'}", "406"]
}
新建文件testdata.yaml:
first: ["{'isRememberMe': True,'password': '111111','username': 'root'}","200"]
second: ["{'isRememberMe': True, 'password': '1111111', 'username': 'root'}", "406"]
third: ["{'isRememberMe': True, 'password': '111111', 'username': 'rot'}", "406"]
新建测试脚本:
import json
import unittest
from common.readConfig import readConfig
import requests
from ddt import ddt,data,file_data,unpack
@ddt # 在测试类前必须首先声明使用 ddt.ddt
class Mytest(unittest.TestCase):
def setUp(self):
# 获取测试接口的url
self.url = readConfig().getHttp('usercenter') + readConfig().get_UC('login')print('setup')
@file_data('D:\\automation--interface\\testcase\\UC\\testdata.json')
# @file_data('D:\\automation--interface\\testcase\\UC\\testdata.yaml')
# 后台人员登录
def test_login(self,data):
body = json.dumps(eval(data[0]))
status = data[1]
header = {"Content-Type":"application/json","Accept": "application/json","token": "1231"}
re = requests.post(self.url,data=body,headers = header,verify = False)
code = re.status_code
print(re.text,re.status_code)
# 断言
self.assertEqual(int(status),int(code))
def tearDown(self):
print('tearDown')
if __name__ == '__main__':
unittest.main()
建议读者在本地环境中运行上述代码进行测试。感谢大家的学习以及对本站的支持。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









