From 1f81623a66ecead82188c419aa095c66559c8634 Mon Sep 17 00:00:00 2001 From: httprunner Date: Thu, 8 Feb 2018 12:18:02 +0800 Subject: [PATCH] refactor run times: display test statistics correctly with run times setting --- httprunner/__init__.py | 2 +- httprunner/runner.py | 51 +++++++++++-------------- httprunner/task.py | 2 +- tests/data/demo_testset_cli.yml | 68 +++++++++++++++++++++++++++++++++ tests/test_cli.py | 24 ++++++++++++ 5 files changed, 116 insertions(+), 31 deletions(-) create mode 100644 tests/data/demo_testset_cli.yml create mode 100644 tests/test_cli.py diff --git a/httprunner/__init__.py b/httprunner/__init__.py index 9d070fbe..1658609d 100644 --- a/httprunner/__init__.py +++ b/httprunner/__init__.py @@ -1 +1 @@ -__version__ = '0.8.9' \ No newline at end of file +__version__ = '0.9.0' \ No newline at end of file diff --git a/httprunner/runner.py b/httprunner/runner.py index 978c0c60..46d7f63a 100644 --- a/httprunner/runner.py +++ b/httprunner/runner.py @@ -102,12 +102,6 @@ class Runner(object): except KeyError: raise exception.ParamsError("URL or METHOD missed!") - skip_current_test = testcase_dict.get("skip", False) - if skip_current_test: - run_times = 0 - else: - run_times = int(testcase_dict.get("times", 1)) - extractors = testcase_dict.get("extract", []) validators = testcase_dict.get("validate", []) setup_actions = testcase_dict.get("setup", []) @@ -117,32 +111,31 @@ class Runner(object): for action in actions: self.context.exec_content_functions(action) - for _ in range(run_times): - setup_teardown(setup_actions) + setup_teardown(setup_actions) - resp = self.http_client_session.request( - method, - url, - name=group_name, - **parsed_request - ) - resp_obj = response.ResponseObject(resp) + resp = self.http_client_session.request( + method, + url, + name=group_name, + **parsed_request + ) + resp_obj = response.ResponseObject(resp) - extracted_variables_mapping = resp_obj.extract_response(extractors) - self.context.bind_extracted_variables(extracted_variables_mapping) + extracted_variables_mapping = resp_obj.extract_response(extractors) + self.context.bind_extracted_variables(extracted_variables_mapping) - try: - self.context.validate(validators, resp_obj) - except (exception.ParamsError, exception.ResponseError, exception.ValidationError): - err_msg = u"Exception occured.\n" - err_msg += u"HTTP request url: {}\n".format(url) - err_msg += u"HTTP request kwargs: {}\n".format(parsed_request) - err_msg += u"HTTP response status_code: {}\n".format(resp.status_code) - err_msg += u"HTTP response content: \n{}".format(resp.text) - logging.error(err_msg) - raise - finally: - setup_teardown(teardown_actions) + try: + self.context.validate(validators, resp_obj) + except (exception.ParamsError, exception.ResponseError, exception.ValidationError): + err_msg = u"Exception occured.\n" + err_msg += u"HTTP request url: {}\n".format(url) + err_msg += u"HTTP request kwargs: {}\n".format(parsed_request) + err_msg += u"HTTP response status_code: {}\n".format(resp.status_code) + err_msg += u"HTTP response content: \n{}".format(resp.text) + logging.error(err_msg) + raise + finally: + setup_teardown(teardown_actions) return True diff --git a/httprunner/task.py b/httprunner/task.py index 4125a818..3c9efbb4 100644 --- a/httprunner/task.py +++ b/httprunner/task.py @@ -37,7 +37,7 @@ class ApiTestSuite(unittest.TestSuite): ApiTestCase.runTest.__func__.__doc__ = testcase_dict['name'] test = ApiTestCase(self.test_runner, testcase_dict) - self.addTest(test) + [self.addTest(test) for _ in range(int(testcase_dict.get("times", 1)))] def print_output(self): output_variables_list = self.config_dict.get("output", []) diff --git a/tests/data/demo_testset_cli.yml b/tests/data/demo_testset_cli.yml new file mode 100644 index 00000000..6cae8c99 --- /dev/null +++ b/tests/data/demo_testset_cli.yml @@ -0,0 +1,68 @@ +- test: + name: get token + request: + url: http://127.0.0.1:5000/api/get-token + method: POST + headers: + Content-Type: application/json + user_agent: 'iOS/10.3' + device_sn: 'HZfFBh6tU59EdXJ' + os_platform: 'ios' + app_version: '2.8.6' + json: + sign: f1219719911caae89ccc301679857ebfda115ca2 + variables: + - expect_status_code: 200 + - token_len: 16 + extract: + - token: content.token + validate: + - {"check": "status_code", "comparator": "eq", "expect": 200} + - eq: ["status_code", $expect_status_code] + - {"check": "$token", "comparator": "len_eq", "expect": 16} + - len_eq: ["$token", $token_len] + - len_eq: ["content.token", 16] + - {"check": "status_code", "comparator": "sum_status_code", "expect": 2} + - sum_status_code: ["status_code", 2] + +- test: + name: create user which does not exist + request: + url: http://127.0.0.1:5000/api/users/1000 + method: POST + headers: + Content-Type: application/json + device_sn: 'HZfFBh6tU59EdXJ' + token: $token + json: + name: "user1" + password: "123456" + extract: + - success: content.success + validate: + - eq: ["status_code", 201] + - sum_status_code: ["status_code", 3] + - eq: ["$success", True] + - eq: ["abc$success", "abcTrue"] + - {"check": "status_code", "comparator": "eq", "expect": 201} + - {"check": "content.success", "comparator": "eq", "expect": true} + +- test: + name: create user which existed + times: 3 + request: + url: http://127.0.0.1:5000/api/users/1000 + method: POST + headers: + Content-Type: application/json + device_sn: 'HZfFBh6tU59EdXJ' + token: $token + json: + name: "user1" + password: "123456" + validate: + - "eq": ["status_code", 500] + - sum_status_code: ["status_code", 5] + - "eq": ["content.success", false] + - {"check": "status_code", "comparator": "eq", "expect": 500} + - {"check": "content.success", "comparator": "eq", "expect": false} \ No newline at end of file diff --git a/tests/test_cli.py b/tests/test_cli.py new file mode 100644 index 00000000..c178a09f --- /dev/null +++ b/tests/test_cli.py @@ -0,0 +1,24 @@ +import os +import shutil +import sys + +from httprunner.task import TaskSuite +from pyunitreport import HTMLTestRunner +from tests.base import ApiServerUnittest + + +class TestCli(ApiServerUnittest): + + def test_run_times(self): + testset_path = "tests/data/demo_testset_cli.yml" + output_folder_name = os.path.basename(os.path.splitext(testset_path)[0]) + kwargs = { + "output": output_folder_name + } + + task_suite = TaskSuite(testset_path) + result = HTMLTestRunner(**kwargs).run(task_suite) + self.assertEqual(result.testsRun, 5) + + report_save_dir = os.path.join(os.getcwd(), 'reports', output_folder_name) + shutil.rmtree(report_save_dir)