金融项目实战
- 测试流程
测试流程
- 功能测试流程
功能测试流程
- 需求评审
- 制定测试计划
- 编写测试用例和评审
- 用例执行
- 缺陷管理
- 测试报告
- 接口测试流程
接口测试流程
- 需求评审
- 制定测试计划
- 分析api文档
- 编写测试用例
- 搭建测试环境
- 编写脚本
- 执行脚本
- 缺陷管理
- 测试报告
-
测试步骤
测试步骤
-
需求评审
需求评审
前置:阅读需求
- 正常情况下阅读所有需求—测试主管
- 涉及到本项目测试人员全部参与
目标:
- 熟悉项目功能
- 站在不同角度对需求进行查漏补缺
- 各部门对需求理解一致【重要】
评审人员:测试、开发、产品
- 测试计划
测试计划
核心:
- 测什么(测试目标、测试范围)
- 谁来测(人员安排)
- 怎么测(测试策略、测试方法)
其他:- 提测标准
- 上线标准
- ⻛险控制
- 接口相关理论
- ui功能测试和接口测试哪个先执行?–为什么
结论:
- 接口测试先执行
原因:
- ui功能测试需要等待前端页面开发完成、后台接口开发完后且前端与后端联调完成。
- ui功能测试与接口测试的区别?
ui功能:功能调用(前端jS、服务器端)+页面布局+兼容
接口测试:完整的测试服务端功能验证。
- ui功能测试和接口测试哪个更高效?–为什么
结论:接口测试更高
原因:接口测试只测服务端功能以及没有多页面操作因素。
-
金融项目
金融项目
-
测试对象
测试对象: 投资业务接口
- 待测接口
待测接口
1、注册登录
- 注册图片验证码接口
- 注册手机验证码接口
- 注册接口
- 登录接口
- 查询登录状态接口
2、认证开户充值
- 认证接口
- 查询认证状态
- 请求后台开户接口
- 三方开户接口
- 请求充值验证码接口
- 请求后台充值接口
- 请求三方充值接口
3、投资
- 请求后台投资接口
- 三方投资接口
4、投资业务
- 注册图片验证码接口
- 注册手机验证码接口
- 注册接口
- 登录接口
- 认证接口
- 请求后台开户接口
- 三方开户接口
- 请求充值验证码接口
- 请求后台充值接口
- 请求三方充值接口
- 请求后台投资接口
- 三方投资接口
- 接口如何测试?
设计用例
设计用例
使用工具
- 可视化工具:postman、Jmeter
- 代码:python+requests+unittest
- 接口流程
- 需求评审
- 制定测试计划与方案
- 分析API文档
- 编写用例
- 搭建环境(项目环境、项目工具环境)
- 编写脚本
- 执行脚本
- 缺陷管理
- 测试报告
需求评审
参与人员:产品、开发、测试
目的:
- 熟悉项目有哪些动能
- 各角色对需求的理解一致
- 站在不同角度对需求进行 查漏补缺
测试计划和方案
核心:
- 测什么(测试目标、测试范围)
- 谁来测(人员安排)
- 怎么测(测试策略、测试方法)
其他:
- 提测标准
- 上线标准
- ⻛险控制
分析API文档
- 测试接口依赖的数据是否都明确(请求、响应)
- 分析接口之间依赖关系及关联
- 参数规则(数据类型、必填、数据长度限制、非空、敏感信息是否加密等等)说明
项目难点:
- 1、认证接口请求头使用
multipart/form-data
- 2、三方开户、三方充值、三方投资都需要调用Mock接口
- 请求url:来源响应数据action的值
- 请求参数和值:所有input标签中name属性值为参数名,value属性值为参数值。
测试点提取
测试点提取
- 注册图片验证码、注册验证码
-
注册接口
登录
开通账号
充值
投资
测试用例
测试用例
-
注册图片验证码、注册短信验证码
-
注册
-
登录
-
认证开户
-
充值
-
投资
-
投资业务
-
环境说明
1、项目环境
2、测试工具环境
- 项目环境搭建
项目环境搭建
- 环境部署主要步骤
- 三方接口如何解决?
三方接口如何解决
使用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');
- 脚本编写
脚本编写
获取图片验证码、获取短信验证码
获取图片验证码、获取短信验证码
注意:
- 1、随机数为空、随机数为字符串,响应状态码为400,404,如果需要
变绿,就需要加断言且勾选"忽略状态"
- 2、获取短信验证码依赖图片验证码,需要先请求图片验证码,添加cookie管理器进行关联。
注册脚本
注册脚本
提示:
- 1、密码为空、未同意条款为缺陷
- 2、
注册接口中手机号
必须和获取短信验证码接口手机号
一致。
登录脚本
登录脚本
提示:
- 1、解锁需要使用固定定时器登录60秒(60000毫秒)
- 2、查询登录状态(未登录)需要把登录请求删除
multipart/from-data
普通form
认证
认证脚本
三方开户
三方开户-正则表达式提取
难点:分析正则提取公式
结论:提取的数据不一样,其他都一样
表达式编写
input name\u003d\u0027(.?)\u0027 type\u003d\u0027hidden\u0027 value\u003d\u0027(.?)\u0027
请求引用
- 扩展unicode编码
https://tool.chinaz.com/tools/Unicode.aspx
充值
充值
提示:
1、后台充值必须先登录在请求图片验证码,最后调用后台充值
2、三方充值和三方开户一模一样,直接复制即可。
投资
投资
相关文章:

金融项目实战
测试流程 测试流程 功能测试流程 功能测试流程 需求评审制定测试计划编写测试用例和评审用例执行缺陷管理测试报告 接口测试流程 接口测试流程 需求评审制定测试计划分析api文档编写测试用例搭建测试环境编写脚本执行脚本缺陷管理测试报告 测试步骤 测试步骤 需求评审 需求评…...

大模型小白入门
【课前篇】大模型从0到1指南 【基础篇】大模型的演变与概念 大模型的演变 人工智能:人工智能是一个广泛涉及计算机科学、数据分析、统计学、机器工程、语言学、神 经科学、哲学和心理学等多个学科的领域。 机器学习:机器学习可以分为监督学习&…...
从零到一:快速上手 Poetry——Python 项目管理的利器
在 Python 项目开发中,包管理、依赖管理和虚拟环境的创建一直是开发者们经常面对的难题。传统上,开发者通常会使用 pip、virtualenv 或者 conda 来处理这些问题。然而,随着 Python 项目复杂度的增加,传统工具往往显得力不从心&…...
【量化科普】Beta,贝塔系数
【量化科普】Beta,贝塔系数 🚀量化软件开通 🚀量化实战教程 在量化投资领域,Beta(贝塔系数)是一个衡量投资组合或股票相对于整个市场波动性的指标。它反映了资产收益与市场收益之间的相关性,…...

C++----异常
一、C 语言传统的错误处理方式 在 C 语言中,处理错误主要有两种传统方式,每种方式都有其特点和局限性。 1. 终止程序 原理:使用类似assert这样的断言机制,当程序运行到某个条件不满足时,直接终止程序的执行。示例代…...
合理规划时间,从容应对水利水电安全员考试
合理规划时间,从容应对水利水电安全员考试 在忙碌的工作与生活节奏中备考水利水电安全员考试,合理规划时间是实现高效备考的核心。科学的时间管理能让你充分利用每一分每一秒,稳步迈向考试成功。 制定详细的学习计划是第一步。依据考试时间…...
(解决) Windows 11使用SetSuspendState睡眠命令但是进入的是休眠
Windows 11 24H2 goes into hibernation mode instead of sleep mode. How can I create a sleep mode shortcut file? 25年3月4号 Win11 23H2 起因 使用网上说的睡眠命令创建bat双击后,电脑风扇会运行一段时间后再停止(应该是在保存进程到硬盘&#…...
Spring Boot 接口 JSON 序列化优化:忽略 Null 值的九种解决方案详解
一、针对特定接口null的处理: 方法一:使用 JsonInclude 注解 1.1 类级别:在接口返回的 DTO 类或字段 上添加 JsonInclude 注解,强制忽略 null 值: 类级别:所有字段为 null 时不返回 JsonInclude(Js…...

计算机毕业设计Python+DeepSeek-R1大模型考研院校推荐系统 考研分数线预测 考研推荐系统 考研(源码+文档+PPT+讲解)
温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…...
一、Prometheus架构
Prometheus 云原生十二要素是一套最佳实践和规范,旨在帮助开发人员更好地构建云原生应用 这十二个要素分别是: 单一职责独立部署无状态声明式API服务发现容错处理自适应算法自动化运维响应式编程通信协议服务注册与发现数据持久化一、Prometheus 是什么 Prometheus 是一个…...

火山引擎 DeepSeek R1 API 使用小白教程
一、火山引擎 DeepSeek R1 API 申请 首先需要三个要素: 1)API Key 2)API 地址 3)模型ID 1、首先打开火山引擎的 DeepSeek R1 模型页面 地址:账号登录-火山引擎 2、在页面右下角,找到【推理】按钮&#…...
react+vite+pnpm+ts基础项目搭建
1. 项目初始化 pnpm create vitelatest my-react-app --template react-ts cd my-react-app pnpm install2. 核心依赖安装 # 基础依赖 pnpm add react-router-dom tanstack/react-query zustand axios# UI 组件库 (任选其一) pnpm add mui/material emotion/react emotion/st…...

ArcGIS Pro 经纬网添加全解析:从布局到样式优化
在地理信息系统的广阔领域中,地图的精确性与直观性对于数据的呈现和分析起着至关重要的作用。 经纬网,作为地图上不可或缺的元素之一,能够为用户提供准确的地理坐标参考,帮助用户快速定位和理解地理空间数据的分布。 本文将深入…...

新闻研究导刊杂志社《新闻研究导刊》编辑部2024年第23期目录
研究论文 媒介智能化环境下新闻传播面临的风险及应对策略研究 冶玉娜; AI赋能地方政务新媒体智能化转型策略研究——以佛山政务新媒体为例 温秀妍; 新闻传播在社交媒体影响下的流变与发展展望 李晋; 县级融媒体中心生产优质短视频的路径探索 陈政清; 数字游…...

DDoS攻击的介绍和防治
一.DDoS攻击是什么 DDoS攻击:dos是服务器拒绝提供服务的意思,最前面的D是分布式的意思,所以说这个大概可以理解为分布式的机器攻击服务器,占用服务器资源,使得服务器拒绝提供服务的一种攻击手段,虽然原理简…...
UDP透传程序
UDP透传程序 本脚本用于在 设备 A 和 设备 B 之间建立 UDP 数据转发桥梁,适用于 A 和 B 设备无法直接通信的情况。 流程: A --> 电脑 (中继) --> B B --> 电脑 (中继) --> A 需要修改参数: B_IP “192.168.1.123” # 设备 B 的…...
深度学习pytorch之简单方法自定义9种卷积即插即用
本文详细解析了 PyTorch 中 torch.nn.Conv2d 的核心参数,通过代码示例演示了如何利用这一基础函数实现多种卷积操作。涵盖的卷积类型包括:标准卷积、逐点卷积(1x1 卷积)、非对称卷积(长宽不等的卷积核)、空…...

TMS320F28P550SJ9学习笔记2:Sysconfig 配置与点亮LED
今日学习使用Sysconfig 对引脚进行配置,并点亮开发板上的LED4 与LED5 我的单片机开发板平台是 LAUNCHXL_F28P55x 我是在上文描述的驱动库C2000ware官方例程example的工程基础之上进行添加功能的 该例程路径如下:D:\C2000Ware_5_04_00_00\driverlib\f28p…...

zRAM内存压缩技术:原理与实践初探
zRAM内存压缩技术:原理与实践指南 1. 技术背景与原理 zRAM是Linux内核中的一项内存压缩技术,于2014年进入Linux 3.14内核主线。它的核心思想是利用CPU压缩算法压缩内存数据,在不增加物理内存的情况下扩展系统有效内存容量。 当系统内存紧张…...
Hive 3.1 在 metastore 运行的 remote threads
Remote threads 是仅当 Hive metastore 作为单独的服务运行是启动,请求需要开启 compactor。 有以下几种: 1. AcidOpenTxnsCounterService 统计当前 open 的事务数 从表 TXNS 中统计状态为 open 的事务。此事务数量可以再 hive metrics 中。 2. Acid…...

基于距离变化能量开销动态调整的WSN低功耗拓扑控制开销算法matlab仿真
目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.算法仿真参数 5.算法理论概述 6.参考文献 7.完整程序 1.程序功能描述 通过动态调整节点通信的能量开销,平衡网络负载,延长WSN生命周期。具体通过建立基于距离的能量消耗模型&am…...
Go 语言接口详解
Go 语言接口详解 核心概念 接口定义 在 Go 语言中,接口是一种抽象类型,它定义了一组方法的集合: // 定义接口 type Shape interface {Area() float64Perimeter() float64 } 接口实现 Go 接口的实现是隐式的: // 矩形结构体…...

BCS 2025|百度副总裁陈洋:智能体在安全领域的应用实践
6月5日,2025全球数字经济大会数字安全主论坛暨北京网络安全大会在国家会议中心隆重开幕。百度副总裁陈洋受邀出席,并作《智能体在安全领域的应用实践》主题演讲,分享了在智能体在安全领域的突破性实践。他指出,百度通过将安全能力…...

零基础设计模式——行为型模式 - 责任链模式
第四部分:行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习!行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想:使多个对象都有机会处…...

【JavaWeb】Docker项目部署
引言 之前学习了Linux操作系统的常见命令,在Linux上安装软件,以及如何在Linux上部署一个单体项目,大多数同学都会有相同的感受,那就是麻烦。 核心体现在三点: 命令太多了,记不住 软件安装包名字复杂&…...

Mac下Android Studio扫描根目录卡死问题记录
环境信息 操作系统: macOS 15.5 (Apple M2芯片)Android Studio版本: Meerkat Feature Drop | 2024.3.2 Patch 1 (Build #AI-243.26053.27.2432.13536105, 2025年5月22日构建) 问题现象 在项目开发过程中,提示一个依赖外部头文件的cpp源文件需要同步,点…...
Android第十三次面试总结(四大 组件基础)
Activity生命周期和四大启动模式详解 一、Activity 生命周期 Activity 的生命周期由一系列回调方法组成,用于管理其创建、可见性、焦点和销毁过程。以下是核心方法及其调用时机: onCreate() 调用时机:Activity 首次创建时调用。…...
CSS设置元素的宽度根据其内容自动调整
width: fit-content 是 CSS 中的一个属性值,用于设置元素的宽度根据其内容自动调整,确保宽度刚好容纳内容而不会超出。 效果对比 默认情况(width: auto): 块级元素(如 <div>)会占满父容器…...
BLEU评分:机器翻译质量评估的黄金标准
BLEU评分:机器翻译质量评估的黄金标准 1. 引言 在自然语言处理(NLP)领域,衡量一个机器翻译模型的性能至关重要。BLEU (Bilingual Evaluation Understudy) 作为一种自动化评估指标,自2002年由IBM的Kishore Papineni等人提出以来,…...

WebRTC调研
WebRTC是什么,为什么,如何使用 WebRTC有什么优势 WebRTC Architecture Amazon KVS WebRTC 其它厂商WebRTC 海康门禁WebRTC 海康门禁其他界面整理 威视通WebRTC 局域网 Google浏览器 Microsoft Edge 公网 RTSP RTMP NVR ONVIF SIP SRT WebRTC协…...