接口测试分析、设计以及实现

接口相关理论

  • ui功能测试和接口测试哪个先执行?–为什么
结论:接口测试先执行
原因:ui功能测试需要等待前端页面开发完成、后台接口开发完后且前端与后端联调完成。
  • ui功能测试与接口测试的区别?
ui功能:功能调用(前端jS、服务器端)+页面布局+兼容
接口测试:完整的测试服务端功能验证。
  • ui功能测试和接口测试哪个更高效?–为什么
结论:接口测试更高
原因:接口测试只测服务端功能以及没有多页面操作因素。

金融项目

测试对象:投资业务接口

待测接口

1、注册登录
   注册图片验证码接口
   注册手机验证码接口
   注册接口
   登录接口
   查询登录状态接口
2、认证开户充值
   认证接口
   查询认证状态
   请求后台开户接口
   三方开户接口
   请求充值验证码接口
   请求后台充值接口
   请求三方充值接口
3、投资
   请求后台投资接口
   三方投资接口
4、投资业务
   注册图片验证码接口
   注册手机验证码接口
   注册接口
   登录接口
   认证接口
   请求后台开户接口
   三方开户接口
   请求充值验证码接口
   请求后台充值接口
   请求三方充值接口
   请求后台投资接口
   三方投资接口

接口如何测试?

  • 设计用例

image-20240623204952107

  • 使用工具
可视化工具:postman、Jmeter
代码:python+requests+unittest

接口流程

1、需求评审
2、测试计划与方案
3、分析API文档
4、编写用例
5、搭建环境(项目测试、测试工具环境)
6、编写脚本
7、执行脚本
8、缺陷管理
9、测试报告
  • 需求评审
参与人员:开发、测试、产品
目的:
   1、熟悉项目有哪些功能
   2、站在不同角度对需求进行查漏补缺
   3、各角色对需求理解一致
  • 测试计划与方案
核心:
	测什么
    谁来测
    怎么测
其他:
    提测标准
    上线标准
    ⻛险控制
  • 分析API文档
1、测试接口依赖的数据是否都明确(请求、响应)
2、分析接口之间依赖关系及关联
3、参数规则(类型、必填、长度等等)说明
项目难点:
1、认证接口请求头使用multipart/form-data
2、三方开户、三方充值、三方投资都需要调用Mock接口
请求url:来源响应数据action的值
请求参数和值:所有input标签中name属性值为参数名,value属性值为参数值。

测试点提取

  • 注册图片验证码、注册验证码

image-20240624082406506

  • 注册

image-20240624083001666

  • 登录

image-20240624083042408

  • 开户认证

image-20240624083103546

  • 充值

image-20240624083215750

  • 投资

image-20240624083251199

测试用例

  • 注册图片验证码、注册短信验证码

image-20240624084609782

  • 注册

image-20240624084901908

  • 登录

image-20240624085023926

  • 认证开户

image-20240624085718700

  • 充值

image-20240624090027477

  • 投资

image-20240624090255283

  • 投资业务

image-20240624090410633

环境说明

1、项目环境
2、测试工具环境

项目环境搭建

  • 环境部署主要步骤

image-20240624221401055

  • 三方接口如何解决?
使用mock

Mock说明

  • 什么是mock?–模拟接口
  • 什么场景下会用mock?
1、依赖的接口未实现
2、依赖的接口响应速度慢
3、针对接口模拟各种异常
  • 如何去实现?
1、使用mock现有工具-->moco
2、自定义mock
   ①编写一个函数 直接return 模拟的值
   ② 使用接口开发框架编写要模拟的接口 flask

要模拟哪些内容?

响应数据
响应状态码

需求场景:

模拟一个:登录接口
1、在API文档中说明如果登录成功,返回:状态码{"status":200,"msg":"登录成功!",
"token":"xxx123123123"}
2、登录失败反馈:状态码:200{"status":100,"msg":"用户名或密码错误!"}
问题:开发还未实现登录接口,那么依赖登录如何解决?
  • 实现
from flask import Flask
app = Flask(__name__)
# 定义接口 模拟返回结果
@app.route("/login", methods=["post"])
def login():
    return {"status": 200, "msg": "登录成功!", "token": "xxxx123123123"}
# 定义接口 模拟异常响应状态码
@app.route("/login/lgy", methods=["get"])
def lgy():
    return "haha",407,"xiaoxi"
# 运行
app.run()
  • 扩展
from flask import Flask,requests
app = Flask(__name__)

"""
需求:用户名为admin 密码为:123456 返回登录成功!否则返回用户名或密码错误,请求参数格式为:form

"""

# 定义接口 模拟返回结果
@app.route("/login", methods=["post"])
def login():
    #提取数据
    username=requests.form.get("username")
    pwd=requests.form.get("possword")
    #判断
    if username=="admin" and pwd=="123456":
        return {"status": 200, "msg": "登录成功!", "token": "xxxx123123123"}
    else:
        return {"status":100,"msg":"用户名或密码错误!"}
# 运行
app.run()

构造测试数据

  • 方式
    • 通过系统页面构造
    • 通过接口构造
    • 通过数据库构造

通过系统页面构造

  • 优点:可视化页面操作
  • 缺点:操作步骤较多,不适合频繁改造数据
  • 示例:参考发布借款标流程

通过接口构造

  • 优点:速度快
  • 缺点:接口耦合度高(接口之间依赖性强,一个失败,后面全失败)
  • 建议:适合依赖3个以内接口就行构造

通过数据库构造(推荐)

  • 优点:灵活度大,执行速度最快
  • 缺点:需要熟悉库、表、字段
  • 建议:编写SQL语句时,使用复制生成的SQL语句,修改主要字段值。

构造借款业务数据

-- 清空操作
delete from `czbk_member`.`mb_member` where id=869;
delete from `czbk_member`.`mb_member_info` where id=987;
delete from `czbk_finance`.`fn_loan_amount` where id=987;
delete from `p2p_mock`.`p2p_account` where id=911;

-- 借款
delete from `czbk_finance`.`fn_loan` where id=642;
delete from `czbk_finance`.`fn_loan_info` where id=832;
delete from `czbk_finance`.`fn_loan_amount_log` where id=869;
INSERT INTO `czbk_member`.`mb_member` (`id`, `name`, `trust_account`, `password`,
`email`, `phone`, `paypassword`, `count`, `register_ip`, `register_time`,
`register_date`, `lastlogin_ip`, `lastlogin_time`, `lastlogin_date`,
`register_type`, `role`, `group`, `group_status`, `is_realname`, `is_email`,
`is_phone`, `is_video`, `is_id5`, `is_vip`, `credit_point`, `is_auto`,
`pwd_attach`, `status`, `lock_time`, `vip_start_time`, `vip_end_time`,
`vip_category_id`, `vip_category_ind`, `amount`, `phonestr`) VALUES ('869',
'13099775533', '6021234507160403', 'eab70f4a46c640b3dfc35040bf37c803', NULL,
'13099775533', NULL, '1', '1972826569', '1588835827', '2020-05-07', '1972826569',
'1588835827', '2020-05-07', '1', '1', '1', '2', '1', '-1', '1', '-1', '-1', '-1',
'0', '-1', '1m4U82PqPx', '1', NULL, NULL, NULL, NULL, NULL, '0.00', NULL);
INSERT INTO `czbk_member`.`mb_member_info` (`id`, `member_id`, `member_name`,
`avatar`, `nickname`, `realname`, `gender`, `birthday`, `card_id`, `qq`,
`educational_background`, `marry_status`, `graduated`, `company_industry`,
`company_scale`, `company_office`, `monthly_income`, `invite_money`,
`hometown_province`, `hometown_city`, `hometown_area`, `hometown_post`) VALUES
('987', '869', '13099775533', NULL, NULL, '小石头', NULL, '1986-11-18',
'429009118611181111', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
NULL, NULL, NULL);
INSERT INTO `czbk_finance`.`fn_loan_amount` (`id`, `member_id`, `member_name`,
`credit_amount`, `credit_amount_freeze`, `vouch_amount`, `vouch_amount_freeze`,
`pawn_amount`, `pawn_amount_freeze`, `roam_amount`, `roam_amount_freeze`) VALUES
('987', '869', '13099775533', '200000.000000', '0.000000', '0.000000',
'0.000000', '0.000000', '0.000000', '0.000000', '0.000000');
INSERT INTO `p2p_mock`.`p2p_account` (`id`, `account`, `AvlBal`, `AcctBal`,
`FrzBal`, `create_time`) VALUES ('911', '6021234507160403', '0.00', '0.00',
'0.00', '2020-05-07 16:04:03');

-- 借款
INSERT INTO `czbk_finance`.`fn_loan` (`id`, `ind`, `serialno`, `name`,
`member_id`, `member_name`, `amount`, `credited_amount`, `progress`,
`tender_count`, `category_id`, `category_type`, `repay_type`, `period`, `apr`,
`sort_index`, `sort_top`, `status`, `hidden_status`, `additional_status`,
`deposit_certificate`, `certificate_file_id`, `loan_repay_status`,
`loan_repay_time`, `overdue_time`, `add_date`, `add_time`, `verify_time`,
`reverify_time`, `add_ip`, `vouch_company_id`, `op_status`, `marker_type`) VALUES
('642', 'f5380d59791773a8abad4141ff90a5a4', '202008231111', '数据库构造借款1',
'869', '13099775533', '100000.00', '0.00', '0.00', '0', '1', '1', '1', '60',
'7.55', '1', NULL, '3', '1', '-1', '-1', NULL, NULL, NULL, '1609501013', '2020-
05-07', '1588847800', '1588851413', NULL, '1972826569', '0', '-1', '数据库');

INSERT INTO `czbk_finance`.`fn_loan_info` (`id`, `loan_id`, `thumbs`, `contents`,
`attachment_ids`, `password`, `use`, `tender_amount_min`, `tender_amount_max`,
`freeze_amount`, `freeze_amount_proportion`, `freeze_period`, `award_status`,
`fail_award_status`, `award_amount`, `award_proportion`, `award_amount_total`,
`validate`, `part_status`, `tender_count`, `comment_status`, `comment_count`,
`is_company`, `company_name`, `vouch_company_info`, `vouch_company_pic`,
`vouch_company_guaranty`, `amount_category_id`, `hits`, `cancel_admin_id`,
`cancel_remark`, `cancel_time`, `verify_admin_id`, `verify_admin_name`,
`verify_remark`, `verify_time`, `verify_ip`, `reverify_admin_id`,
`reverify_admin_name`, `reverify_remark`, `reverify_time`, `reverify_ip`,
`auto_scale`, `is_auto`, `additional_status`, `additional_apr`,
`additional_name`, `additional_amount_max`, `additional_pic`, `product_process`,
`information`) VALUES ('832', '642', NULL, '数据库构造借款1', 'a:0:{}', NULL,
'10102', '100.00', '1000.00', NULL, '10.00', NULL, '-1', '-1', NULL, NULL, NULL,
'239', NULL, '0', '-1', '0', '-1', NULL, NULL, NULL, NULL, '1', '1', NULL, NULL,
NULL, '4', 'admin', '数据库构造借款1 通过', '1588851413', '1972826569', NULL, NULL,
NULL, NULL, NULL, NULL, '1', '-1', '0.000000', NULL, '0.000000', NULL, NULL,
NULL);
UPDATE `czbk_finance`.`fn_loan_amount` SET `credit_amount_freeze`='100000.000000'
WHERE `member_id`='869';
INSERT INTO `czbk_finance`.`fn_loan_amount_log` (`member_id`, `member_name`,
`category_id`, `type`, `amount`, `remark`,
`add_time`) VALUES ('869','13099775533', 1, 4, '100000', '借款冻结',
'1972826569');

脚本编写

  • 获取图片验证码、获取短信验证码

image-20240625221929905

注意:
1、随机数为空、随机数为字符串,响应状态码为400,404,如果需要变绿,就需要加断言且勾选"忽略状态"
2、获取短信验证码依赖图片验证码,需要先请求图片验证码,添加cookie管理器进行关联。
  • 注册脚本

image-20240626082518125

提示:
1、密码为空、未同意条款为缺陷
2、注册接口中手机号必须和获取短信验证码接口手机号一致。
  • 登录脚本

image-20240626085131503

提示:
1、解锁需要使用固定定时器登录60秒(60000毫秒)
2、查询登录状态(未登录)需要把登录请求删除
  • multipart/from-data

image-20240626090041816

  • 普通form

image-20240626085922190

  • 认证

image-20240626091200391

  • 三方开户

image-20240627081928590

难点:分析正则提取公式

image-20240626220431897

结论:提取的数据不一样,其他都一样

表达式编写

image-20240626221609789

input name\\u003d\\u0027(.*?)\\u0027 type\\u003d\\u0027hidden\\u0027 value\\u003d\\u0027(.*?)\\u0027

image-20240627081956515

  • 请求引用

image-20240627082032319

  • 扩展unicode编码
https://tool.chinaz.com/tools/Unicode.aspx

image-20240627082139535

  • 充值

image-20240627090738771

提示:
1、后台充值必须先登录在请求图片验证码,最后调用后台充值
2、三方充值和三方开户一模一样,直接复制即可。
  • 投资

image-20240627090922786

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

windows上传app store的构建版本简单方法

我们在上传app store上架,或上传到testflight进行ios的app测试的时候,需要mac下的上传工具上传ipa文件到app store的构建版本上。 然而windows电脑这些工具是无法安装的。 因此,假如在windows上开发hbuilderx或uniapp的应用,可以…

程序升级bootloader

文章目录 概述什么是bootloader?为什么用?bootloader启动流程图步骤 下载过程代码获取本地配置信息获取主机传过来的配置信息bootloader发送2给上位机,上位机发送文件给bootloader根据网站复制CRC 烧写flasherase启动编译问题 概述 用keil编…

Halcon 产品周围缺口检测

*读取一张图像read_image (Image, 原图.jpg)*获取图像大小get_image_size(Image, Width, Height)*关闭已经打开的窗口dev_close_window ()*打开新窗口dev_open_window(0, 0, Width, Height, black, WindowHandle) //打开指定大小的窗口*对图像进行阈值操作threshold (Image, R…

【eMTC】eMTC 窄带以及带宽的关系

1 概述 eMTC 传输进行通信时,一般采用1.4M带宽,在和LTE小区联合部署时,需要将LTE的带宽分割成以1.4M带宽为粒度的单位,这个单位在协议上叫做窄带。 2 窄带定义 3 参考文献 36.211

图片高效管理神器,随机高度切割,一键生成灰色图片,个性化处理随心所欲

在数字化时代,图片已成为我们生活和工作中不可或缺的一部分。然而,面对海量的图片资源,如何高效管理、快速处理,成为了许多人头疼的问题。今天,我们为您带来了一款全新的图片高效管理神器_——首助编辑高手&#xff0c…

【沐风老师】3DMAX样条线增强工具SplinePro使用方法详解

3DMAX样条线增强工具SplinePro使用教程 3DMAX样条线增强工具SplinePro,允许创建选定的多条样条曲线形状的轮廓并删除交叉点。 【适用版本】 3dMax2019 - 2025 【安装方法】 1.解压缩后,确认SplinePro-0.2.0.mse和logo.png两个文件在同一文件夹中。 2.…

python+django 环境搭建以及post接口封装

1、搭建pythondjango环境 python 3.7.9的版本 具体参考之前的安装教程 django 使用 pip install django 会自动安装 检验安装版本: python -m django --version 2、创建django项目 django-admin startproject projectname 启动项目:python manage.py…

verilog读写文件注意事项

文章目录 想要的16进制数是文本格式提供的文件,想将16进制数提取到变量内,想要的16进制数是文本格式提供的文件,想将16进制数提取到变量内,想要的16进制数是二进制格式提供的文件,想将16进制数提取到变量内&#xff0c…

大模型在营销领域的探索及创新

1 AIGA介绍 2 AIGA在营销领域的 应用和探索 3 总结与展望

【WPF】桌面程序开发之xaml页面基础布局方式详解

使用Visual Studio开发工具,我们可以编写在Windows系统上运行的桌面应用程序。其中,WPF(Windows Presentation Foundation)项目是一种常见的选择。然而,对于初学者来说,WPF项目中xaml页面的布局设计可能是一…

MySQL8.0在windows下的下载安装及详细使用

下载mysql8.0二进制包 下载地址:MySQL :: Download MySQL Community Server 编辑my.ini配置文件 解压二进制包,新建/编辑my.ini配置文件(如果不存在则新建) [client] #客户端设置,即客户端默认的连接参数 # 设置mysql客户端连接服务端时…

Python【打包exe文件两步到位】

Python打包Exe 安装 pyinstaller(pip install pyinstaller) 执行打包命令(pyinstaller demo.py) 打完包会生成 dist 文件夹,如下如

openrestry中的hello world

目录 概述实践部署openrestry脚本效果验证 概述 此篇将在 k8s 运行起一个 openrestry   环境:k8s:1.27.9 ,openrestry(docker镜像版本): 1.25.x ,k8s 与 ingress 请参考我的其它文章 离线镜像包请参考:op…

2024暑假集训

Day1——枚举 Day2——测试 Day3——贪心 Day4、5——测试 ——————————————————————————————————————————— Day3T7&Day5T7:没思路 Day3T8:不知道怎么排序筛选 Day5T5:没有算法难度,但是不知道怎么处理2队奶牛的情…

【TB作品】51单片机 Proteus仿真 超声波LCD1602ADC0832 身高体重测量仪

00024 超声波LCD1602ADC0832 实验报告:基于51单片机的身高体重测量仪设计 背景介绍 本实验设计并实现了一个基于51单片机的身高体重测量仪。该系统利用超声波传感器测量高度,通过ADC0832模数转换芯片获取重量数据,并使用LCD1602显示屏显示…

MySQL 中的 DDL、DML、DQL 和 DCL

文章目录 1. 数据定义语言(DDL)2. 数据操作语言(DML)3. 数据查询语言(DQL)4. 数据控制语言(DCL)总结 在 MySQL 数据库管理系统中,SQL 语句可以根据其功能分为不同的类别&…

电源纹波相关

什么是纹波?什么是噪声? 这种叠加在直流稳定量上的交流分量就称为纹波。 纹波的危害 电源纹波能影响设备性能和稳定性 纹波会导致电器上产生谐波,降低电源的使用效率; 高频电源纹波可能会产生浪涌电压或电流,影响设…

VSCode神仙插件——CodeSnap (好看的代码截图)

1 安装 2 使用 选中要截图的代码,右键 此时右侧会出现代码截图的预览图 如果要将截图保存到本地,则点击上图红色框中的图标 也可以点击下面截的图,CtrlC复制,然后就可以CtrlV粘贴到其他应用程序里了

拉曼光谱入门:3.拉曼光谱的特征参数与定量定性分析策略

1.特征参数 1.1 退偏振率 退偏振率(p)是一个衡量拉曼散射光偏振状态的参数,它描述了拉曼散射光的偏振方向与入射光偏振方向之间的关系。退偏振率定义为垂直偏振方向的拉曼散射强度与平行偏振方向的拉曼散射强度之比。退偏振率(p&…

shark云原生-日志体系-filebeat高级配置(适用于生产)-更新中

文章目录 1. filebeat.inputs 静态日志收集器2. filebeat.autodiscover 自动发现2.1. autodiscover 和 inputs2.2. 如何配置生效2.3. Providers 提供者2.4. Providers kubernetes2.5. 配置 templates2.5.1. kubernetes 自动发现事件中的变量字段2.5.2 配置 templates 2.6. 基于…