接口测试入门实践

简单接口搭建(表单/REST)

五步教会你写接口

首先要安装flask包: pip install flask

  1. 从flask中导入Flask类和request对象: from flask import Flask, request
  2. 从当前模块实例化出一个Flask实例:app=Flask(__name__)
  3. 编写一个函数来处理请求
    1. 从请求对象中获取数据:a=request.values.get("a");b=request.values.get("b")
      • request.params: 字典格式,存储请求中的url参数
      • request.form: 字典格式,存储请求中的表单数据
      • request.values: 字典格式, 包含params和form中的值
      • request.json: 字典格式, 存储json类型的请求数据, 如果请求类型非json, 值为空
    2. 进行业务处理: sum = int(a) + int(b)
    3. 组装并返回响应数据: return str(sum) # http一般使用字符串传输数据
  4. 为接口指定接口地址和接受的方法:@app.route("/add/", methods=["GET"]) # 写到函数上面(装饰器)
  5. 运行接口:
    最后添加:
if __name__ == "__main__":
app.run()

保存为***.py, 打开命令行,进入add.py所在目录,运行python ***.py(名称可以自定义)

完整代码

# 1. 导入包 
from flask import Flask, request
# 2. 实例化一个
app = Flask(__name__)
# 3. 编写一个接口处理方法
@app.route("/add/", methods=["GET","POST"]) # 4. 挂载路由(指定接口的url路径), 声明接口接受的方法
def add():  # 3.1 从请求中获取参数# request.values  {"a": "1", "b": "2"}a = request.values.get("a")b = request.values.get("b")# 3.2 业务操作sum = int(a) + int(b)# 3.3 组装响应并返回return str(sum)# 5. 运行接口
if __name__ == '__main__':app.run() # 默认5000端口,可以指定端口app.run(port=50001)

运行代码:

在浏览器窗口输入或者在Postman中输入:

http://localhost:5000/add/?a=1&b=2

访问结果:

REST类型接口实现

代码:

from flask import Flask, request, jsonifyapp = Flask(__name__)@app.route("/api/sub/", methods=["POST"])
def sub():if not request.json: # 如果请求数据类型非jsonreturn jsonify({"code": "100001", "msg": "请求类型错误", "data": None})if not "a" in request.json or not "b" in request.json: # 如果参数中没有a或者没有breturn jsonify({"code": "100002", "msg": "参数缺失", "data": None})a = request.json.get("a")b = request.json.get("b")result = str(float(a) - float(b)) # 使用float支持浮点数相减return jsonify({"code": "100000", "msg": "成功", "data": result}) # 使用jsonify将字典数据转换为json类型的相应数据if __name__ == '__main__':app.run()
使用Postman测试接口(Form/Json)
  1. 打开 Postman 应用。

  2. 创建一个新的请求:

    • 点击 Postman 左上角的 "+ New" 按钮来创建一个新的请求。
    • 给请求起一个名称,例如 "Subtract Numbers"。
  3. 配置请求参数:

    • 在请求的 URL 地址栏中输入接口的完整路径,例如 http://localhost:5000/api/sub/
    • 在请求方法下拉菜单中选择 "POST"。
    • 在 "Body" 选项卡中选择 "raw" 并选择数据格式为 "JSON (application/json)"。
    • 在请求体中输入 JSON 数据,例如:
      {"a": 5,"b": 2
      }
      

    • 发送请求:

      • 点击 Postman 左上角的 "Send" 按钮以发送请求。
    • 获取响应:

      • 在 Postman 中,您将会在下方的响应区域看到来自应用的响应。
      • 响应应该显示为 {"code": "100000", "msg": "成功", "data": "3.0"},其中 "data" 的值是参数 "a" 减去参数 "b" 的结果。
编写接口文档

接口测试基础

接口测试概念

接口测试是测试系统组件间接口的一种测试。
接口测试主要用于检测外部系统与系统之 间以及内部各个子系统之间的交互点。测试的重点是要检查数据的交换,传递和控制管理过 程,以及系统间的相互逻辑依赖关系等。

接口测试目的
  • 核心:保证系统的稳定
  • 手段:持续集成
  • 目的:提高测试效率,提升用户体验,降低产品研发成本
接口测试一般流程
  • 列出需求
  • 安排资源,编写接口用例 -> 用例评审
  • 编写接口测试代码 -> 代码评审codeReview
  • 执行接口测试
接口测试关注点
  • 功能:功能实现,实现与设计一致, 接口通过性测试
  • 健壮性: 边界值,容错性
  • 性能: 并发及压测
  • 稳定性: 长期运行的稳定性
  • 安全性: SQL注入, session依赖, 数字签名, http接口的安全性
常见接口种类
  • Http/Https接口: 通过http/https协议传送接口数据(通常按字符串/二进制传输), 如常见的网页表单, https安全性更好
  • RESTful Api: REST表述性状态传递. 一种设计风格,基于http/https协议, 把一切接口视为资源, 接口要分版本,在统一的域名下管理, 不同的方法(get/post..)做不同的事,通常请求及响应使用json格式
  • Web Service: SOAP简单面向对象协议, 基于http实现的一种RPC方案.接口返回一些对象,可以直接通过操作对象,实现我们需要的业务处理.使用xml格式传输数据
  • RPC接口: RPC为远程方法调用, 有不同的实现方案,基于TCP/Http协议的都有. RPC可以想我们本地导入和调用对象一样使用. Dubbo接口也是一种RPC接口.
常见接口数据类型
  • 请求数据类型(Content-Type):
    • application/x-www-form-urlencoded: 常规只有文本的网页表单
    • application/json: RESTful Api常用格式, 结构清晰, 含有多层嵌套
    • multipart/form-data: 既有文本,又有上传文件或富文本框的混合数据表单
    • text/xml: xml格式, RPC接口常用格式
  • 响应数据类型
    • string/html: 返回字符串或网页源码
    • json: RESTful Api常用响应格式, 结构清晰
    • xml: RPC接口常用格式
常见接口安全验证方式
  • Auth_1.0/Auth_2.0: 通用接口授权方式
  • Session依赖: 需要登录之后才能进行接口操作
  • Token验证: 先要使用自己的appid/appsecret通过获取token接口验证身份获取一个token(令牌,有一定有效期), 然后带着token访问接口
  • 数字签名: 将原本的参数按一定规则进行组合,配合时间戳或appsecret, 通过加密算法生成一个签名sign, 携带签名进行接口请求
常见接口请求方法
  • GET: 获取资源
  • POST: 修改资源
  • PUT: 上传资源
  • DELETE: 删除资源
  • HEAD: 只请求页面首部
  • PATCH: 补丁
  • OPTIONS: 运行客户端查看服务器性能
    ......
常见状态码(RESTful规范)
  • 200系: 成功
    • 200 OK - [GET]:获取资源成功
    • 201 CREATED - [POST/PUT/PATCH]:创建/修改成功
    • 202 Accepted - [*]:任务接受
    • 204 NO CONTENT - [DELETE]:删除成功
  • 300系: 重定向
    • 301 Moved Permanently: 永久重定向
    • 302 Found: 临时重定向
  • 400: 资源错误
    • 400 INVALID REQUEST - [POST/PUT/PATCH]:用户请求错误
    • 401 Unauthorized - [*]:没有权限(鉴权失败, 接口层)
    • 403 Forbidden - [*] 资源禁止访问(服务器层,没有访问权限)
    • 404 NOT FOUND - [*]:资源不存在
    • 405 Method Not Allowd: 访问的方法不允许, 如用POST访问只支持GET请求的接口
    • 406 Not Acceptable - [GET]:用户请求的格式不可得(比如用户请求JSON格式,但是只有XML格式)
    • 410 Gone -[GET]:资源被永久删除
    • 422 Unprocesable entity - [POST/PUT/PATCH] 当创建对象时,发生验证错误
  • 500系: 服务器内部错误(接口崩溃或有Bug)
    • 500 INTERNAL SERVER ERROR - [*]:服务器发生错误
接口业务类型
  • 返回数据型接口: 只从数据库读取数据
  • 业务操作型接口: 需要写数据库(接口测试需要要涉及参数化或环境清理)

快速上手接口测试

获取接口文档
  • Wiki
  • Word文档
  • Postman导出
  • 抽象接口定义
  • 接口管理平台
接口文档分析
  • 功能分析: 是否能满足业务(是否缺少某个前端需要的参数), 是否能满足所有业务场景(是否有漏开发接口, 比如只开发了单品接口,没开发套餐接口)
  • 设计分析: 是否有不规范字段(如,nickname, passwd);不规范格式(如sex,用男,女而不是1,2);是否有易混淆字段(如amount和total);是否有单词拼错;是否有和数据库字段对应但名称不一样的(易错)
  • 接口分析: 协议类型(http要考虑安全);请求方法(是否规范);请求编码格式(表单/Json/xml, 很多接口文档不声明,导致测试调试不通);接口授权方式;接口业务类型(关系到是否需要做参数化或环境清理); 返回值类型及结构(关系到怎么断言)
  • 接口依赖: 需要什么环境准备和业务场景, 依赖那些接口, 有那些动态数据, 预备环境怎么保障
  • 参数分析: 各个参数的参数类型,组成规则,是否允许不传,是否可以为空, 是否允许多传参
  • 业务分析: 如price字段必须和数据库中的商品的price字段一致,才能校验通过
  • 非功能性: 接口的技术实现方案是否合理, 能否满足高并发的性能要求, 边界值/极限值的处理是否合适, 是否前后端都有数据格式校验等(如精确度为秒级的订单号生成器,在高并发下会导致生成同一订单号的问题)
  • 其他: 如反爬,对headers的一些限制和校验, ip等限制
编写接口用例

Excel/TestLink/禅道

  • 单接口用例: 正常数据/边界数据/异常数据(健壮性)/并发(一致性)/性能/安全性(抓包截取伪造/SQL注入/跨域请求)
  • 场景用例: 列出常见的用户场景, 用接口进行覆盖, 业务场景压测(寻找某个环节的性能瓶颈)
TestCaseUrlMethodDataTypeabExceptedActualStatus
test_add_normal/api/add/GETUrl358
test_add_zero/api/add/POSTFORM000
test_add_negetive/api/add/POSTFORM-352
test_add_float/api/add/POSTFORM3.25.28.4
test_add_null/api/add/POSTFORM0
执行接口测试
  • Postman: 功能调试
  • Jmeter: 性能

接口自动化实践

五步教会你写接口自动化用例

需要安装三方包:requests pytest pytest-htmlpip install requests pytest pytest-html

  1. 导入requests模块
    import requests
  2. 组装请求参数和数据
    url = 'http://127.0.0.1:5000/add/'
    params = {"a":3, "b":5} # get请求url参数, 字典格式
    data = {"a":3, "b":5} # post请求请求数据, 字典格式
  3. 发送请求得到response对象
    resp = requests.get(url=url, params=params)
    resp = requests.post(url=url,data=data)
  4. 解析response对象
    • resp.text # 获取响应文本
  5. 断言结果
    assert resp.text == '8'
    完整代码:
# 1. 导入包
import requestsbase_url = "http://127.0.0.1:5005"# 2. 组装请求
def test_add_normal():# url  字符串格式url = base_url + "/add/"# data {} 字典格式data = {"a": "1", "b": "2"}# 3. 发送请求,获取响应对象response = requests.post(url=url, data=data)
# 4. 解析响应
# 5. 断言结果assert response.text == '3'

运行代码并在浏览器输入:

http://127.0.0.1:5005/add/
REST类接口自动测试方法

请求格式为json

三处不同:

  1. 必须通过headers指定内容类型为application/json: ```headers=
  2. 请求数据要转化为字符串: data=json.dumps(data) (使用json.dumps需要import json)
  3. json格式的响应数据,在接口调试通过和稳定的情况下可以使用response.json()解析为字典格式,进行断言

完整代码:

# 1. 导入包
import requests
import jsonbase_url = "http://127.0.0.1:5005"def test_sub_normal():url = base_url + "/api/sub/"headers = {"Content-Type": "application/json"} # 1. 必须通过headers指定请求内容类型为jsondata = {"a": "4", "b": "2"}data = json.dumps(data) # 2. 序列化成字符串response = requests.post(url=url, headers=headers, data=data)# 3. 响应解析 # 响应格式为: {"code":"100000", "msg": "成功", "data": "2"}resp_code = response.json().get("code") resp_msg = response.json().get("msg")resp_data = response.json().get("data")# 断言assert response.status_code == 200assert resp_code == "100000"assert resp_msg == "成功"assert resp_data == "2"

访问:在浏览器的地址栏中输入接口的完整URL,包括协议(通常是HTTP或HTTPS)、主机名或IP地址、端口号和路径。

http://127.0.0.1:5005/api/sub/

补充1: 感受Python黑科技之exec()动态生成用例:

数据文件: test_add_data.xls

TestCaseUrlMethodDataTypeabExceptedActualStatus
test_add_normal/api/add/GETUrl358
test_add_zero/api/add/POSTFORM000
test_add_negetive/api/add/POSTFORM-352
test_add_float/api/add/POSTFORM3.25.28.4
test_add_null/api/add/POSTFORM0

import requests
import xlrdbase_url = 'http://127.0.0.1:7890'# 1.打开excel
wb = xlrd.open_workbook("test_add_data.xls")
# 2. 获取sheet
sh = wb.sheet_by_index(0)  # wb.sheet_by_name("Sheet1")
# 行数 sh.nrows 列数 sh.ncols
# 获取单元格数据
# print(sh.cell(1,0).value)
# print(sh.nrows)
tpl = '''def {case_name}():url = base_url + '/add/'data = {{"a": "{a}", "b":"{b}"}}response = requests.get(url=url, data=data)assert response.text == '{expected}'
'''for row in range(1, sh.nrows):case_name = sh.cell(row,0).valuea = sh.cell(row, 4).valueb = sh.cell(row, 5).valueexpected = sh.cell(row, 6).valuecase = tpl.format(case_name=case_name, a=a, b=b, expected=expected)exec(case)

这个得需要调试,有的电脑可能一直提示拒绝连接

解决办法如下:

我的默认端口:7890

动态生成的用例支持pytest发现和执行

自动化接口用例运行
  1. 将自动化测试用例保存为test*.py,一个文件里可以写多个用例, 如上面两个接口保存为test_user.py
  2. 在自动化用例脚本所在目录打开命令行, 运行pytest(运行所有test开头的.py用例)或pytest test_user.py(只运行该脚本中用例)
  3. pytest一些参数
    • -q: 安静模式(不显示环境信息) pytest -q test_user.py
    • --html=report.html:执行完生成report.html报告(文件名可以自己指定)pytest test_user.py --html=test_user_report.html
    • --resultlog=test.log: 执行完成生成执行结果log文件pytest test_user.py --resultlog=run.log

requests库详解

请求方法
  • requests.get()
  • requests.post()
  • requests.delete()
  • .....
  • requests.session() # 用来保持session会话,如登录状态
请求参数
  • url: 接口地址, str url="http://127.0.0.1:5000/add/"
  • headers: 请求头, dict headers={"Content-Type": "application/json"}
  • params: url参数, dict params={"a":"1":"b":"2"}
  • data: 请求数据, dict data={"a":"1":"b":"2"}
  • files: 文件句柄, dict files={"file": open("1.jpg")}
  • timeout: 超时时间,单位s, str, 超过时间会报超时错误```requests.get(url=url,params=params,timeout=10)
响应解析
  • resp: 响应对象
  • resp.status_code: 响应状态码
  • resp.text # 响应文本
  • resp.json() # 响应转化为json对象(字典)-慎用:如果接口出错或返回格式不是json格式,使用这个方法会报错
  • resp.content # 响应内容, 二进制类型

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

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

相关文章

红黑树(有图解)

目录 介绍 概念 性质 模拟实现 结点定义 插入 保证平衡的原因 一般情况 特殊情况(uncle为黑) uncle不存在 旋转方式 右旋 迭代器 -- 代码 介绍 概念 红黑树是一种自平衡的二叉搜索树 它是在每个节点上引入额外的颜色信息,通过对任何一条从根到叶子的路径…

基于Dijkstra、A*和动态规划的移动机器人路径规划(Matlab代码实现)

💥💥💥💞💞💞欢迎来到本博客❤️❤️❤️💥💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑…

优先级队列的模拟实现

目录 1. 优先级队列的概念 1.1堆的概念 1.2堆的性质 1.3堆的存储方式 2. 堆的创建 2.1堆的创建代码解析 2.2建堆的时间复杂度 2.3堆的插入 2.4 堆的删除 2.5常见习题 1. 优先级队列的概念 队列是一种先进先出 (FIFO) 的数据结构 ,但有些情况下, 操作的数…

Windows下载AOSP

关于repo repo只是谷歌做的,方便下载安卓源码的工具,本质上是对下载清单进行批量处理,然后使用git克隆。 在windows上下载源码只需要自己处理即可。 具体做法 首先使用git克隆安卓源码清单 git clone https://mirrors.tuna.tsinghua.edu.…

C# 画参数可调调幅波

参阅此, 使用VC输出调幅波的数值和波形_c如何显示下位机传输过来的频谱信号 csdn_bcbobo21cn的博客-CSDN博客 用winform做一下; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Dra…

【计算机网络】HTTP协议详解(举例解释,超级详细)

文章目录 一、HTTP协议简单介绍 1、1 什么是HTTP协议 1、2 再次理解“协议” 二、HTTP请求 2、1 HTTP的工作过程 2、1、1 demo代码 2、2 URL 介绍 2、2、1 urlencode 和 urldecode 2、3 HTTP 请求格式 三、HTTP响应 3、1 响应demo 3、2 HTTP 响应格式 四、HTTP 请求和响应中的…

【小尘送书-第六期】《巧用ChatGPT轻松玩转新媒体运营》AI赋能运营全流程,帮你弯道超车、轻松攀登运营之巅

大家好,我是小尘,欢迎你的关注!大家可以一起交流学习!欢迎大家在CSDN后台私信我!一起讨论学习,讨论如何找到满意的工作! 👨‍💻博主主页:小尘要自信 &#x1…

游戏逆向中的 NoClip 手段和安全应对方式

文章目录 墙壁边界寻找碰撞 NoClip 是一种典型的黑客行为,允许你穿过墙壁,所以 NoClip 又可以认为是避免碰撞体积的行为 墙壁边界 游戏中设置了碰撞体作为墙壁边界,是 玩家对象 和墙壁发生了碰撞,而不是 相机 玩家对象有他的 X…

8、Nacos服务注册服务端源码分析(七)

本文收录于专栏 Nacos 中 。 文章目录 前言确定前端路由CatalogController.listDetail()ServiceManager总结 前言 前文我们分析了Nacos中客户端注册时数据分发的设计链路,本文根据Nacos前端页面请求,看下前端页面中的服务列表的数据源于哪里。 确定前端…

【数据结构】红黑树(C++实现)

​ ​📝个人主页:Sherry的成长之路 🏠学习社区:Sherry的成长之路(个人社区) 📖专栏链接:数据结构 🎯长路漫漫浩浩,万事皆有期待 上一篇博客:【数据…

类加载机制

类加载运行全过程 当我们用java命令运行某个类的main函数启动程序时,首先需要通过类加载器把主类加载到 JVM。 public class Math {public static final int initData 666;public static User user new User();public int compute() { //一个方法对应一块栈帧内…

Docker部署Nginx-常用命令

1.拉取 docker pull nginx 2. 查看镜像 docker images 3.保存镜像 docker save -o nginx.tar nginx:latest 4.删除镜像 docker rmi nginx:latest 5. 加载镜像 docker load -i nginx.tar 6. 运行Nginx docker run -d --name nginx -p 80:80 nginx 7.停掉Nginx容器 docker stop n…

Blender 导出 fbx 到虚幻引擎中丢失材质!!!(使用Blender导出内嵌材质的fbx即可解决)

目录 0 引言1 Blender导出内嵌纹理的fbx模型 0 引言 我在Blender处理了一些fbx模型后再次导出到UE中就经常出现,材质空白的情况(如下图所示),今天终于找到问题原因,记录下来,让大家避免踩坑。 其实原因很简…

弧度、圆弧上的点、圆的半径(r)、弧长(s)之间的关系

要计算弧度和圆弧上的点,需要知道以下几个要素: 圆的半径(r):即圆的中心到圆周上任意一点的距离。 弧长(s):从圆周上的一个点到另一个点所经过的弧长。 弧度(θ&#x…

【chainlit】使用chainlit部署chatgpt

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kuan 的首页,持续学…

HCQ1-1300-D【高速输入】

因为我的PLC固件比较旧。所以有些限制。【比如:编译不报错,下载PLC程序就报故障】我的PLC的高速输入类型只能是【hsi_ref】 所以,程序添加的高速输入模块只能是【1.0.1.0】版本 如果固件版本低,看下固件能支持的类型。选错的话&am…

串口数据包收发

数据包 把属于同一批的数据进行打包和分割,方便接收方进行识别 HEX数据包 思路:一个数据规定四个字节,以0xFF为包头,0xFE为包尾,当检测到0xFF时,接下来四个数据就是数据,接收到0xFE时&#x…

FFMPEG 视频类过滤器学习整理

addroi 作用 在视频帧上标记一块感兴趣的区域。 帧数据被原封不动地传递,但元数据被附加到帧,指示可能影响后续编码行为的感兴趣区域。可以通过多次应用过滤器来标记多个区域。 参数 qoffset: 应用在此区域的量化偏移。 参数范围:-1 ~ …

【JVM】第五篇 垃圾收集器G1和ZGC详解

导航 一. G1垃圾收集算法详解1. 大对象Humongous说明2. G1收集器执行一次GC运行的过程步骤3. G1垃圾收集分类4. G1垃圾收集器参数设置5. G1垃圾收集器的优化建议6. 适合使用G1垃圾收集器的场景?二. ZGC垃圾收集器详解1. NUMA与UMA2. 颜色指针3. ZGC的运作过程4. ZGC垃圾收集器…

开发中的前端和后端

一、引言 前端和后端是Web开发中两个不同的领域。 前端开发主要负责实现用户界面的设计和功能,包括网页的布局、样式和交互效果。前端开发使用HTML、CSS和JavaScript等技术来构建用户在浏览器中直接与之交互的界面。前端开发人员需要关注网页的可视化效果和用户体验…