在手工或自动化接口测试过程中,当上下游接口有数据依赖时,可以采用以下方法进行处理:
一、手工测试时
1. 沟通协调法
• 与相关开发人员沟通,了解上下游接口的数据流转逻辑和依赖关系。明确哪些数据是由上游接口生成并传递给下游接口的,以及数据的格式、内容和预期值等。
• 在测试过程中,按照业务流程依次调用上游接口,获取所需数据,并手动记录下来。然后,将这些数据作为输入参数传递给下游接口进行测试。
• 例如,在一个电商系统中,用户下单接口(上游接口)生成订单号后,订单查询接口(下游接口)需要使用该订单号进行查询。测试人员可以先调用用户下单接口,获取订单号,然后再手动将订单号输入到订单查询接口进行测试。
2. 模拟数据法
• 如果无法直接调用上游接口获取数据,可以考虑使用模拟数据的方式来满足下游接口的测试需求。
• 可以通过手动创建测试数据,或者使用数据库工具等方式,在数据库中插入所需的数据。然后,在测试下游接口时,直接使用这些模拟数据作为输入参数。
• 例如,在一个银行系统中,账户查询接口(下游接口)需要使用账户编号进行查询。如果无法直接调用开户接口(上游接口)获取账户编号,可以手动在数据库中插入一个账户编号,并在测试账户查询接口时使用该编号。
二、自动化测试时
1. 数据关联法
• 使用自动化测试工具提供的数据关联功能,将上游接口返回的数据提取出来,并存储在变量中。然后,在下游接口的测试中,使用这些变量作为输入参数。
• 例如,使用 Postman 进行接口自动化测试时,可以使用 JSONPath 或正则表达式等方式提取上游接口返回的特定数据,并将其存储在环境变量或全局变量中。在测试下游接口时,引用这些变量来传递数据。
• 代码示例(以 Python 的 requests 库和 unittest 框架为例):
import requests
import unittest
class TestAPIs(unittest.TestCase):
def setUp(self):
self.base_url = "https://example.com"
def test_upstream_api(self):
response = requests.post(f"{self.base_url}/upstream_api", json={"param1": "value1"})
self.assertEqual(response.status_code, 200)
# 提取上游接口返回的数据
upstream_data = response.json()["data_key"]
# 将数据存储在类变量中,供下游接口测试使用
self.upstream_data = upstream_data
def test_downstream_api(self):
# 使用上游接口返回的数据作为下游接口的输入参数
response = requests.get(f"{self.base_url}/downstream_api?param={self.upstream_data}")
self.assertEqual(response.status_code, 200)
if __name__ == '__main__':
unittest.main()
2. 数据库操作法
• 如果上下游接口的数据都存储在数据库中,可以通过在自动化测试脚本中直接操作数据库的方式来处理数据依赖。
• 在测试开始前,可以在数据库中插入一些初始数据,以满足上游接口的测试需求。然后,在测试上游接口时,将生成的数据更新到数据库中。在测试下游接口时,直接从数据库中读取所需的数据。
• 代码示例(以 Python 的 SQLAlchemy 库为例):
from sqlalchemy import create_engine, Column, Integer, String
from sqlalchemy.orm import sessionmaker
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
class DataModel(Base):
__tablename__ = 'data_table'
id = Column(Integer, primary_key=True)
data_key = Column(String)
engine = create_engine('sqlite:///test.db')
Session = sessionmaker(bind=engine)
def setup_initial_data():
session = Session()
# 插入初始数据
initial_data = DataModel(data_key='initial_value')
session.add(initial_data)
session.commit()
session.close()
def test_upstream_api():
session = Session()
# 假设上游接口生成了新的数据并更新到数据库中
updated_data = 'updated_value'
data_row = session.query(DataModel).first()
data_row.data_key = updated_data
session.commit()
session.close()
def test_downstream_api():
session = Session()
# 从数据库中读取数据作为下游接口的输入参数
data_row = session.query(DataModel).first()
downstream_param = data_row.data_key
# 调用下游接口进行测试
response = requests.get(f"https://example.com/downstream_api?param={downstream_param}")
assert response.status_code == 200
session.close()
if __name__ == '__main__':
setup_initial_data()
test_upstream_api()
test_downstream_api()
3. 依赖注入法
• 将上游接口的调用和数据获取封装成一个独立的模块或函数,并在下游接口的测试中通过参数传递的方式将这个模块或函数注入进去。
• 这样可以在测试下游接口时,根据需要动态地获取上游接口的数据,而不是直接依赖于上游接口的执行结果。
• 代码示例(以 Python 的 pytest 框架为例):
import requests
import pytest
def get_upstream_data():
response = requests.get("https://example.com/upstream_api")
return response.json()["data_key"]
def test_downstream_api(upstream_data):
# 使用上游数据作为下游接口的输入参数
response = requests.get(f"https://example.com/downstream_api?param={upstream_data}")
assert response.status_code == 200
@pytest.fixture
def upstream_fixture():
return get_upstream_data()
if __name__ == '__main__':
pytest.main()