Python接口自动化测试:DDT数据驱动框架详解与实例

雨后青山
雨后青山
发布时间:2026-10-13| 4人浏览过
原创

本文介绍如何在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()

建议读者在本地环境中运行上述代码进行测试。感谢大家的学习以及对本站的支持。

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。