From 4498dfa9c66554ecc598809881a6834039609de8 Mon Sep 17 00:00:00 2001 From: "duanchao.bill" Date: Thu, 16 Jun 2022 11:38:25 +0800 Subject: [PATCH 1/2] =?UTF-8?q?fix:=E4=BF=AE=E5=A4=8Dsql=5Fresponse=5Fprin?= =?UTF-8?q?t=E7=9A=84=E9=97=AE=E9=A2=98=EF=BC=8Csql=5Fresponse=5Fprint?= =?UTF-8?q?=E6=9C=89=E5=8F=AF=E8=83=BD=E6=98=AFNone/dict/list=20fix:?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0sqlitedemo=EF=BC=8C=E4=BF=AE=E5=A4=8Dsqlite3?= =?UTF-8?q?=E6=9F=A5=E8=AF=A2=E6=95=B0=E6=8D=AE=E6=8A=A5=E9=94=99=E7=9A=84?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- examples/data/sqlite.db | Bin 0 -> 12288 bytes examples/sql/test_sql_demo.py | 36 +++++++++++++++++++++++++++++++++ httprunner/database/engine.py | 13 +++++++++--- httprunner/step_sql_request.py | 33 ++++++++++++++++++++++++------ 4 files changed, 73 insertions(+), 9 deletions(-) create mode 100644 examples/data/sqlite.db create mode 100644 examples/sql/test_sql_demo.py diff --git a/examples/data/sqlite.db b/examples/data/sqlite.db new file mode 100644 index 0000000000000000000000000000000000000000..49485ef36b87a5bb19f4c9e96a11207467e69357 GIT binary patch literal 12288 zcmeI#KTE?v7zXgWTvb|;xJZXCN2V5vO2x&=su?P!P}|}kka{*(JxmiwuUe1{eh9yT zAIA^l0{cgEVJg) zebVT{{--S?o1LpQ^VYH(#C|ag3IY&-00bZa0SG_<0uX=z1R(I21xc=Tl~gt3b;e8C3%@lKfsogIf`mYulCTaN_&3P|K;VBzJRW3u3?8&!(Xu z009U<00Izz00bZa0SG_<0ucC(K#k>S@sib*uYyNssG_m%C)aOh&zWUT)$zqw)|AqT zcdZ=VkXGFjqwI)@G83oD_mxTGxJGmN4RI_6cbTaq%1m{`(Krm8xM2Q?*>A-Du-{EX lK>z{}fB*y_009U<00Izz00bcL4+NGNrHm!3Wigh|e**Zte>(sG literal 0 HcmV?d00001 diff --git a/examples/sql/test_sql_demo.py b/examples/sql/test_sql_demo.py new file mode 100644 index 00000000..b0ed6f5f --- /dev/null +++ b/examples/sql/test_sql_demo.py @@ -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() diff --git a/httprunner/database/engine.py b/httprunner/database/engine.py index 7919739c..596e5277 100644 --- a/httprunner/database/engine.py +++ b/httprunner/database/engine.py @@ -13,7 +13,7 @@ class DBEngine(object): """ engine = create_engine(db_uri) - self.session = sessionmaker(bind=engine)() + self.session = sessionmaker(bind=engine, autocommit=True)() @staticmethod def value_decode(row: dict): @@ -38,11 +38,13 @@ class DBEngine(object): def _fetch(self, query, size=-1, commit=True): 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 size < 0: al = result.fetchall() al = [dict(el) for el in al] + for el in al: + self.value_decode(el) return al or None elif size == 1: on = dict(result.fetchone()) @@ -51,6 +53,8 @@ class DBEngine(object): else: mny = result.fetchmany(size) mny = [dict(el) for el in mny] + for el in mny: + self.value_decode(el) return mny or None elif query.upper()[:6] in ("UPDATE", "DELETE", "INSERT"): return {"rowcount": result.rowcount} @@ -75,4 +79,7 @@ class DBEngine(object): 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)) diff --git a/httprunner/step_sql_request.py b/httprunner/step_sql_request.py index ac90af58..128264d2 100644 --- a/httprunner/step_sql_request.py +++ b/httprunner/step_sql_request.py @@ -105,7 +105,12 @@ def run_step_sql_request(runner: HttpRunner, step: TStep) -> StepResult: if USE_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']}") if step.sql_request.method == SqlMethodEnum.FETCHONE: 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( f"step.sql_request.method {parsed_request_dict['method']} not support" ) + # log response sql_response_print = "====== sql response details ======\n" - for k, v in sql_resp.items(): - v = utils.omit_long_data(v) - sql_response_print += f"{k}: {repr(v)}\n" - + if isinstance(sql_resp, dict): + for k, v in sql_resp.items(): + 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: 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) step_variables["sql_response"] = resp_obj From 385e1c82816095817992c8623c7c699f7a5bf9bb Mon Sep 17 00:00:00 2001 From: "duanchao.bill" Date: Thu, 16 Jun 2022 22:01:32 +0800 Subject: [PATCH 2/2] =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=97=A0=E7=94=A8?= =?UTF-8?q?=E6=B3=A8=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- httprunner/database/engine.py | 1 - 1 file changed, 1 deletion(-) diff --git a/httprunner/database/engine.py b/httprunner/database/engine.py index 596e5277..9bddad1d 100644 --- a/httprunner/database/engine.py +++ b/httprunner/database/engine.py @@ -38,7 +38,6 @@ class DBEngine(object): def _fetch(self, query, size=-1, commit=True): result = self.session.execute(query) - # self.session.commit() if commit else 0 if query.upper()[:6] == "SELECT": if size < 0: al = result.fetchall()