【Apifox】调用python脚本查询数据库并断言接口返回值是否满足条件

文章讲述了在Apifox中通过调用Python脚本进行接口测试和数据库查询的场景。作者因接口查询的SQL语句需包含前一个接口的userId,而Apifox内无法直接处理,故采用Python脚本动态构建SQL并执行,再将结果与接口返回值做断言比较,确保数据一致性。
摘要由CSDN通过智能技术生成

记录最近一次使用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~~

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值