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

接口相关理论

  • 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

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

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

相关文章

【原理+使用】DeepCache: Accelerating Diffusion Models for Free

论文:arxiv.org/pdf/2312.00858 代码:horseee/DeepCache: [CVPR 2024] DeepCache: Accelerating Diffusion Models for Free (github.com) 介绍 DeepCache是一种新颖的无训练且几乎无损的范式,从模型架构的角度加速了扩散模型。DeepCache利…

【因果推断】优惠券政策对不同店铺的影响

这次依然是用之前rossmann店铺竞赛的数据集。 之前的数据集探索处理在这里已经做过了,此处就不再赘述了CSDN链接 数据集地址:竞赛链接 这里探讨数据集中Promo2对于每家店铺销售额的影响。其中,Promo2是一个基于优惠券的邮寄活动,发…

SQL Server 2022 中的 Tempdb 性能改进非常显著

无论是在我的会话中还是在我写的博客中,Tempdb 始终是我的话题。然而,当谈到 SQL Server 2022 中引入的重大性能变化时,我从未如此兴奋过。他们解决了我们最大的性能瓶颈之一,即系统页面闩锁并发。 在 SQL Server 2019 中&#x…

Go语言如何入门,有哪些书推荐?

Go 语言之所以如此受欢迎,其编译器功不可没。Go 语言的发展也得益于其编译速度够快。 对开发者来说,更快的编译速度意味着更短的反馈周期。大型的 Go 应用程序总是能在几秒钟之 内完成编译。而当使用 go run编译和执行小型的 Go 应用程序时,其…

如何利用Github Action实现自动Merge PR

我是蚂蚁背大象(Apache EventMesh PMC&Committer),文章对你有帮助给项目rocketmq-rust star,关注我GitHub:mxsm,文章有不正确的地方请您斧正,创建ISSUE提交PR~谢谢! Emal:mxsmapache.com 1. 引言 GitHub Actions 是 GitHub 提供的一种强大而灵活的自…

SSM中小学生信息管理系统 -计算机毕业设计源码02677

摘要 随着社会的发展和教育的进步,中小学生信息管理系统成为学校管理的重要工具。本论文旨在基于SSM框架,采用Java编程语言和MySQL数据库,设计和开发一套高效、可靠的中小学生信息管理系统。中小学生信息管理系统以学生为中心,通过…

赤壁之战的烽火台 - 观察者模式

“当烽火连三月,家书抵万金;设计模式得其法,千军如一心。” 在波澜壮阔的三国历史长河中,赤壁之战无疑是一场改变乾坤的重要战役。而在这场战役中,一个看似简单却至关重要的系统发挥了巨大作用——烽火台。这个古老的…

OpenAI的崛起:从梦想到现实

OpenAI的崛起不仅是人工智能领域的重大事件,也是科技史上一个引人注目的篇章。本文将深入探讨OpenAI从创立到如今的演变过程,分析其成功的关键因素,以及未来的发展方向。 一、OpenAI的初创期:理想主义与混乱并存 OpenAI成立于20…

插入排序——C语言

假设我们现在有一个数组,对它进行排序,插入排序的算法如同它的名字一样,就是将元素一个一个插入到合适的位置,那么,该如何做呢? 如果我们要从小到大进行排序的话,步骤如下: 1.对于…

区间最值问题-RQM(ST表,线段树)

1.ST表求解 ST表的实质其实是动态规划&#xff0c;下面是区间最小的递归公式&#xff0c;最大只需将min改成max即可 f[i][j] min(f[i][j - 1], f[i (1 << j - 1)][j - 1]); 二维数组的f[i][j]表示从i开始连续2*j个数的最小/大值。 例如&#xff1a;我们给出一个数组…

uniapp启动安卓模拟器mumu

mumu模拟器下载 ADB&#xff1a; android debug bridge &#xff0c; 安卓调试桥&#xff0c;是一个多功能的命令行工具&#xff0c;他使你能够与连接的安卓设备进行交互 # adb连接安卓模拟器 adb connect 127.0.0.1:port # 查看adb设备 adb deviceshubuilderx 有内置的adb&a…

MSPM0G3507——滴答定时器和普通定时

滴答定时器定时&#xff1a;&#xff08;放在主函数即可&#xff09; volatile unsigned int delay_times 0;//搭配滴答定时器实现的精确ms延时 void delay_ms(unsigned int ms) {delay_times ms;while( delay_times ! 0 ); } //滴答定时器中断 void SysTick_Handler(…

Python28-7.4 独立成分分析ICA分离混合音频

独立成分分析&#xff08;Independent Component Analysis&#xff0c;ICA&#xff09;是一种统计与计算技术&#xff0c;主要用于信号分离&#xff0c;即从多种混合信号中提取出独立的信号源。ICA在处理盲源分离&#xff08;Blind Source Separation&#xff0c;BSS&#xff0…

【机器学习】(基础篇一) —— 什么是机器学习

什么是机器学习 本系列博客为你从机器学习的介绍开始&#xff0c;使用大量的代码实战和验证&#xff0c;最终帮助你完全掌握什么是机器学习 人工智能、机器学习和深度学习的关系 人工智能&#xff08;Artificial Intelligence&#xff0c;AI&#xff09;&#xff1a;是一门研…

Java多线程不会?一文解决——

方法一 新建类如MyThread继承Thread类重写run()方法再通过new MyThread类来新建线程通过start方法启动新线程 案例&#xff1a; class MyThread extends Thread {public MyThread(String name) {super(name);}Overridepublic void run() {for(int i0;i<10;i){System.out.…

react dangerouslySetInnerHTML将html字符串以变量方式插入页面,点击后出现编辑状态

1.插入变量 出现以下编辑状态 2.解决 给展示富文本的标签添加css样式 pointerEvents: none

那些年背过的面试题——MySQL篇

本文是技术人面试系列 MySQL 篇&#xff0c;面试中关于 MySQL 都需要了解哪些基础&#xff1f;一文带你详细了解&#xff0c;欢迎收藏&#xff01; WhyMysql&#xff1f; NoSQL 数据库四大家族 列存储 Hbase K-V 存储 Redis 图像存储 Neo4j 文档存储 MongoDB 云存储 OSS …

AI大模型的智能心脏:向量数据库的崛起

在人工智能的飞速发展中,一个关键技术正悄然成为AI大模型的智能心脏——向量数据库。它不仅是数据存储和管理的革命性工具,更是AI技术突破的核心。随着AI大模型在各个领域的广泛应用,向量数据库的重要性日益凸显。 01 技术突破:向量数据库的内在力量 向量数据库以其快速检索…

RNN、LSTM与GRU循环神经网络的深度探索与实战

循环神经网络RNN、LSTM、GRU 一、引言1.1 序列数据的迷宫探索者&#xff1a;循环神经网络&#xff08;RNN&#xff09;概览1.2 深度探索的阶梯&#xff1a;LSTM与GRU的崛起1.3 撰写本博客的目的与意义 二、循环神经网络&#xff08;RNN&#xff09;基础2.1 定义与原理2.1.1 RNN…