记录最近一次使用apifox调试接口,断言需要对比数据库与接口返回值是否一致的处理情况
本来没想用python脚本,但是由于查询的sql语句中,有一个userId是从前一个接口获取的,基于不想把自动化脚本写死的前提,发现apifox里面调用数据库操作时,好像没有可以调用变量的位置(也可能是我没发现),为了快速解决我遇到的问题,我只能曲线救国,调用python脚本,将上个接口返回的userId以传参的方式传入python脚本中,然后在脚本中实现数据库连接和查询。
第一步,编写python脚本:
import argparse
import pymysql
def test_auth(userId):
conn = pymysql.connect(
host='127.01.01.01',
port=3306,
user='root',
passwd='******', # password也可以
db='test',
charset='utf8') # 如果查询有中文需要指定数据库编码
# 2. 从连接建立游标(有了游标才能操作数据库)
cur = conn.cursor()
#简单粗暴的拼接
sql1 ="SELECT COUNT(DISTINCT B.EMP_IDCARD) FROM `test`.`t_employee_project` B LEFT JOIN `test`.`t_employee_info` A ON A.ID =B.EMP_ID WHERE A.FILE_STATUS = '0' AND A.DELETE_FLAG = '0' AND B.DELETE_FLAG = '0' AND B.DEPT_ID IN (SELECT SETTLE_DOMAIN_ID FROM `test`.`t_cutsomer_data_permisson` WHERE USER_ID ="
sql2="AND `STATUS` ='0')"
sql = sql1+' '+userId+' '+sql2
# 3. 查询数据库(读)
cur.execute(sql)
# 4. 获取查询结果
result = cur.fetchall()[0][0]
#print(result)
# 5. 关闭游标及连接
cur.close()
conn.close()
if __name__ == "__main__":
#设置+获取变量
parser = argparse.ArgumentParser()
parser.add_argument('--userId', type=str, default=None)
args = parser.parse_args()
print(f'用户id:,args.userId={args.userId}')
test_auth(args.userId)
这里调用了两个库:argparse 和 pymysql。前者还是为了实现从apifox向python中传参,后者是为了使用数据库操作。这里,我为了把传入的userId写入sql里面,直接把语句拆成了三段,然后进行拼接使用。脚本完成后,可以直接使用命令行调用,检查传参和查询结果是否正确。
PS,这里有个注意项,数据库名、表名需要使用反引号``(即:键盘ESC下面的那个按键)圈起来。因为查询的时候,这些好像使用了mysql的保留字。
第二步,先将准备好的python脚本丢进apifox的外部程序目录(路径:应用左下角设置-外部程序,打开目录即可)。
第三步,在需要做断言的接口处添加后置操作-自定义脚本。
//把response转换为json字符串
var jsonData = JSON.parse(responseBody);
pm.variables.set("amount", jsonData.data.total);
var queryAmount = pm.variables.get("amount").toString();
//console.log(pm.variables.get("nickname")+"在档人员总数量为:"+pm.variables.get("amount"));
try {
//获取登录用户id
var userId = '--userId='+pm.environment.get("userId");
//执行python文件,查询数据库满足条件的在档人员数量
var DBamount = pm.execute("checkAuthemployee.py",[userId]);
//提取Python脚本执行sql语句返回值的最后一个单词
var lastword = DBamount.match(/\w+$/)[0];
//console.log(lastword);
tests["人员列表查询数据量准确"] = queryAmount === lastword;
} catch (e) {
console.error(e.message)
}
这里,首先获取接口返回值中的参数amount,并且强制转换成了string格式(因为python脚本执行获取的结果也是个string)。然后调用python语句,获取我们整个脚本的返回值,由于得到的结果形如:
我需要的结果为红色方框圈的位置。所以,又是一次简单粗暴的字符串拆分,获取需要的最后一个单词,str.match(/\w+$/)[0]。然后,就可以进行数据对比啦。
OVER~~