diff --git a/httprunner/runner.py b/httprunner/runner.py index 28b1022d..74347bee 100644 --- a/httprunner/runner.py +++ b/httprunner/runner.py @@ -226,6 +226,8 @@ class SessionRunner(object): self.__run_step(step) finally: logger.info(f"generate testcase log: {self.__log_path}") + if USE_ALLURE: + allure.attach.file(self.__log_path, name='all log', attachment_type=allure.attachment_type.TEXT) self.__duration = time.time() - self.__start_at return self diff --git a/httprunner/step_request.py b/httprunner/step_request.py index 9299cba2..14b31034 100644 --- a/httprunner/step_request.py +++ b/httprunner/step_request.py @@ -17,7 +17,7 @@ from httprunner.models import ( ) from httprunner.parser import build_url from httprunner.response import ResponseObject -from httprunner.runner import HttpRunner +from httprunner.runner import HttpRunner, USE_ALLURE def call_hooks( @@ -99,8 +99,32 @@ def run_step_request(runner: HttpRunner, step: TStep) -> StepResult: parsed_request_dict["verify"] = config.verify parsed_request_dict["json"] = parsed_request_dict.pop("req_json", {}) + # log request + request_print = "====== request details ======\n" + request_print += f"url: {url}\n" + request_print += f"method: {method}\n" + headers = parsed_request_dict.get("headers", {}) + request_print += f"headers: {headers}\n" + for k, v in parsed_request_dict.items(): + v = utils.omit_long_data(v) + request_print += f"{k}: {repr(v)}\n" + request_print += "\n" + # request + if USE_ALLURE: + import allure + allure.attach(request_print, name="request details", attachment_type=allure.attachment_type.TEXT) resp = runner.session.request(method, url, **parsed_request_dict) + + # log response + response_print = "====== response details ======\n" + response_print += f"status_code: {resp.status_code}\n" + response_print += f"headers: {resp.headers}\n" + response_print += f"body: {repr(resp.text)}\n" + + if USE_ALLURE: + import allure + allure.attach(response_print, name="response details", attachment_type=allure.attachment_type.TEXT) resp_obj = ResponseObject(resp, runner.parser) step.variables["response"] = resp_obj @@ -110,24 +134,7 @@ def run_step_request(runner: HttpRunner, step: TStep) -> StepResult: def log_req_resp_details(): err_msg = "\n{} DETAILED REQUEST & RESPONSE {}\n".format("*" * 32, "*" * 32) - - # log request - err_msg += "====== request details ======\n" - err_msg += f"url: {url}\n" - err_msg += f"method: {method}\n" - headers = parsed_request_dict.pop("headers", {}) - err_msg += f"headers: {headers}\n" - for k, v in parsed_request_dict.items(): - v = utils.omit_long_data(v) - err_msg += f"{k}: {repr(v)}\n" - - err_msg += "\n" - - # log response - err_msg += "====== response details ======\n" - err_msg += f"status_code: {resp.status_code}\n" - err_msg += f"headers: {resp.headers}\n" - err_msg += f"body: {repr(resp.text)}\n" + err_msg += request_print + response_print logger.error(err_msg) # extract diff --git a/httprunner/step_sql_request.py b/httprunner/step_sql_request.py index 4b6fedc0..6b396720 100644 --- a/httprunner/step_sql_request.py +++ b/httprunner/step_sql_request.py @@ -10,7 +10,7 @@ from httprunner.exceptions import ValidationFailure from httprunner.models import IStep, StepResult, TStep from httprunner.models import SqlMethodEnum, TSqlRequest from httprunner.response import SqlResponseObject -from httprunner.runner import HttpRunner +from httprunner.runner import HttpRunner, USE_ALLURE from httprunner.step_request import ( StepRequestExtraction, StepRequestValidation, @@ -94,6 +94,18 @@ def run_step_sql_request(runner: HttpRunner, step: TStep) -> StepResult: if step.setup_hooks: call_hooks(runner, step.setup_hooks, step.variables, "setup request") + # log request + sql_request_print = "====== sql request details ======\n" + sql_request_print += f"sql: {step.sql_request.sql}\n" + for k, v in parsed_request_dict.items(): + v = utils.omit_long_data(v) + sql_request_print += f"{k}: {repr(v)}\n" + + sql_request_print += "\n" + + if USE_ALLURE: + import allure + 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"]) @@ -113,6 +125,16 @@ 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 USE_ALLURE: + import allure + allure.attach(sql_request_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 @@ -122,21 +144,7 @@ def run_step_sql_request(runner: HttpRunner, step: TStep) -> StepResult: def log_sql_req_resp_details(): err_msg = "\n{} SQL DETAILED REQUEST & RESPONSE {}\n".format("*" * 32, "*" * 32) - - # log request - err_msg += "====== sql request details ======\n" - err_msg += f"sql: {step.sql_request.sql}\n" - for k, v in parsed_request_dict.items(): - v = utils.omit_long_data(v) - err_msg += f"{k}: {repr(v)}\n" - - err_msg += "\n" - - # log response - err_msg += "====== sql response details ======\n" - for k, v in sql_resp.items(): - v = utils.omit_long_data(v) - err_msg += f"{k}: {repr(v)}\n" + err_msg += sql_request_print + sql_response_print logger.error(err_msg) # extract diff --git a/httprunner/step_thrift_request.py b/httprunner/step_thrift_request.py index ea7aadf7..5ba44681 100644 --- a/httprunner/step_thrift_request.py +++ b/httprunner/step_thrift_request.py @@ -3,7 +3,6 @@ import platform import sys import time from typing import Text, Union - from loguru import logger from httprunner import utils @@ -17,11 +16,11 @@ from httprunner.models import ( TransType, ) from httprunner.response import ThriftResponseObject -from httprunner.runner import HttpRunner +from httprunner.runner import HttpRunner, USE_ALLURE from httprunner.step_request import ( + call_hooks, StepRequestExtraction, StepRequestValidation, - call_hooks, ) try: @@ -121,6 +120,17 @@ def run_step_thrift_request(runner: HttpRunner, step: TStep) -> StepResult: if step.setup_hooks: call_hooks(runner, step.setup_hooks, step.variables, "setup request") + # log request + thrift_request_print = "====== thrift request details ======\n" + thrift_request_print += f"psm: {psm}\n" + for k, v in parsed_request_dict.items(): + v = utils.omit_long_data(v) + thrift_request_print += f"{k}: {repr(v)}\n" + thrift_request_print += "\n" + if USE_ALLURE: + import allure + allure.attach(thrift_request_print, name="thrift request details", attachment_type=allure.attachment_type.TEXT) + # thrift request resp = runner.thrift_client.send_request( parsed_request_dict["params"], parsed_request_dict["method"] @@ -128,6 +138,15 @@ def run_step_thrift_request(runner: HttpRunner, step: TStep) -> StepResult: resp_obj = ThriftResponseObject(resp, parser=runner.parser) step.variables["thrift_response"] = resp_obj + # log response + thrift_response_print = "====== thrift response details ======\n" + for k, v in resp.items(): + v = utils.omit_long_data(v) + thrift_response_print += f"{k}: {repr(v)}\n" + if USE_ALLURE: + import allure + allure.attach(thrift_request_print, name="thrift response details", attachment_type=allure.attachment_type.TEXT) + # teardown hooks if step.teardown_hooks: call_hooks(runner, step.teardown_hooks, step.variables, "teardown request") @@ -136,21 +155,7 @@ def run_step_thrift_request(runner: HttpRunner, step: TStep) -> StepResult: err_msg = "\n{} THRIFT DETAILED REQUEST & RESPONSE {}\n".format( "*" * 32, "*" * 32 ) - - # log request - err_msg += "====== thrift request details ======\n" - err_msg += f"psm: {psm}\n" - for k, v in parsed_request_dict.items(): - v = utils.omit_long_data(v) - err_msg += f"{k}: {repr(v)}\n" - - err_msg += "\n" - - # log response - err_msg += "====== thrift response details ======\n" - for k, v in resp.items(): - v = utils.omit_long_data(v) - err_msg += f"{k}: {repr(v)}\n" + err_msg += thrift_request_print + thrift_response_print logger.error(err_msg) # extract