网站建设公司的市场营销方案模板,设置网关,epr系统,深圳那家做网站好简单接口搭建(表单/REST)
五步教会你写接口 首先要安装flask包: pip install flask 从flask中导入Flask类和request对象: from flask import Flask, request从当前模块实例化出一个Flask实例:appFlask(__name__)编写一个函数来处理请求 从请求对象中获取数据:arequest.values.…简单接口搭建(表单/REST)
五步教会你写接口 首先要安装flask包: pip install flask 从flask中导入Flask类和request对象: from flask import Flask, request从当前模块实例化出一个Flask实例:appFlask(__name__)编写一个函数来处理请求 从请求对象中获取数据:arequest.values.get(a);brequest.values.get(b) request.params: 字典格式,存储请求中的url参数request.form: 字典格式,存储请求中的表单数据request.values: 字典格式, 包含params和form中的值request.json: 字典格式, 存储json类型的请求数据, 如果请求类型非json, 值为空进行业务处理: sum int(a) int(b)组装并返回响应数据: return str(sum) # http一般使用字符串传输数据为接口指定接口地址和接受的方法:app.route(/add/, methods[GET]) # 写到函数上面(装饰器)运行接口: 最后添加: 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(port50001) 运行代码
在浏览器窗口输入或者在Postman中输入 http://localhost:5000/add/?a1b2 访问结果
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) 打开 Postman 应用。 创建一个新的请求 点击 Postman 左上角的 New 按钮来创建一个新的请求。给请求起一个名称例如 Subtract Numbers。 配置请求参数 在请求的 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 - [*]服务器发生错误
接口业务类型
返回数据型接口: 只从数据库读取数据业务操作型接口: 需要写数据库(接口测试需要要涉及参数化或环境清理)
快速上手接口测试
获取接口文档
WikiWord文档Postman导出抽象接口定义接口管理平台
接口文档分析
功能分析: 是否能满足业务(是否缺少某个前端需要的参数), 是否能满足所有业务场景(是否有漏开发接口, 比如只开发了单品接口,没开发套餐接口)设计分析: 是否有不规范字段(如,nickname, passwd);不规范格式(如sex,用男,女而不是1,2);是否有易混淆字段(如amount和total);是否有单词拼错;是否有和数据库字段对应但名称不一样的(易错)接口分析: 协议类型(http要考虑安全);请求方法(是否规范);请求编码格式(表单/Json/xml, 很多接口文档不声明,导致测试调试不通);接口授权方式;接口业务类型(关系到是否需要做参数化或环境清理); 返回值类型及结构(关系到怎么断言)接口依赖: 需要什么环境准备和业务场景, 依赖那些接口, 有那些动态数据, 预备环境怎么保障参数分析: 各个参数的参数类型,组成规则,是否允许不传,是否可以为空, 是否允许多传参业务分析: 如price字段必须和数据库中的商品的price字段一致,才能校验通过非功能性: 接口的技术实现方案是否合理, 能否满足高并发的性能要求, 边界值/极限值的处理是否合适, 是否前后端都有数据格式校验等(如精确度为秒级的订单号生成器,在高并发下会导致生成同一订单号的问题)其他: 如反爬,对headers的一些限制和校验, ip等限制
编写接口用例 Excel/TestLink/禅道 单接口用例: 正常数据/边界数据/异常数据(健壮性)/并发(一致性)/性能/安全性(抓包截取伪造/SQL注入/跨域请求)场景用例: 列出常见的用户场景, 用接口进行覆盖, 业务场景压测(寻找某个环节的性能瓶颈)
TestCaseUrlMethodDataTypeabExceptedActualStatustest_add_normal/api/add/GETUrl358test_add_zero/api/add/POSTFORM000test_add_negetive/api/add/POSTFORM-352test_add_float/api/add/POSTFORM3.25.28.4test_add_null/api/add/POSTFORM0
执行接口测试
Postman: 功能调试Jmeter: 性能
接口自动化实践
五步教会你写接口自动化用例 需要安装三方包:requests pytest pytest-htmlpip install requests pytest pytest-html 导入requests模块 import requests组装请求参数和数据url http://127.0.0.1:5000/add/params {a:3, b:5} # get请求url参数, 字典格式data {a:3, b:5} # post请求请求数据, 字典格式发送请求得到response对象resp requests.get(urlurl, paramsparams)resp requests.post(urlurl,datadata)解析response对象 resp.text # 获取响应文本断言结果 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(urlurl, datadata)
# 4. 解析响应
# 5. 断言结果assert response.text 3运行代码并在浏览器输入
http://127.0.0.1:5005/add/
REST类接口自动测试方法 请求格式为json 三处不同:
必须通过headers指定内容类型为application/json: headers请求数据要转化为字符串: datajson.dumps(data) (使用json.dumps需要import json)json格式的响应数据,在接口调试通过和稳定的情况下可以使用response.json()解析为字典格式,进行断言
完整代码:
# 1. 导入包
import requests
import jsonbase_url http://127.0.0.1:5005def 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(urlurl, headersheaders, datadata)# 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 100000assert 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
TestCaseUrlMethodDataTypeabExceptedActualStatustest_add_normal/api/add/GETUrl358test_add_zero/api/add/POSTFORM000test_add_negetive/api/add/POSTFORM-352test_add_float/api/add/POSTFORM3.25.28.4test_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(urlurl, datadata)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_namecase_name, aa, bb, expectedexpected)exec(case)这个得需要调试有的电脑可能一直提示拒绝连接 解决办法如下 我的默认端口7890 动态生成的用例支持pytest发现和执行 自动化接口用例运行
将自动化测试用例保存为test*.py,一个文件里可以写多个用例, 如上面两个接口保存为test_user.py在自动化用例脚本所在目录打开命令行, 运行pytest(运行所有test开头的.py用例)或pytest test_user.py(只运行该脚本中用例)pytest一些参数 -q: 安静模式(不显示环境信息) pytest -q test_user.py--htmlreport.html:执行完生成report.html报告(文件名可以自己指定)pytest test_user.py --htmltest_user_report.html--resultlogtest.log: 执行完成生成执行结果log文件pytest test_user.py --resultlogrun.log
requests库详解
请求方法
requests.get()requests.post()requests.delete().....requests.session() # 用来保持session会话,如登录状态
请求参数
url: 接口地址, str urlhttp://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(urlurl,paramsparams,timeout10)
响应解析
resp: 响应对象resp.status_code: 响应状态码resp.text # 响应文本resp.json() # 响应转化为json对象(字典)-慎用:如果接口出错或返回格式不是json格式,使用这个方法会报错resp.content # 响应内容, 二进制类型