Skip to content

Commit

Permalink
添加用例数据SQL查询类型支持 (#174)
Browse files Browse the repository at this point in the history
  • Loading branch information
wu-clan authored Apr 8, 2024
1 parent 09744ba commit 1b621a3
Show file tree
Hide file tree
Showing 4 changed files with 22 additions and 9 deletions.
12 changes: 8 additions & 4 deletions httpfpt/common/send_request.py
Original file line number Diff line number Diff line change
Expand Up @@ -169,8 +169,10 @@ def send_request(
if relate_parsed_data:
parsed_data = relate_parsed_data
elif key == SetupType.SQL:
sql = var_extractor.vars_replace({'sql': value}, parsed_data['env'])['sql']
mysql_client.exec_case_sql(sql, parsed_data['env'])
setup_sql = var_extractor.vars_replace({'sql': value}, parsed_data['env'])
sql = setup_sql['sql']
sql_fetch = setup_sql.get('fetch')
mysql_client.exec_case_sql(sql, sql_fetch, parsed_data['env'])
elif key == SetupType.HOOK:
hook_executor.exec_hook_func(value)
elif key == SetupType.WAIT_TIME:
Expand Down Expand Up @@ -261,8 +263,10 @@ def send_request(
for key, value in item.items():
if value is not None:
if key == TeardownType.SQL:
sql = var_extractor.vars_replace({'sql': value}, parsed_data['env'])['sql']
mysql_client.exec_case_sql(sql, parsed_data['env'])
teardown_sql = var_extractor.vars_replace({'sql': value}, parsed_data['env'])
sql = teardown_sql['sql']
sql_fetch = teardown_sql.get('fetch')
mysql_client.exec_case_sql(sql, sql_fetch, parsed_data['env'])
if key == TeardownType.HOOK:
hook_executor.exec_hook_func(value)
if key == TeardownType.EXTRACT:
Expand Down
7 changes: 5 additions & 2 deletions httpfpt/db/mysql_db.py
Original file line number Diff line number Diff line change
Expand Up @@ -128,19 +128,22 @@ def execute(self, sql: str) -> int:
finally:
self.close(conn, cursor)

def exec_case_sql(self, sql: str, env: str | None = None) -> dict | list | int | None:
def exec_case_sql(self, sql: str, fetch: QueryFetchType | None, env: str | None = None) -> dict | list | int | None:
"""
执行用例 sql
:param sql:
:param fetch:
:param env:
:return:
"""
# 获取返回数据
if isinstance(sql, str):
log.info(f'执行 SQL: {sql}')
if sql.startswith(SqlType.select):
return self.query(sql)
if fetch is None:
fetch = QueryFetchType.ALL
return self.query(sql, fetch)
else:
return self.execute(sql)

Expand Down
9 changes: 7 additions & 2 deletions httpfpt/schemas/case_data.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,14 @@
# -*- coding: utf-8 -*-
from __future__ import annotations

from typing import Any
from typing import TYPE_CHECKING, Any

from pydantic import AnyHttpUrl, BaseModel, ConfigDict, Field
from typing_extensions import Literal

if TYPE_CHECKING:
from httpfpt.enums.query_fetch_type import QueryFetchType

__all__ = [
'CaseData',
'CaseCacheData',
Expand Down Expand Up @@ -65,8 +68,9 @@ class SetupTestCaseData(BaseModel):

class SetupSqlData(BaseModel):
key: str
type: Literal['cache', 'wnv', 'global']
type: Literal['cache', 'env', 'global']
sql: str
fetch: QueryFetchType | None = None
jsonpath: str


Expand Down Expand Up @@ -110,6 +114,7 @@ class TeardownJsonAssertData(BaseModel):

class TeardownSqlAssertData(TeardownJsonAssertData):
sql: str
fetch: QueryFetchType | None = None


class TeardownJsonSchemaAssertData(BaseModel):
Expand Down
3 changes: 2 additions & 1 deletion httpfpt/utils/assert_control.py
Original file line number Diff line number Diff line change
Expand Up @@ -122,13 +122,14 @@ def _sql_asserter(self, assert_text: dict) -> None:
assert_value = assert_text['value']
assert_type = assert_text['type']
assert_sql = assert_text['sql']
assert_fetch = assert_text.get('fetch')
assert_jsonpath = assert_text['jsonpath']
except KeyError as e:
raise AssertSyntaxError(f'SQL 断言格式错误, 请检查: {e}')
else:
if assert_sql.split(' ')[0].upper() != SqlType.select:
raise AssertSyntaxError(f'SQL 断言 {assert_check}:{assert_type} 执行失败,请检查 SQL 是否为 DQL 类型')
sql_data = mysql_client.exec_case_sql(assert_sql)
sql_data = mysql_client.exec_case_sql(assert_sql, assert_fetch)
if not isinstance(sql_data, dict):
raise JsonPathFindError('jsonpath 取值失败, SQL 语句执行结果不是有效的 dict 类型')
sql_value = findall(assert_jsonpath, sql_data)
Expand Down

0 comments on commit 1b621a3

Please sign in to comment.