接口测试入门实践

news2024/11/23 21:53:38

简单接口搭建(表单/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, jsonify

app = Flask(__name__)

@app.route("/api/sub/", methods=["POST"])
def sub():
	if not request.json: # 如果请求数据类型非json
		return jsonify({"code": "100001", "msg": "请求类型错误", "data": None})

	if not "a" in request.json or not "b" in request.json: # 如果参数中没有a或者没有b
		return 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 requests

base_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 json

base_url = "http://127.0.0.1:5005"

def test_sub_normal():
    url = base_url + "/api/sub/"
    headers = {"Content-Type": "application/json"} # 1. 必须通过headers指定请求内容类型为json
    data = {"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 == 200
    assert 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 xlrd

base_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).value
    a = sh.cell(row, 4).value
    b = sh.cell(row, 5).value
    expected = sh.cell(row, 6).value
    case = 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.coloradmin.cn/o/1057401.html

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

相关文章

【test】文章测试

自定义文章测试 欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants 创建一个自定义列表如何创建一个注脚注…

【改进哈里鹰算法(NCHHO)】使用混沌和非线性控制参数来提高哈里鹰算法的优化性能,解决车联网相关的路由问题(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

嵌入式学习笔记(42)SD卡的编程接口

8.3.1 SD卡的物理接口 SD卡由9个针脚与外界进行物理连接,这9个脚中有2个地,1个电源,6个信号线。 8.3.2 SD协议与SPI协议 (1)SD卡与SRAM/DDR/SROM之类的东西的不同:SRAM/DDR/SROM之类的存储芯片是总线式的,只要连接上…

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…

Android 活动Activity

目录 一、启停活动页面1.1 Activity的启动和结束1.2 Activity的生命周期1.3 Activity的启动模式 二、在活动之间传递消息2.1 显式Intent和隐式Intent2.2 向下一个Activity发送数据2.3 向上一个Activity返回数据 三、补充附加信息3.1 利用资源文件配置字符串3.2 利用元数据传递配…

操作系统--分页存储管理

一、概念介绍 分页存储:一是分内存地址,二是分逻辑地址。 1.分内存地址 将内存空间分为一个个大小相等的分区。比如,每个分区4KB。 每个分区就是一个“页框”,每个页框有个编号,即“页框号”,“页框号”…

Linux【网络】数据链路层

Linux【网络】数据链路层 数据链路层以太网帧格式对比理解MAC地址和IP地址ARP协议--地址解析协议ARP工作流程ARP请求ARP应答 其他协议DNS-域名解析协议ICMP--网络层协议NAT技术NAPT 正向代理与反向代理 数据链路层 数据链路层用于两个设备,同一数据链路节点之间的信…

DPDK程序结合网络助手接收数据

网络调试工具&#xff1a;https://download.csdn.net/download/hdsHDS6/88390999?spm1001.2014.3001.5503 DPDK代码&#xff1a; #include <stdio.h> #include <string.h> #include <rte_eal.h> #include <rte_ethdev.h> #include <rte_ip.h> …

[管理与领导-112]:IT人看清职场中的隐性规则 - 9 - 付出与回报的关系:先付出,后回报,不行就止损,这才是职场价值交换的本质

目录 一、职场中付出与回报的先后关系 二、付出与回报四象限模型 三、职场专业性的本质 一、职场中付出与回报的先后关系 在职场中&#xff0c;个人的付出和回报之间存在着先后关系。以下是按照先后关系划分的四种类型&#xff1a; 先付出后回报型&#xff0c;不回报&#…

对进程的初步认识以及fork()函数的理解

什么是进程 进程是什么呢&#xff1f;其实解释的通俗浅显一点就是我们运行到内存的程序。我们知道运行一个磁盘里的程序时&#xff0c;会将该程序先加载&#xff08;将磁盘的数据拷贝&#xff09;到内存当中&#xff0c;因此该程序就可以称为一个进程。首先我们以Windows操作…

特斯拉被称为自动驾驶领域的苹果

特斯拉的自动驾驶技术无疑是居于世界上领先地位的,有人形容特斯拉是自动驾驶汽车领域的苹果。特斯拉发布的Tesla Vision系统只配备了摄像头,不依靠雷达。 这并不是特斯拉唯一和其它对手不同的地方,他们的整个战略都是基于车队和销售产品,而其大多数竞争对手则销售自…

ENVI报错:SaveRasterFile failed:IDLnaMetadata Error

ENVI报错&#xff1a;SaveRasterFile failed:IDLnaMetadata Error 问题描述 ENVI在另存为为TIFF文件时&#xff0c;报了下面这个错误信息 原因 输出路径或者是存放影像的路径里面包含中文&#xff0c;不能包含中文 解决方案 把所有相关路径中的中文改成英文

【第十四届蓝桥杯单片机组】学习笔记(5):PCF8591( AD/DA芯片)

目录 概述功能字芯片寻址控制字A/D转换单通道读取多通道读取 概述 芯片通信方式&#xff1a;IICAIN0&#xff0c;AIN1&#xff0c;AIN2&#xff0c;AIN3&#xff1a;(Analog signal In) 模拟信号输入AOUT&#xff1a;模拟信号输出 功能字 芯片寻址 这是在比赛提供的PCF8591芯…

考虑源荷不确定性的热电联供微网优化(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

华为云云耀云服务器L实例评测|云耀云服务器L实例部署Gogs服务器

华为云云耀云服务器L实例评测&#xff5c;云耀云服务器L实例部署Gogs服务器 一、云耀云服务器L实例介绍1.1 云耀云服务器L实例简介1.2 云耀云服务器L实例特点 二、Gogs介绍2.1 Gogs简介2.2 Gogs特点 三、本次实践介绍3.1 本次实践简介3.2 本次环境规划 四、远程登录华为云云耀云…

【Spring】IoC 与 DI

IoC 与 DI 1. IoC2. DI 1. IoC IoC (Inversion of Control): 控制反转控制反转: 表示应用程序的控制权&#xff08;对象的生命周期&#xff09;由应用程序自身的代码反转到容器或框架中。应用程序的组件不再直接控制其依赖项的创建和生命周期管理&#xff0c;而是委托给容器。…

微服务moleculer03

1. Moleculer 目前支持SQLite&#xff0c;MySQL&#xff0c;MariaDB&#xff0c;PostgreSQL&#xff0c;MSSQL等数据库&#xff0c;这里以mysql为例 2. package.json 增加mysql依赖 "mysql2": "^2.3.3", "sequelize": "^6.21.3", &q…

Windows下载AOSP

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

1.Tensor For Beginner - Motivation

为何要研究张量&#xff1f; --主要原因是几何。 Tensors Geometry 了解张量后&#xff0c;可深入了解几何的工作原理 几何的一个例子&#xff1a;爱因斯坦广义相对论中的时空几何 时空是如何弯曲的&#xff0c;宇宙是如何膨胀的。 要从数学上理解这两个问题&am…

归并排序及其非递归实现

个人主页&#xff1a;Lei宝啊 愿所有美好如期而遇 目录 归并排序递归实现 归并排序非递归实现 归并排序递归实现 图示&#xff1a; 代码&#xff1a; 先分再归并&#xff0c;像是后序一般。 //归并排序 void MergeSort(int* arr, int left, int right) {int* temp (int…