mirror of
https://github.com/httprunner/httprunner.git
synced 2026-07-09 06:23:52 +08:00
fix:修复sql_response_print的问题,sql_response_print有可能是None/dict/list
fix:增加sqlitedemo,修复sqlite3查询数据报错的问题
This commit is contained in:
BIN
examples/data/sqlite.db
Normal file
BIN
examples/data/sqlite.db
Normal file
Binary file not shown.
36
examples/sql/test_sql_demo.py
Normal file
36
examples/sql/test_sql_demo.py
Normal file
@@ -0,0 +1,36 @@
|
|||||||
|
import sys
|
||||||
|
from pathlib import Path
|
||||||
|
|
||||||
|
from httprunner.database.engine import DBEngine
|
||||||
|
|
||||||
|
sys.path.insert(0, str(Path(__file__).parent.parent))
|
||||||
|
|
||||||
|
from httprunner import HttpRunner, Config, Step, RunSqlRequest # noqa:E402
|
||||||
|
|
||||||
|
|
||||||
|
class TestCaseDemoSqlite(HttpRunner):
|
||||||
|
config = Config("run sqlite demo")
|
||||||
|
|
||||||
|
teststeps = [
|
||||||
|
Step(
|
||||||
|
RunSqlRequest("执行一个sqlite demo")
|
||||||
|
.fetchmany("select* from student;", 5)
|
||||||
|
.extract()
|
||||||
|
.with_jmespath("[0].name", "name")
|
||||||
|
.validate()
|
||||||
|
.assert_equal(
|
||||||
|
"[0]",
|
||||||
|
{
|
||||||
|
"id": 1,
|
||||||
|
"name": "Jack",
|
||||||
|
"fullname": {"first_name": "Jack", "last_name": "Tomson"},
|
||||||
|
},
|
||||||
|
)
|
||||||
|
.assert_equal("[0].fullname.first_name", "Jack")
|
||||||
|
)
|
||||||
|
]
|
||||||
|
|
||||||
|
def test_start(self):
|
||||||
|
eg = DBEngine(db_uri="sqlite:///../data/sqlite.db")
|
||||||
|
self.with_db_engine(eg)
|
||||||
|
super().test_start()
|
||||||
@@ -13,7 +13,7 @@ class DBEngine(object):
|
|||||||
|
|
||||||
"""
|
"""
|
||||||
engine = create_engine(db_uri)
|
engine = create_engine(db_uri)
|
||||||
self.session = sessionmaker(bind=engine)()
|
self.session = sessionmaker(bind=engine, autocommit=True)()
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def value_decode(row: dict):
|
def value_decode(row: dict):
|
||||||
@@ -38,11 +38,13 @@ class DBEngine(object):
|
|||||||
|
|
||||||
def _fetch(self, query, size=-1, commit=True):
|
def _fetch(self, query, size=-1, commit=True):
|
||||||
result = self.session.execute(query)
|
result = self.session.execute(query)
|
||||||
self.session.commit() if commit else 0
|
# self.session.commit() if commit else 0
|
||||||
if query.upper()[:6] == "SELECT":
|
if query.upper()[:6] == "SELECT":
|
||||||
if size < 0:
|
if size < 0:
|
||||||
al = result.fetchall()
|
al = result.fetchall()
|
||||||
al = [dict(el) for el in al]
|
al = [dict(el) for el in al]
|
||||||
|
for el in al:
|
||||||
|
self.value_decode(el)
|
||||||
return al or None
|
return al or None
|
||||||
elif size == 1:
|
elif size == 1:
|
||||||
on = dict(result.fetchone())
|
on = dict(result.fetchone())
|
||||||
@@ -51,6 +53,8 @@ class DBEngine(object):
|
|||||||
else:
|
else:
|
||||||
mny = result.fetchmany(size)
|
mny = result.fetchmany(size)
|
||||||
mny = [dict(el) for el in mny]
|
mny = [dict(el) for el in mny]
|
||||||
|
for el in mny:
|
||||||
|
self.value_decode(el)
|
||||||
return mny or None
|
return mny or None
|
||||||
elif query.upper()[:6] in ("UPDATE", "DELETE", "INSERT"):
|
elif query.upper()[:6] in ("UPDATE", "DELETE", "INSERT"):
|
||||||
return {"rowcount": result.rowcount}
|
return {"rowcount": result.rowcount}
|
||||||
@@ -75,4 +79,7 @@ class DBEngine(object):
|
|||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
db = DBEngine(f"mysql+pymysql://xxxxx:xxxxx@10.0.0.1:3306/dbname?charset=utf8mb4")
|
# db = DBEngine(f"mysql+pymysql://xxxxx:xxxxx@10.0.0.1:3306/dbname?charset=utf8mb4")
|
||||||
|
db = DBEngine(f"sqlite:////Users/bytedance/HttpRunner/examples/data/sqlite.db")
|
||||||
|
print(db.fetchmany("select* from student", 5))
|
||||||
|
print(db.fetchmany("select* from student", 5))
|
||||||
|
|||||||
@@ -105,7 +105,12 @@ def run_step_sql_request(runner: HttpRunner, step: TStep) -> StepResult:
|
|||||||
|
|
||||||
if USE_ALLURE:
|
if USE_ALLURE:
|
||||||
import allure
|
import allure
|
||||||
allure.attach(sql_request_print, name="sql request details", attachment_type=allure.attachment_type.TEXT)
|
|
||||||
|
allure.attach(
|
||||||
|
sql_request_print,
|
||||||
|
name="sql request details",
|
||||||
|
attachment_type=allure.attachment_type.TEXT,
|
||||||
|
)
|
||||||
logger.info(f"Executing SQL: {parsed_request_dict['sql']}")
|
logger.info(f"Executing SQL: {parsed_request_dict['sql']}")
|
||||||
if step.sql_request.method == SqlMethodEnum.FETCHONE:
|
if step.sql_request.method == SqlMethodEnum.FETCHONE:
|
||||||
sql_resp = runner.db_engine.fetchone(parsed_request_dict["sql"])
|
sql_resp = runner.db_engine.fetchone(parsed_request_dict["sql"])
|
||||||
@@ -125,15 +130,31 @@ def run_step_sql_request(runner: HttpRunner, step: TStep) -> StepResult:
|
|||||||
raise SqlMethodNotSupport(
|
raise SqlMethodNotSupport(
|
||||||
f"step.sql_request.method {parsed_request_dict['method']} not support"
|
f"step.sql_request.method {parsed_request_dict['method']} not support"
|
||||||
)
|
)
|
||||||
|
|
||||||
# log response
|
# log response
|
||||||
sql_response_print = "====== sql response details ======\n"
|
sql_response_print = "====== sql response details ======\n"
|
||||||
for k, v in sql_resp.items():
|
if isinstance(sql_resp, dict):
|
||||||
v = utils.omit_long_data(v)
|
for k, v in sql_resp.items():
|
||||||
sql_response_print += f"{k}: {repr(v)}\n"
|
v = utils.omit_long_data(v)
|
||||||
|
sql_response_print += f"{k}: {repr(v)}\n"
|
||||||
|
elif isinstance(sql_resp, list):
|
||||||
|
sql_response_print += f"count: {len(sql_resp)}\n"
|
||||||
|
sql_response_print += "-" * 34 + "\n"
|
||||||
|
for el in sql_resp:
|
||||||
|
for k, v in el.items():
|
||||||
|
v = utils.omit_long_data(v)
|
||||||
|
sql_response_print += f"{k}: {repr(v)}\n"
|
||||||
|
sql_response_print += "-" * 34 + "\n"
|
||||||
|
elif sql_resp is None:
|
||||||
|
sql_response_print += "None\n"
|
||||||
if USE_ALLURE:
|
if USE_ALLURE:
|
||||||
import allure
|
import allure
|
||||||
allure.attach(sql_request_print, name="sql response details", attachment_type=allure.attachment_type.TEXT)
|
|
||||||
|
allure.attach(
|
||||||
|
sql_response_print,
|
||||||
|
name="sql response details",
|
||||||
|
attachment_type=allure.attachment_type.TEXT,
|
||||||
|
)
|
||||||
|
|
||||||
resp_obj = SqlResponseObject(sql_resp, parser=runner.parser)
|
resp_obj = SqlResponseObject(sql_resp, parser=runner.parser)
|
||||||
step_variables["sql_response"] = resp_obj
|
step_variables["sql_response"] = resp_obj
|
||||||
|
|||||||
Reference in New Issue
Block a user