run teststep: request
(runner: HttpRunner, step: TStep)
| 78 | |
| 79 | |
| 80 | def run_step_request(runner: HttpRunner, step: TStep) -> StepResult: |
| 81 | """run teststep: request""" |
| 82 | step_result = StepResult( |
| 83 | name=step.name, |
| 84 | step_type="request", |
| 85 | success=False, |
| 86 | ) |
| 87 | start_time = time.time() |
| 88 | |
| 89 | # parse |
| 90 | functions = runner.parser.functions_mapping |
| 91 | step_variables = runner.merge_step_variables(step.variables) |
| 92 | prepare_upload_step(step, step_variables, functions) |
| 93 | # parse variables |
| 94 | step_variables = parse_variables_mapping(step_variables, functions) |
| 95 | |
| 96 | request_dict = step.request.dict() |
| 97 | request_dict.pop("upload", None) |
| 98 | parsed_request_dict = runner.parser.parse_data(request_dict, step_variables) |
| 99 | |
| 100 | request_headers = parsed_request_dict.pop("headers", {}) |
| 101 | # omit pseudo header names for HTTP/1, e.g. :authority, :method, :path, :scheme |
| 102 | request_headers = { |
| 103 | key: request_headers[key] for key in request_headers if not key.startswith(":") |
| 104 | } |
| 105 | request_headers[ |
| 106 | "HRUN-Request-ID" |
| 107 | ] = f"HRUN-{runner.case_id}-{str(int(time.time() * 1000))[-6:]}" |
| 108 | parsed_request_dict["headers"] = request_headers |
| 109 | |
| 110 | step_variables["request"] = parsed_request_dict |
| 111 | |
| 112 | # setup hooks |
| 113 | if step.setup_hooks: |
| 114 | call_hooks(runner, step.setup_hooks, step_variables, "setup request") |
| 115 | |
| 116 | # prepare arguments |
| 117 | config = runner.get_config() |
| 118 | method = parsed_request_dict.pop("method") |
| 119 | url_path = parsed_request_dict.pop("url") |
| 120 | url = build_url(config.base_url, url_path) |
| 121 | parsed_request_dict["verify"] = config.verify |
| 122 | parsed_request_dict["json"] = parsed_request_dict.pop("req_json", {}) |
| 123 | |
| 124 | # log request |
| 125 | request_print = "====== request details ======\n" |
| 126 | request_print += f"url: {url}\n" |
| 127 | request_print += f"method: {method}\n" |
| 128 | for k, v in parsed_request_dict.items(): |
| 129 | request_print += f"{k}: {pretty_format(v)}\n" |
| 130 | |
| 131 | logger.debug(request_print) |
| 132 | if ALLURE is not None: |
| 133 | ALLURE.attach( |
| 134 | request_print, |
| 135 | name="request details", |
| 136 | attachment_type=ALLURE.attachment_type.TEXT, |
| 137 | ) |
no test coverage detected