From ac9664e842fa704c021eb0b3cc44f34e5bd76f09 Mon Sep 17 00:00:00 2001 From: jun Date: Fri, 24 Jul 2020 16:25:41 +0800 Subject: [PATCH 1/2] fixed json support and closes #971 --- httprunner/make.py | 4 ++++ httprunner/models.py | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/httprunner/make.py b/httprunner/make.py index 13b95460..205d8162 100644 --- a/httprunner/make.py +++ b/httprunner/make.py @@ -237,6 +237,10 @@ def make_request_chain_style(request: Dict) -> Text: if "json" in request: req_json = request["json"] + if not isinstance(req_json, Text): + pass + else: + req_json = f'"{req_json}"' request_chain_style += f".with_json({req_json})" if "timeout" in request: diff --git a/httprunner/models.py b/httprunner/models.py index 04fbab23..580e0ffb 100644 --- a/httprunner/models.py +++ b/httprunner/models.py @@ -52,7 +52,7 @@ class TRequest(BaseModel): url: Url params: Dict[Text, Text] = {} headers: Headers = {} - req_json: Union[Dict, List] = Field(None, alias="json") + req_json: Union[Dict, List, Text] = Field(None, alias="json") data: Union[Text, Dict[Text, Any]] = None cookies: Cookies = {} timeout: float = 120 From fa30ce3bc70995a5a7932606ddea7151d5ebca13 Mon Sep 17 00:00:00 2001 From: jun Date: Tue, 28 Jul 2020 12:49:26 +0800 Subject: [PATCH 2/2] add unit test and closes #971 --- .../request_with_variables.yml | 21 +++++++++++++++ .../request_with_variables_test.py | 21 ++++++++++++++- httprunner/make.py | 4 +-- tests/loader_test.py | 2 +- tests/make_test.py | 27 +++++++++++++++++++ 5 files changed, 70 insertions(+), 5 deletions(-) diff --git a/examples/postman_echo/request_methods/request_with_variables.yml b/examples/postman_echo/request_methods/request_with_variables.yml index 7f9dec55..14196a5f 100644 --- a/examples/postman_echo/request_methods/request_with_variables.yml +++ b/examples/postman_echo/request_methods/request_with_variables.yml @@ -55,3 +55,24 @@ teststeps: - eq: ["body.form.foo1", "testcase_config_bar1"] - eq: ["body.form.foo2", "bar23"] - eq: ["body.form.foo3", "bar21"] + +- + name: post form data using json + variables: + foo2: bar23 + jsondata: + foo1: $foo1 + foo2: $foo2 + foo3: $foo3 + request: + method: POST + url: /post + headers: + User-Agent: HttpRunner/3.0 + Content-Type: "application/json" + json: $jsondata + validate: + - eq: ["status_code", 200] + - eq: ["body.data.foo1", "testcase_config_bar1"] + - eq: ["body.data.foo2", "bar23"] + - eq: ["body.data.foo3", "bar21"] diff --git a/examples/postman_echo/request_methods/request_with_variables_test.py b/examples/postman_echo/request_methods/request_with_variables_test.py index ebaefe52..470abfe9 100644 --- a/examples/postman_echo/request_methods/request_with_variables_test.py +++ b/examples/postman_echo/request_methods/request_with_variables_test.py @@ -1,5 +1,5 @@ # NOTE: Generated By HttpRunner v3.1.3 -# FROM: request_methods/request_with_variables.yml +# FROM: request_methods\request_with_variables.yml from httprunner import HttpRunner, Config, Step, RunRequest, RunTestCase @@ -62,6 +62,25 @@ class TestCaseRequestWithVariables(HttpRunner): .assert_equal("body.form.foo2", "bar23") .assert_equal("body.form.foo3", "bar21") ), + Step( + RunRequest("post form data using json") + .with_variables( + **{ + "foo2": "bar23", + "jsondata": {"foo1": "$foo1", "foo2": "$foo2", "foo3": "$foo3"}, + } + ) + .post("/post") + .with_headers( + **{"User-Agent": "HttpRunner/3.0", "Content-Type": "application/json"} + ) + .with_json("$jsondata") + .validate() + .assert_equal("status_code", 200) + .assert_equal("body.data.foo1", "testcase_config_bar1") + .assert_equal("body.data.foo2", "bar23") + .assert_equal("body.data.foo3", "bar21") + ), ] diff --git a/httprunner/make.py b/httprunner/make.py index 205d8162..4ecfa8cb 100644 --- a/httprunner/make.py +++ b/httprunner/make.py @@ -237,9 +237,7 @@ def make_request_chain_style(request: Dict) -> Text: if "json" in request: req_json = request["json"] - if not isinstance(req_json, Text): - pass - else: + if isinstance(req_json, Text): req_json = f'"{req_json}"' request_chain_style += f".with_json({req_json})" diff --git a/tests/loader_test.py b/tests/loader_test.py index c7475169..9f9210e8 100644 --- a/tests/loader_test.py +++ b/tests/loader_test.py @@ -11,7 +11,7 @@ class TestLoader(unittest.TestCase): self.assertEqual( testcase_obj.config.name, "request methods testcase with variables" ) - self.assertEqual(len(testcase_obj.teststeps), 3) + self.assertEqual(len(testcase_obj.teststeps), 4) def test_load_json_file_file_format_error(self): json_tmp_file = "tmp.json" diff --git a/tests/make_test.py b/tests/make_test.py index 56199b8f..7cf56e3d 100644 --- a/tests/make_test.py +++ b/tests/make_test.py @@ -214,3 +214,30 @@ from request_methods.request_with_functions_test import ( teststep_chain_style, """Step(RunRequest("get with params").with_variables(**{'foo1': 'bar1', 'foo2': 123, 'sum_v': '${sum_two(1, 2)}'}).get("/get").with_params(**{'foo1': '$foo1', 'foo2': '$foo2', 'sum_v': '$sum_v'}).with_headers(**{'User-Agent': 'HttpRunner/${get_httprunner_version()}'}).extract().with_jmespath('body.args.foo1', 'session_foo1').with_jmespath('body.args.foo2', 'session_foo2').validate().assert_equal("status_code", 200).assert_equal("body.args.sum_v", "3"))""", ) + + def test_make_requests_with_json_chain_style(self): + step = { + "name": "get with params", + "variables": {"foo1": "bar1", "foo2": 123, "sum_v": "${sum_two(1, 2)}","myjson":{"name": "user", "password": "123456"}}, + "request": { + "method": "GET", + "url": "/get", + "params": {"foo1": "$foo1", "foo2": "$foo2", "sum_v": "$sum_v"}, + "headers": {"User-Agent": "HttpRunner/${get_httprunner_version()}"}, + "json": "$myjson", + }, + "testcase": "CLS_LB(TestCaseDemo)CLS_RB", + "extract": { + "session_foo1": "body.args.foo1", + "session_foo2": "body.args.foo2", + }, + "validate": [ + {"eq": ["status_code", 200]}, + {"eq": ["body.args.sum_v", "3"]}, + ], + } + teststep_chain_style = make_teststep_chain_style(step) + self.assertEqual( + teststep_chain_style, + """Step(RunRequest("get with params").with_variables(**{'foo1': 'bar1', 'foo2': 123, 'sum_v': '${sum_two(1, 2)}', 'myjson': {'name': 'user', 'password': '123456'}}).get("/get").with_params(**{'foo1': '$foo1', 'foo2': '$foo2', 'sum_v': '$sum_v'}).with_headers(**{'User-Agent': 'HttpRunner/${get_httprunner_version()}'}).with_json("$myjson").extract().with_jmespath('body.args.foo1', 'session_foo1').with_jmespath('body.args.foo2', 'session_foo2').validate().assert_equal("status_code", 200).assert_equal("body.args.sum_v", "3"))""", + )