pytest + yaml 框架 -57.用例前置和后置操作执行sql

前言

前面一篇已经介绍在用例中可以查询以及在断言中实现sql,本篇讲解在用例的前置和后置操作中执行sql

配置mysql环境,参考前面一篇https://www.cnblogs.com/yoyoketang/p/16977960.html

有 2 内置的函数可以使用

  • query_sql(sql) 查询 sql, 查询无结果返回[], 查询只有一个结果返回 dict, 查询多个结果返回 List[dict]
  • execute_sql(sql) 执行 sql, 操作新增,修改,删除的 sql

按步骤执行sql

方案一:可以对测试用例,加一个步骤,这样就可以实现在接口的请求前或请求后执行sql

请求前执行 sql, 执行sql的函数随便定义一个关键字,比如print,variables,extract 它都会去执行函数

yaml 复制代码
config:
  name: 1.执行sql当成用例的步骤
  variables:
    sql1: update auth_user set email='121@qq.com' where username like 'test';
test_x1:
-
  name: 步骤1-请求前执行sql
  print: '${execute_sql(sql1)}'
-
  name: 步骤2-执行用例
  request:
    url: http://example.com
    method: get

请求后执行 sql

yaml 复制代码
config:
  name: 1.执行sql当成用例的步骤
  variables:
    sql1: update auth_user set email='121@qq.com' where username like 'test';
test_x2:
-
  name: 步骤1-执行用例
  request:
    url: http://example.com
    method: get
-
  name: 步骤2-请求后执行sql
  print: '${execute_sql(sql1)}'

同一个步骤中实现

方案二:如果你不想分2个步骤,在一个用例步骤中也能实现

  • variables 关键字是在请求之前执行的,所以可以在variables中执行sql,实现前置操作
  • extract 关键字是在请求之后执行的,所以可以在extract中执行sql,实现后置操作

使用示例

yaml 复制代码
config:
  name: 1.执行sql当成用例的步骤
  variables:
    sql1: update auth_user set email='121@qq.com' where username like 'test';
    sql2: update auth_user set email='321@qq.com' where username like 'test';
test_x3:
  name: 步骤1-执行用例
  variables:
    x1: '${execute_sql(sql1)}'
  request:
    url: http://example.com
    method: get
  extract:
    x2: '${execute_sql(sql2)}'

自定义fixture实现前置和后置操作

pytest 框架可以用fixture来实现用例的前置和后置操作,于是可以在conftest.py 中自定义fixture来完成

方案三:自定义fixture功能

python 复制代码
# conftest.py
from pytest_yaml_yoyo.db import ConnectMysql
import pytest


@pytest.fixture(scope='session')
def db_instance(environ):
    # 连上数据库,读取环境配置
    db = ConnectMysql(**environ.DB_INFO)
    yield db
    db.close()


@pytest.fixture()
def run_sql(db_instance):
    sql1 = "update auth_user set email='123@qq.com' where username like 'test';"
    res = db_instance.execute_sql(sql1)
    print(f'前置操作: {res}')
    yield
    sql2 = "update auth_user set email='321@qq.com' where username like 'test';"
    res = db_instance.execute_sql(sql2)
    print(f'后置操作: {res}')

yaml 用例部分

yaml 复制代码
config:
  name: 1.执行sql当成用例的步骤
  fixtures: run_sql
  variables:
    sql1: update auth_user set email='121@qq.com' where username like 'test';
test_x2:
  name: 步骤1-执行用例
  request:
    url: http://example.com
    method: get

总结

使用误区:能否用hooks钩子功能实现操作sql?

关于hooks钩子功能介绍参考这篇https://www.cnblogs.com/yoyoketang/p/16938512.html

hooks 功能的目的是请求预处理,一般接口的sign前面,接口参数加密可以用到,还有response的接口返回对象加密或其它预处理。

操作sql是用例的前置和后置操作,跟接口的预处理没啥关系,所以不能在hooks里面执行sql。

其它解决思路

另外一种解决思路,在测试步骤中新增setup_sql 和 teardown_sql 关键字执行sql语句,目前考虑新增关键字会带来学习成本。

在已有的框架上能解决问题,就先不增加额外关键字了。

如果有同学觉得有必要新增这2个关键字,可以在gitee上提issue https://gitee.com/yoyoketang/pytest-yaml-yoyo/issues

相关推荐
小白学大数据10 分钟前
从携程爬取的杭州酒店数据中提取价格、评分与评论的关键信息
爬虫·python·性能优化
IT学长编程28 分钟前
计算机毕业设计 基于Python的热门游戏推荐系统的设计与实现 Django 大数据毕业设计 Hadoop毕业设计选题【附源码+文档报告+安装调试】
大数据·python·django·毕业设计·课程设计·毕业论文
Ashlee_code1 小时前
什么是TRS收益互换与场外个股期权:从金融逻辑到系统开发实践
大数据·人工智能·python·金融·系统架构·清算·柜台
今天没有盐1 小时前
Python编程实战:日期处理与数学算法综合练习
python·pycharm·编程语言
宸津-代码粉碎机2 小时前
Java内部类内存泄露深度解析:原理、场景与根治方案(附GC引用链分析)
java·开发语言·jvm·人工智能·python
weixin_307779132 小时前
Python编码规范之字符串规范修复程序详解
开发语言·python·代码规范
爬台阶的蚂蚁2 小时前
使用 UV 工具管理 Python 项目的常用命令
python·uv
郝学胜-神的一滴2 小时前
深入理解 Python 的 __init_subclass__ 方法:自定义类行为的新方式 (Effective Python 第48条)
开发语言·python·程序人生·个人开发
王景程2 小时前
让IOT版说话
后端·python·flask
JJJJ_iii3 小时前
【机器学习11】决策树进阶、随机森林、XGBoost、模型对比
人工智能·python·神经网络·算法·决策树·随机森林·机器学习