聊一聊接口测试时遇到上下游依赖时该如何测试

news2025/4/18 8:46:26

目录

一、手工测试时的处理方法

1.1沟通协调法

1.2模拟数据法

二、自动化测试时的处理方法

2.1 数据关联法(变量提取)

2.2 Mock数据法

2.3自动化框架中的依赖管理

三、实施示例(以订单接口测试为例)

3.1Mock依赖接口:

3.2前置数据准备:​​​​​​​

3.3数据库直接操作:​​​​​​​

四、关键注意事项


在我们进行接口测试时,运行某个接口有的时候无法单独完成,总会用到上下游依赖,就像有一个订单系统,创建订单的接口可能依赖于用户信息和库存信息。用户信息可能来自用户服务,库存信息来自库存服务。这时候测试订单接口,就需要这些依赖的服务返回正确的数据,否则测试可能失败或者不准确。

如果这些依赖的服务在测试环境中不可用,或者数据不稳定,该怎么办呢?比如,用户服务可能因为维护无法访问,或者库存服务的数据被其他测试用例修改,导致库存数量变化,影响订单接口的测试结果。

可以模拟这些依赖的服务,也就是使用Mock或者Stub。这样,在测试订单接口的时候,不调用真实的用户服务和库存服务,而是用模拟的数据代替。这样可以避免依赖服务不可用的问题,也能控制返回的数据,确保测试的稳定性和可重复性。

一、手工测试时的处理方法

1.1沟通协调法

核心思路:通过与开发团队沟通,明确上下游接口的数据流转逻辑和依赖关系。

具体步骤:

了解依赖关系:明确上游接口生成哪些关键数据(如订单号、Token、用户ID等),下游接口需要哪些参数。

手动调用上游接口:通过工具(如Postman)先调用上游接口,记录其返回的依赖数据。

传递数据到下游接口:将上游接口返回的数据手动填入下游接口的请求参数中进行测试。

示例:

电商系统中,先调用“用户下单接口”生成订单号,再将该订单号填入“订单查询接口”的请求参数中进行测试。

1.2模拟数据法

核心思路:当无法直接调用上游接口时,手动构造或通过数据库操作生成模拟数据。

具体步骤:

直接操作数据库:在测试数据库中插入或更新下游接口所需的模拟数据(如订单号、用户ID)。

使用工具生成数据:利用工具(如Postman的预请求脚本、数据库工具)生成符合格式要求的模拟数据。

示例:

银行系统中,若无法调用“开户接口”,可在数据库中手动插入一个账户编号,直接用于“账户查询接口”的测试。

二、自动化测试时的处理方法

2.1 数据关联法(变量提取)

核心思路:通过自动化工具提取上游接口返回的数据,并将其存储为变量供下游接口使用。

工具示例:

Postman:

使用 Tests 脚本提取上游接口返回的JSON数据(如订单号),并存储为环境变量:​​​​​​​

pm.test("Extract Order ID", function () {    pm.response.json().order_id;    pm.environment.set("order_id", pm.response.json().order_id);});

在下游接口中直接引用变量:{{order_id}}。

Python(requests库):​​​​​​​

import requests# 调用上游接口获取订单号response_upstream = requests.post("https://api.example.com/create_order")order_id = response_upstream.json()["order_id"]# 将订单号传递给下游接口payload = {"order_id": order_id}response_downstream = requests.get("https://api.example.com/query_order", params=payload)

2.2 Mock数据法

核心思路:模拟上游接口的响应数据,避免因上游接口未完成或不可用导致测试阻塞。

工具与实现:​​​​​​​

MockServer/WireMock:定义模拟响应规则,例如:// 模拟用户登录接口返回TokenMockServerClient mockServer = new MockServerClient("localhost", 1080);mockServer.when(    request().withPath("/login"),    Times.unlimited()).respond(    response().withBody("{\"token\": \"mock_token_123\"}"));

Flask简易Mock服务:​​​​​​​

from flask import Flask, jsonifyapp = Flask(__name__)@app.route('/mock_data', methods=['GET'])def mock_data():    return jsonify({"user_id": "U123456"})if __name__ == '__main__':    app.run(port=5000)

2.3自动化框架中的依赖管理

核心思路:在测试框架中通过代码逻辑处理依赖关系,确保接口调用顺序和数据传递。

实现方式:

测试用例依赖标记:在测试用例中声明依赖关系(如Excel/数据库中记录依赖的Case ID)。

动态参数注入:通过代码提取依赖数据并注入到下游接口的请求参数中。​​​​​​​

#示例代码(Python):class TestOrderAPI:    def test_create_order(self):        # 调用上游接口,获取订单号        response = requests.post("/create_order")        self.order_id = response.json()["order_id"]    def test_query_order(self):        # 使用上游接口返回的订单号        response = requests.get(f"/query_order?order_id={self.order_id}")        assert response.status_code == 200

三、实施示例(以订单接口测试为例)

场景:测试创建订单接口,依赖用户服务和库存服务。

步骤:

3.1Mock依赖接口:​​​​​​​

# 使用requests-mock模拟用户服务返回200及用户数据def test_create_order(mocker):    mocker.get("http://user-service/user/123", json={"id": 123, "name": "test_user"})    mocker.post("http://inventory-service/reserve", json={"success": True})    # 调用订单接口并断言响应

3.2前置数据准备:​​​​​​​

# 测试前通过API创建用户和设置库存POST /users { "name": "test_user" } → 获取userId=123PUT /inventory/itemA { "quantity": 10 }# 执行订单测试POST /orders { "userId": 123, "item": "itemA" }# 测试后删除数据DELETE /users/123

3.3数据库直接操作:​​​​​​​

-- 测试前插入数据INSERT INTO users (id, name) VALUES (123, 'test_user');UPDATE inventory SET quantity = 10 WHERE item = 'itemA';-- 执行测试后删除DELETE FROM orders WHERE user_id = 123;DELETE FROM users WHERE id = 123;

四、关键注意事项

数据隔离:确保每个测试用例使用独立数据,避免并行测试冲突。

异常覆盖:通过Mock模拟依赖服务的异常响应(如500错误、超时),验证接口容错逻辑。

自动化清理:集成测试框架的setup/teardown机制,自动创建和清理数据。

环境策略:单元/组件测试优先使用Mock,提升速度;集成测试结合真实服务与Fake Service,验证流程正确性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2331460.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【有啥问啥】深入浅出讲解 Teacher Forcing 技术

深入浅出讲解 Teacher Forcing 技术 在序列生成任务(例如机器翻译、文本摘要、图像字幕生成等)中,循环神经网络(RNN)以及基于 Transformer 的模型通常采用自回归(autoregressive)的方式生成输出…

zk基础—zk实现分布式功能

1.zk实现数据发布订阅 (1)发布订阅系统一般有推模式和拉模式 推模式:服务端主动将更新的数据发送给所有订阅的客户端。 拉模式:客户端主动发起请求来获取最新数据(定时轮询拉取)。 (2)zk采用了推拉相结合来实现发布订阅 首先客户端需要向服务端注册自己关…

ubuntu wifi配置(命令行版本)

1、查询当前设备环境的wifi列表 nmcli dev wifi list2、连接wifi nmcli dev wifi connect "MiFi-SSID" password "Password" #其中MiFi-SSID是wifi的密码,Password是wifi的密码3、查看连接情况 nmcli dev status

Docker与Kubernetes在ZKmall开源商城容器化部署中的应用

ZKmall开源商城作为高并发电商系统,其容器化部署基于DockerKubernetes技术栈,实现了从开发到生产环境的全流程标准化与自动化。以下是核心应用场景与技术实现: 一、容器化基础:Docker镜像与微服务隔离 ​服务镜像标准化 ​分层构建…

华为AI-agent新作:使用自然语言生成工作流

论文标题 WorkTeam: Constructing Workflows from Natural Language with Multi-Agents 论文地址 https://arxiv.org/pdf/2503.22473 作者背景 华为,北京大学 动机 当下AI-agent产品百花齐放,尽管有ReAct、MCP等框架帮助大模型调用工具&#xff0…

MYSQL数据库语法补充

一,DQL基础查询 DQL(Data Query Language)数据查询语言,可以单表查询,也可以多表查询 语法: select 查询结果 from 表名 where 条件; 特点: 查询结果可以是:表中的字段…

在Windows搭建gRPC C++开发环境

一、环境构建 1. CMake Download CMake 2. Git Git for Windows 3. gRPC源码 git clone -b v1.48.0 https://github.com/grpc/grpc 进入源码目录 cd grpc 下载依赖库 git submodule update --init 二、使用CMake生成工程文件 三、使用vs2019编译grpc库文件 四、使用…

[Python] 企业内部应用接入钉钉登录,端内免登录+浏览器授权登录

[Python] 为企业网站应用接入钉钉鉴权,实现钉钉客户端内自动免登授权,浏览器中手动钉钉授权登录两种逻辑。 操作步骤 企业内部获得 开发者权限,没有的话先申请。 访问 钉钉开放平台-应用开发 创建一个 企业内部应用-钉钉应用。 打开应用…

用AbortController取消事件绑定

视频教程 React - 🤔 Abort Controller 到底是什么神仙玩意?看完这个视频你就明白了!💡_哔哩哔哩_bilibili AbortController的好处之一是事件绑定的函数已无需具名函数,匿名函数也可以被取消事件绑定了 //该代码2秒后点击失效…

this指针 和 类的继承

一、this指针 Human类的属性fishc与Human()构造器的参数fishc同名,但却是两个东西。使用this指针让构造器知道哪个是参数,哪个是属性。 this指针:指向当前的类生成的对象 this -> fishc fishc当前对象(…

无锡无人机驾驶证培训费用

无锡无人机驾驶证培训费用,随着科技的迅速发展,无人机在众多行业中发挥着举足轻重的作用。从影视制作到农业监测,再到物流运输与城市规划,无人机的应用场景不断扩展,因此越来越多的人开始意识到学习无人机驾驶技能的重…

我们如何思考AI创业投资

🎬 Verdure陌矣:个人主页 🎉 个人专栏: 《C/C》 | 《转载or娱乐》 🌾 种完麦子往南走, 感谢您的点赞、关注、评论、收藏、是对我最大的认可和支持!❤️ 声明:本文作者转载,原文出自…

LabVIEW 中数字转字符串常用汇总

在 LabVIEW 编程环境里,数字与字符串之间的转换是一项极为基础且重要的操作,广泛应用于数据处理、显示、存储以及设备通信等多个方面。熟练掌握数字转字符串的方法和技巧,对编写高效、稳定的程序起着关键作用。接下来,我们将全面深…

蓝桥杯 C/C++ 组历届真题合集速刷(二)

一、0ASC - 蓝桥云课 &#xff08;单位换算&#xff09;算法代码&#xff1a; #include <iostream> using namespace std; int main() {printf("%d",L);return 0; } 二、0时间显示 - 蓝桥云课 &#xff08;单位换算&#xff09;算法代码&#xff1a; #inclu…

【接口自动化_数据格式与类型】

在HTTP接口的自动化测试中&#xff0c;请求的数据格式和内容类型是两个密切相关但又有所区别的概念。以下是它们的分类和详细说明&#xff1a; 一、数据格式 数据格式是指请求体&#xff08;Body&#xff09;中数据的组织方式&#xff0c;常见的数据格式有以下几种&#xff1…

网络带宽测速工具选择指南iperf3 nttcp tcpburn jperf使用详解

简介 本文主要介绍内网&#xff08;局域网&#xff09;与外网&#xff08;互联网&#xff09;的网络带宽测速工具下载地址、选择指南、参数对比、基本使用。 测速工具快速选择指南 测速工具下载地址 iperf 官网下载链接&#xff1a;iperf.fr/iperf-download.php该链接提供了不…

源代码保密解决方案

背景分析 随着各行各业业务数据信息化发展&#xff0c;各类产品研发及设计等行业&#xff0c;都有关乎自身发展的核心数据&#xff0c;包括业务数据、源代码保密数据、机密文档、用户数据等敏感信息&#xff0c;这些信息数据有以下共性&#xff1a; — 属于核心机密资料&…

PyCharm使用Flask启动项目后,如何修改文件,开启启动加载或是热启动,不用重启项目,直接生效。

PyCharm使用Flask启动项目后&#xff0c;每次修改完文件比如html、py文件都要重启项目才生效&#xff0c;在测试时很不方便&#xff0c;如何设置热启动&#xff0c;修改完文件后直接生效了&#xff1f; 解决方法 1、app.py文件&#xff0c;设置debugTrue。开启调试模式。 开…

SpringCloud微服务(一)Eureka+Nacos

一、认识 微服务技术对比&#xff1a; SpringCloud&#xff1a; 版本匹配&#xff1a; 二、服务拆分以及远程调用 消费者与提供者&#xff1a; Eureka&#xff1a; 搭建EurekaServer&#xff1a; Ribbon负载均衡&#xff1a; 实现原理&#xff1a; IRule&#xff1a;规则接口…

深度学习天崩开局

李沐大神的d2l包导入&#xff0c; 这玩意需要python311版本&#xff0c;我现在版本已经313了&#xff0c;作为一个天生要强的男人&#xff0c;我是坚决不向低版本低头的。 然后我就研究啊&#xff0c;各种翻资料啊&#xff0c;然后deepseek加豆包都翻烂了&#xff0c; 最终所…