接口相关理论
- ui功能测试和接口测试哪个先执行?–为什么
结论:接口测试先执行
原因:ui功能测试需要等待前端页面开发完成、后台接口开发完后且前端与后端联调完成。
- ui功能测试与接口测试的区别?
ui功能:功能调用(前端jS、服务器端)+页面布局+兼容
接口测试:完整的测试服务端功能验证。
- ui功能测试和接口测试哪个更高效?–为什么
结论:接口测试更高
原因:接口测试只测服务端功能以及没有多页面操作因素。
金融项目
测试对象:投资业务接口
待测接口
1、注册登录
注册图片验证码接口
注册手机验证码接口
注册接口
登录接口
查询登录状态接口
2、认证开户充值
认证接口
查询认证状态
请求后台开户接口
三方开户接口
请求充值验证码接口
请求后台充值接口
请求三方充值接口
3、投资
请求后台投资接口
三方投资接口
4、投资业务
注册图片验证码接口
注册手机验证码接口
注册接口
登录接口
认证接口
请求后台开户接口
三方开户接口
请求充值验证码接口
请求后台充值接口
请求三方充值接口
请求后台投资接口
三方投资接口
接口如何测试?
- 设计用例
- 使用工具
可视化工具: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属性值为参数值。
测试点提取
- 注册图片验证码、注册验证码
- 注册
- 登录
- 开户认证
- 充值
- 投资
测试用例
- 注册图片验证码、注册短信验证码
- 注册
- 登录
- 认证开户
- 充值
- 投资
- 投资业务
环境说明
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、三方充值和三方开户一模一样,直接复制即可。
- 投资