Mock接口测试

news2024/11/26 16:23:06

什么是mock?

  • 测试桩,模拟被测对象的返回,用于测试

  • 通常意义的mock指的就是mock server, 模拟服务端返回的接口数据,用于前端开发,第三方接口联调

为什么要mock?

1. 解决依赖问题:当我们测试一个接口或者功能模块的时候,如果这个接口或者功能模块依赖其他接口或其他模块,那么如果所依赖的接口或功能模块未开发完毕,那么我们就可以使用mock模拟被依赖接口,完成目标接口的测试。

2.单元测试:如果某个功能未开发完成,我们又要进行测试用例的代码编写,我们也可以先模拟这个功能进行测试  

3.模拟复杂业务的接口:实际工作中如果我们在测试一个接口功能时,如果这个接口依赖一个非常复杂的接口业务,那么我们完全可以使用mock来模拟这个复杂的业务接口,其实  这个和解决接口依赖是一样的原理。 

4.前后端联调:如果你是一个前端页面开发,现在需要开发一个功能:根据后台返回的状态展示不同的页面,那么你就需要调用后台的接口,但是后台接口还未开发完成,可以借助mock来模拟后台这个接口返回你想要的数据。

如何mock?

1.利用抓包工具比如fiddler

2.可以利用web框架模拟,Django Flask ---python web开发框架,Flask的特点就是,结构简单,容易入门

一:利用flask编写一个最简单的接口

安装Flask, 在dos窗口输入:pip install flask

搭建mock服务端代码:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

import random

import time

from flask import Flask,request,json

#实例化一个web服务对象

app=Flask(__name__)

#创建一个方法来处理请求

#定义一个路由--访问服务的根目录就可以得到结果

@app.route('/')

def hello():

    return '<h1>hello flask</h1>'

#构造一个接受post请求的响应

@app.route('/post',methods=['POST'])

def test_post():

    #处理接口发送过来的两个参数,将两个参数合并成一个字符串返回

    d1=request.form['d1']

    d2=request.form['d2']

    return d1+d2

if __name__ == '__main__':

    #运行服务,并确定服务运行的IP和端口

    app.run('127.0.0.1','9090')

启动mock服务端:

客户端代码:

import requests

1

2

3

4

5

6

body={

     'd1':'hi',

    'd2':'falsk12312312'

}

resp=requests.post('http://127.0.0.1:9090/post',data=body)

print(resp.text)

结果如下:

二:mock接口测试实战案例

接口文档如下:

极简交易支付接口

接口路径: /trade/purchase

请求方式: POST

请求参数:

参数

类型

是否必填

最大长度

描述

示例值

out_trade_no

String

64

商户订单号,64个符以内、可包含字母、数字、下划线;需保证在商户端不重复

20150320010101001

auth_code

String

64

支付授权码,25~30开头的长度为16~24位的数字,实际字符串长度以开发者获取的付款码长度为准

28763443825664394

subject

String

356

订单标题

Iphone6 16G

buyer_id

String

28

买家的支付宝用id,如果为空,会从传入的码值信息中获取买家 ID

2088202954065786

seller_id

String

28

如果该值为空,则默认为商户签约账号对应的支付宝用户ID

2088102146225135

total_amount

Price

11

订单总金额,单位为元,精确到小数点后两位,取值范围[0.01,100000000]

如果同时传入【可打折金额】和【不可打折金

额】,该参数可以不用传入;如果同时传入了

【可打折金额】,【不可打折金额】,【订单总金额】三者,则必须满足如下条件:【订单总金额】=【可打折金额】+【不可打折金额】

88.88 

响应参数:

请求头:键:Content-Type 值:application/json 

请求示例:

{

  'out_trade_no':'20150320010101001',

  'auth_code':'28763443825664394',

  'buyer_id':'2088202954065786',

  'seller_id':'2088102146225135',

  'subject':'Iphone6',

  'total_amount':'88.88',

} 

成功返回示例: 

{

   'code':'40004',

  'msg':'Business Failed',

  'sub_code':'ACQ.TRADE_HAS_SUCCESS',

  'sub_msg':'交易已被支付',

  'trade_no':'2013112011001004330000121536',

  'out_trade_no':'6823789339978248'

}

失败返回示例:

{'error': {'password': '密码错误'}, 'success': 'false'}

搭建mock服务端:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

import random

import time

from flask import Flask,request,json

#实例化一个web服务对象

app=Flask(__name__)

#创建一个方法来处理请求

#定义一个路由--访问服务的根目录就可以得到结果

#构造一个接受post请求的响应

#处理极简交易接口

@app.route('/trade/purchase',methods=['POST'])

def purchase():

    #拿到客户端返回的数据

    res=json.loads(request.get_data())

    out_trade_no=res['out_trade_no']

    auth_code=res['auth_code']

    data={

        'code''40004',

        'msg''Business Failed',

        'sub_code''ACQ.TRADE_HAS_SUCCESS',

        'sub_msg''交易已被支付',

        'trade_no''2013112011001004330000121536',

        'out_trade_no''6823789339978248'

    }

    #把out_trade_no改成客户端发送过来的数据

    data['out_trade_no']=out_trade_no

    data['trade_no']=time.strftime('%Y%m%d%H%M%S')+str(random.random()).replace('0.','')

    #验证授权码

    if auth_code !='28763443825664394':

        return {'coode':'50000','msg':'请求码验证失败'}

    return data

if __name__ == '__main__':

    #运行服务,并确定服务运行的IP和端口

    app.run('127.0.0.1','9090')

客户端代码:

1

2

3

4

5

6

7

8

9

10

11

12

13

#利用request发送post请求给服务端

import requests

data={

    'out_trade_no':'20150320010101001',

    'auth_code':'2876344382566439',

    'buyer_id':'2088202954065786',

    'seller_id':'2088102146225135',

    'subject':'Iphone6',

    'total_amount':'88.88',

}

resp=requests.post('http://127.0.0.1:9090/trade/purchase',json=data)

print(resp.json())

返回结果如下:

2023最新Jmeter接口测试从入门到精通(全套项目实战教程)

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

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

相关文章

Python Opencv实践 - 轮廓特征(最小外接圆,椭圆拟合)

import cv2 as cv import numpy as np import matplotlib.pyplot as pltimg cv.imread("../SampleImages/stars.PNG") plt.imshow(img[:,:,::-1])#轮廓检测 img_gray cv.cvtColor(img, cv.COLOR_BGR2GRAY) ret,thresh cv.threshold(img_gray, 127, 255, 0) contou…

Unity汉化一个插件 制作插件汉化工具

我是编程一个菜鸟&#xff0c;英语又不好&#xff0c;有的插件非常牛&#xff01;我想学一学&#xff0c;页面全是英文&#xff0c;完全不知所措&#xff0c;我该怎么办啊...尝试在Unity中汉化一个插件 效果&#xff1a; 思路&#xff1a; 如何在Unity中把一个自己喜欢的插件…

Flutter 最优秀动画库「完全商业化」,Rive 2 你全面了解过吗?

说到 rive &#xff0c;非 Flutter 开发者可能会感觉比较陌生&#xff0c;而做过 Flutter 开发的可能对 rive 会有所耳闻&#xff0c;因为 rive 在一开始叫 flare &#xff0c;是 2dimensions 公司的开源动画产品&#xff0c;在发布之初由于和 Flutter 团队有深入合作&#xff…

golang获取prometheus数据(prometheus/client_golang包)

文章目录 1. 创建链接1.1 语法1.2 完整示例 2. 简单查询2.1 语法2.2 完整示例 3. 范围值查询3.1 语法3.2 完整示例 【附官方示例】 1. 创建链接 1.1 语法 语法 func NewClient(cfg Config) (Client, error)结构体 type Config struct {Address stringClient *ht…

16-数据结构-图的存储结构

简介&#xff1a;主要为图的顺序存储和链式存储。其中顺序存储即邻接矩阵的画法以及代码&#xff0c;邻接矩阵又分为有权图和无权图&#xff0c;区别就是有数据的地方填权值&#xff0c;无数据的地方可以填0或者∞&#xff0c;而有权图和无权图&#xff0c;又细分为有向图和无向…

阿里云服务器退款政策及退款流程解析

阿里云服务器如何退款&#xff1f;云服务器在哪申请退款&#xff1f;在用户中心订单管理中的退订管理中退款&#xff0c;阿里云百科分享阿里云服务器退款流程&#xff0c;包括申请退款入口、云服务器退款限制条件、退款多久到账等详细说明&#xff1a; 目录 阿里云服务器退款…

FPGA GTH 全网最细讲解,aurora 8b/10b协议,HDMI板对板视频传输,提供2套工程源码和技术支持

目录 1、前言免责声明 2、我这里已有的 GT 高速接口解决方案3、GTH 全网最细解读GTH 基本结构GTH 发送和接收处理流程GTH 的参考时钟GTH 发送接口GTH 接收接口GTH IP核调用和使用 4、设计思路框架视频源选择silicon9011解码芯片配置及采集动态彩条视频数据组包GTH aurora 8b/10…

【Java 基础篇】深入理解 Java 内部类:嵌套在嵌套中的编程奇妙世界

在 Java 编程中&#xff0c;内部类&#xff08;Inner Class&#xff09;是一个非常强大且灵活的概念&#xff0c;它允许在一个类的内部定义另一个类。内部类可以访问外部类的成员&#xff0c;包括私有成员&#xff0c;这使得内部类在许多编程场景中都非常有用。本篇博客将详细介…

js如何实现数组去重的常用方法

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 使用 Set&#xff08;ES6&#xff09;⭐ 使用 filter 和 indexOf⭐ 使用 reduce⭐ 使用对象属性⭐ 使用 includes 方法&#xff08;ES6&#xff09;⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得点击上方…

$ref属性的介绍与使用

在Vue.js中&#xff0c;$ref是一个特殊的属性&#xff0c;用于访问Vue组件中的DOM元素或子组件实例。它允许你直接访问组件内部的DOM元素或子组件&#xff0c;并且可以在需要时进行操作或修改。以下是有关$ref的详细介绍和示例演示&#xff0c;给大家做一个简单的介绍和概念区分…

库中是如何实现string类的?

&#x1f388;个人主页:&#x1f388; :✨✨✨初阶牛✨✨✨ &#x1f43b;推荐专栏1: &#x1f354;&#x1f35f;&#x1f32f;C语言初阶 &#x1f43b;推荐专栏2: &#x1f354;&#x1f35f;&#x1f32f;C语言进阶 &#x1f511;个人信条: &#x1f335;知行合一 &#x1f…

如何查看B站UP主数据?如何看懂B站数据?

bilibili是独特且稀缺的PUGC视频社区&#xff0c;拥有浓厚社区氛围的视频社区。有别于短视频&#xff0c;PUGC视频创作门槛高&#xff0c;视频内容更充实&#xff0c;bilibili是PUGC视频行业的领跑者&#xff0c;同时&#xff0c;bilibili拥有社区产品特有的高创作渗透率和高互…

SQL SERVER 如何实现UNDO REDO 和PostgreSQL 有近亲关系吗

开头还是介绍一下群&#xff0c;如果感兴趣PolarDB ,MongoDB ,MySQL ,PostgreSQL ,SQL Server&#xff0c;Redis &#xff0c;Oracle ,Oceanbase 等有问题&#xff0c;有需求都可以加群群内有各大数据库行业大咖&#xff0c;CTO&#xff0c;可以解决你的问题。加群请加微信号 l…

分类任务评价指标

分类任务评价指标 分类任务中&#xff0c;有以下几个常用指标&#xff1a; 混淆矩阵准确率&#xff08;Accuracy&#xff09;精确率&#xff08;查准率&#xff0c;Precision&#xff09;召回率&#xff08;查全率&#xff0c;Recall&#xff09;F-scorePR曲线ROC曲线 1. 混…

配置Jenkins

主要是配置Jenkins和jdk,maven的插件

Spring Cloud Alibaba Nacos配置导入问题解决方案

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

论文复现--lightweight-human-pose-estimation-3d-demo.pytorch(单视角多人3D实时动作捕捉DEMO)

分类&#xff1a;动作捕捉 github地址&#xff1a;https://github.com/Daniil-Osokin/lightweight-human-pose-estimation-3d-demo.pytorch 所需环境&#xff1a; Windows10&#xff0c;conda 4.13.0&#xff1b; 目录 conda环境配置安装Pytorch全家桶安装TensorRT&#xff08;…

[数据集][目标检测]裸土识别裸土未覆盖目标检测数据集VOC格式857张2类别

数据集格式&#xff1a;Pascal VOC格式(不包含分割路径的txt文件和yolo格式的txt文件&#xff0c;仅仅包含jpg图片和对应的xml) 图片数量(jpg文件个数)&#xff1a;857 标注数量(xml文件个数)&#xff1a;857 标注类别数&#xff1a;2 标注类别名称:["luotu","n…

Python网络爬虫中这七个li标签下面的属性值,不是固定的,怎样才能拿到他们的值呢?...

点击上方“Python爬虫与数据挖掘”&#xff0c;进行关注 回复“书籍”即可获赠Python从入门到进阶共10本电子书 今 日 鸡 汤 愚以为宫中之事&#xff0c;事无大小&#xff0c;悉以咨之&#xff0c;然后施行&#xff0c;必能裨补阙漏&#xff0c;有所广益。 大家好&#xff0c;我…

Java8实战-总结21

Java8实战-总结21 使用流归约元素求和无初始值 最大值和最小值 使用流 归约 到目前为止&#xff0c;见到过的终端操作都是返回一个boolean(allMatch之类的)、void(forEach)或optional对象(findAny等)。也见过了使用collect来将流中的所有元素组合成一个List。 如何把一个流中…