前面一篇已经介绍在用例中可以查询以及在断言中实现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的函数随便定义一个关键字,比如print,variables,extract 它都会去执行函数
config:
name: 1.执行sql当成用例的步骤
variables:
sql1: update auth_user set email='[email protected]' where username like 'test';
test_x1:
-
name: 步骤1-请求前执行sql
print: '${execute_sql(sql1)}'
-
name: 步骤2-执行用例
request:
url: http://example.com
method: get
请求后执行 sql
config:
name: 1.执行sql当成用例的步骤
variables:
sql1: update auth_user set email='[email protected]' where username like 'test';
test_x2:
-
name: 步骤1-执行用例
request:
url: http://example.com
method: get
-
name: 步骤2-请求后执行sql
print: '${execute_sql(sql1)}'
方案二:如果你不想分2个步骤,在一个用例步骤中也能实现
使用示例
config:
name: 1.执行sql当成用例的步骤
variables:
sql1: update auth_user set email='[email protected]' where username like 'test';
sql2: update auth_user set email='[email protected]' 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)}'
pytest 框架可以用fixture来实现用例的前置和后置操作,于是可以在conftest.py 中自定义fixture来完成
方案三:自定义fixture功能
# 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='[email protected]' where username like 'test';"
res = db_instance.execute_sql(sql1)
print(f'前置操作: {res}')
yield
sql2 = "update auth_user set email='[email protected]' where username like 'test';"
res = db_instance.execute_sql(sql2)
print(f'后置操作: {res}')
yaml 用例部分
config:
name: 1.执行sql当成用例的步骤
fixtures: run_sql
variables:
sql1: update auth_user set email='[email protected]' 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