diff --git a/httprunner/built_in.py b/httprunner/built_in.py index ebf46867..d5d69242 100644 --- a/httprunner/built_in.py +++ b/httprunner/built_in.py @@ -137,7 +137,7 @@ def setup_hook_prepare_kwargs(method, url, kwargs): content_type = kwargs.get("headers", {}).get("content-type") if content_type and "data" in kwargs: # if request content-type is application/json, request data should be dumped - if content_type.startswith("application/json"): + if content_type.startswith("application/json") and isinstance(kwargs["data"], (dict, list)): kwargs["data"] = json.dumps(kwargs["data"]) if isinstance(kwargs["data"], str): diff --git a/tests/test_httprunner.py b/tests/test_httprunner.py index c5a222d4..1ef82513 100644 --- a/tests/test_httprunner.py +++ b/tests/test_httprunner.py @@ -106,3 +106,36 @@ class TestHttpRunner(ApiServerUnittest): self.assertTrue(summary["success"]) self.assertEqual(summary["stat"]["testsRun"], 1) self.assertIn("records", summary) + + def test_run_post_data(self): + testsets = [ + { + "name": "post data", + "config": { + "path": "" + }, + + "testcases": [ + { + "name": "post data", + "request": { + "url": "https://httpbin.org/post", + "method": "POST", + "headers": { + "Content-Type": "application/json" + }, + "data": "abc" + }, + "validate": [ + {"eq": ["status_code", 200]} + ] + } + + ] + } + ] + runner = HttpRunner().run(testsets) + summary = runner.summary + self.assertTrue(summary["success"]) + self.assertEqual(summary["stat"]["testsRun"], 1) + self.assertEqual(summary["records"][0]["meta_data"]["response_body"]["data"], "abc")