支付下单接口
-
请求方法: post
-
请求地址:http://shop.lemonban.com:8107/p/order/pay
-
请求参数:{“payType”:3,“orderNumbers”:“1733308182027309056”}
-
请求头部: {“Content-Type”:“application/json”,“Authorization”: “bearer12fa7db3-1270-4ab1-8d48-ba1b7dccc4bb”}
-
响应结果: weixin://wxpay/bizpayurl?pr=L4PuyAZzz [支付二维码地址,二维码本身就是一个地址]
-
将url地址转化为二维码的工具:https://cli.im/text
-
这个二维码包括信息:商户信息+订单信息+商城回调地址 【给微信第三方用的】
-
商城的回调地址: 是一个由商城提供的地址,给第三方支付平台调用的地址。
- 因为用户手机支付的时候,并不是直接向商城平台支付的,而是向微信支付的,钱是转给微信的;所以商城平台需要微信告诉我 订单是否支付成功;
- 这个是否支付成功的状态就是通过商城回调地址告诉商城支付状态的,比如微信会调用这个支付回调地址告诉商城支付结果作为返回结果给商城。
- 抓包只能抓电商项目本身的前端和后端交互报文 不能抓第三方交互报文。
- 前端一致发送探测包 检测订单的支付状态,如果没有收到True的结果 【订单已经支付的结果】,那么就不会发送页面跳转。
-
支付的前端、后端、第三方的业务交互流程:
我们现在做接口自动化测试,如何解决微信支付的问题呢?
- 手机支付,操作太麻烦,而且没有必要。
- 我们可以模拟一个微信支付的订单接口回调接口【mock】,然后自己去调这个接口,设置状态,模拟这个流程。
- mock: 模拟一个接口结果
- 第三方接口对接,需要得到第三方接口的返回结果的时候,就需要用mock服务假装 模拟这个返回结果,保证接口的流程是通畅;继续做测试。
- 这个回调接口跟开发提供给微信端的真正的回调地址其实是差不多的 只是做一个假的 给我们测试内部使用。-内部调用这个回调地址 设置支付状态。不需要第三方。
- 这样我们就不需要真正的支付 就可以走支付的流程了。依然可以验证业务逻辑的正确性。在测试环境一般都是这样实现的。
- 以下就是我们这个商城项目开发提供给我们测试用的一个回调接口:
- 跟普通的接口测试一样: 请求方法 请求参数 请求地址 返回结果 也可以修改数据库的表的数据:
业务流程弄清楚之后,我们再来用咱们框架来表示和运行:
第一步: 先完成excel用例的维护:
加上3条用例:8-9-10;支付下单,模拟回调接口【设置支付成功】,查询订单支付状态。
提交订单后,要做数据提取: {“orderNumbers”:“$…orderNumbers”}
这里注意一个问题: 最后一个接口 查询订单状态接口的url’地址后面拼接了一个订单号:
这个要参数化,也就是要设置占位符
然后url地址也要再使用之前完成替换。 ==修改requests_api方法。
- 跟普通的接口测试一样: 请求方法 请求参数 请求地址 返回结果 也可以修改数据库的表的数据:
第二步:在flow的测试用例脚本里,运行验证这个模块的用例。
数据库断言
有些结果响应结果断言不能完全确认结果是正确的【或者接口本身就没有任何数据返回的】。做接口测试是关注数据库的数据,确认测试结果:
- 比如注册,成功了, 数据库里会增加一条记录;
- 比如订单下单成功了,订单表里的增加一条目;
- 比如支付成功后,订单的状态会变化。
这些我们都需要去数据库里进行确认,不能仅仅通过响应结果确认,因为接口响应结果比较简单 ,不能显示所有数据【之前就遇到
过bug:响应结果ok,但是数据库里不正确,依然是bug】。
所以,接口测试里做数据库的断言是非常有必要的。
问题: 哪些接口需要做数据库的断言?
- 涉及到数据库的数据变更的接口需要做数据库的断言。会去更新或者新增数据库的接口。
- 比如注册【用户表里新增一个条目】,下单【订单表里新增一条记录】,支付后获取订单状态【数据库里的订单的状态 还有支付状态】等。
怎么做的数据库的断言?
- 参考前置sql : 数据操作
- 参考响应断言: 预期结果 实际结果
- 数据库断言: sql 【查询数据库结果】,数据库查询的预期结果是什么
- {“sql”:“预期结果”} --excel json格式,
数据库的断言的思路和步骤:
- 0、在excel表格里把数据库断言的:
- 同样用json格式表示: {“sql表达式”:“预期结果”}
- 1、先读取数据出来-- 反序列化 转化字典 :
{"select count(*) from tz_order where order_number = '#orderNumbers#'":1,
- 2、得到key【sql】 和value【预期数据库查询结果】
- 3、替换一下sql里的占位符
- 4、调用数据库封装的方法 执行查询语句 得到数据库查询结果
- 5、把预期结果和查询结果 断言
- 6、最后加上日志和异常捕获 + 判空处理。
"""
数据库的断言的思路和步骤:
0、在excel表格里把数据库断言的:
* 同样用json格式表示: {"sql表达式":"预期结果"}
1、先读取数据出来-- 反序列化 转化字典 : {"select count(*) from tz_order where order_number = '#orderNumbers#'":1,
"select status from tz_order where order_number = '#orderNumbers#'":1}
2、得到key【sql】 和value【预期数据库查询结果】
3、替换一下sql里的占位符
4、调用数据库封装的方法 执行查询语句 得到数据库查询结果
5、把预期结果和查询结果 断言
6、最后加上日志和异常捕获 + 判空处理。
"""
import json
from tools.handle_replace import replace_mark
from tools.handle_mysql import HandleMysql
from datas.db_data import my_db
assert_data = '''{"select count(*) from tz_order where order_number = '#orderNumbers#'":1,
"select status from tz_order where order_number = '#orderNumbers#'":1}'''
# 第一步:先读取数据出来-- 反序列化 转化字典
assert_data = json.loads(assert_data)
# 第二步: 得到key【sql】 和value【预期数据库查询结果】
for k,v in assert_data.items(): # k是sql语句,v是数据库预期结果
# 第三步: sql里有占位符,先替换-调用replace方法
k = replace_mark(k)
# 第四步: 调用数据库封装的方法 执行查询语句 得到数据库查询结果
sql_result = HandleMysql(**my_db).query_data(k) # 数据库的查询结果:{'count(*)': 1}| {'status': 2}
# 第五步: 把预期结果和查询结果 断言
for i in sql_result.values(): # i是数据库查询结果字典的values 1 2这个数据 ==执行结果
assert i == v
#数据库断言封装
handle_db_assert.py
"""
1、def封装
2、参数化
3、返回值: 数据库断言不需要返回值
4、加上日志: 但凡你想确认数据结果的地方 都可以加上日志
5、因为有些接口不需要做数据提取,所以判空处理:
6、异常捕获: 因为断言失败要加日志 记录 并raise错误 使测试用例失败
"""
import json
from tools.handle_replace import replace_mark
from tools.handle_mysql import HandleMysql
from datas.db_data import my_db
from loguru import logger
def database_assert(assert_data):
if assert_data is None: # 判空处理
return
logger.info("--------------------数据库断言开始----------------------------")
# 第一步:先读取数据出来-- 反序列化 转化字典
assert_data = json.loads(assert_data)
logger.info(f"数据库断言的表达式:{assert_data}")
# 第二步: 得到key【sql】 和value【预期数据库查询结果】
for k,v in assert_data.items(): # k是sql语句,v是数据库预期结果
# 第三步: sql里有占位符,先替换-调用replace方法
k = replace_mark(k)
logger.info(f"数据库查询sql是{k}")
# 第四步: 调用数据库封装的方法 执行查询语句 得到数据库查询结果
sql_result = HandleMysql(**my_db).query_data(k) # 数据库的查询结果:{'count(*)': 1}| {'status': 2}
# 第五步: 把预期结果和查询结果 断言
for i in sql_result.values(): # i是数据库查询结果字典的values 1 2这个数据 ==执行结果
logger.info(f"数据库断言的实际结果是{i}")
logger.info(f"数据库断言的预期结果是{v}")
try:
assert i == v
logger.info("数据库断言成功!")
except AssertionError as e:
logger.error("数据库断言失败!")
raise e
if __name__ == '__main__':
assert_data = '''{"select count(*) from tz_order where order_number = '#orderNumbers#'":1,
"select status from tz_order where order_number = '#orderNumbers#'":1}'''
database_assert(assert_data)