4.8 后置sql

原理

发送请求之后,执行SQL,并把结果加入到参数池中
存在${}语法将处理后再去执行SQL语句

前置处理

使用变量

来源: 响应提取后置SQL结果
使用$变量名 的方式来引用变量

使用函数

来源:tools/hooks.py 定义的函数
调用无参方法:${方法名()}
调用有参方法:${方法名(参数)}

经过上面两道工序处理之后,返回sql,再执行。

test_main.py
...

def test_start(case, get_db): # 只使用数据库操作
    """
    测试启动方法, 当需要使用 数据清洗和 数据库操作命令时将 get_db 换成 clear_db
    如只需要使用 数据库操作 则添加get_db 参数, 如一个都不需要则不添加
    :param case: 用例
    :return:
    """
    # 前置处理
    title, skip, header, path, method, data_type, file, data, extra, sql, expect = case
    ReportStyle.title(title)
    data_process.handle_case(path, header, skip, data, file)

    # 发送请求
    http_client.send_request(
        data_type,
        method,
        data_process.path,
        data_process.headers,
        data_process.body,
        data_process.files,
    )
    # 后置处理
    DataProcess.handle_extra(extra, http_client.response.json())

    data_process.sql = sql
    data_process.handle_sql(get_db) # 使用数据库

    # 断言
    DataProcess.assert_result(http_client.response.json(), expect)
...

config.yaml

# 数据库校验- mysql
database:
host: localhost
port: 3306
user: root
# 不用''会被解析成int类型数据
password: '123456'
db:  mydb

# 数据库所在的服务器配置
ssh_server:
    port: 22
    username: root
    password: '123456'
    # 私有密钥文件路径
    private_key_file:
    # 私钥密码
    private_password:
    # 如果使用的docker容器部署mysql服务,需要传入mysql的容器id/name
    mysql_container: mysql8
    # 数据库备份文件导出的本地路径, 需要保证存在该文件夹
    sql_data_file: backup_sql/
表数据
  • apis表 apis table
  • cases表 cases
单条SQL

用例数据

用例标题 是否跳过 请求头 请求地址 请求方式 入参关键字 上传文件 请求数据 提取参数 后置SQL 预期结果
登录 FALSE login post data {"username": "admin", "password": ""} {"msg":"$.meta.msg"} select * from apis; {"$.meta.status":400}

结果

执行参数字典为:

{
"msg": "参数错误"
}
sql执行结果为:
null

多条SQL

用例数据

用例标题 是否跳过 请求头 请求地址 请求方式 入参关键字 上传文件 请求数据 提取参数 后置SQL 预期结果
登录 FALSE login post data {"username": "admin", "password": ""} {"msg":"$.meta.msg"} select * from apis; select * from cases {"$.meta.status":400}

结果

执行后参数字典为:

{
    "msg": "参数错误",
    "id": 1,
    "name": "updatehahaha",
    "path": null,
    "body": null,
    "expected": "{\"msg\": \"你好\"}",
    "api_id": 1,
    "create_at": "2021-05-17 17:23:54",
    "update_at": "2021-05-17 17:23:54"
}
sql执行结果为:
{
    "id": 1,
    "name": "updatehahaha",
    "path": null,
    "body": null,
    "expected": "{\"msg\": \"你好\"}",
    "api_id": 1,
    "create_at": "2021-05-17 17:23:54",
    "update_at": "2021-05-17 17:23:54"
}