mirror of
https://github.com/httprunner/httprunner.git
synced 2026-09-07 00:17:37 +08:00
refactor run times: display test statistics correctly with run times setting
This commit is contained in:
@@ -1 +1 @@
|
|||||||
__version__ = '0.8.9'
|
__version__ = '0.9.0'
|
||||||
+22
-29
@@ -102,12 +102,6 @@ class Runner(object):
|
|||||||
except KeyError:
|
except KeyError:
|
||||||
raise exception.ParamsError("URL or METHOD missed!")
|
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", [])
|
extractors = testcase_dict.get("extract", [])
|
||||||
validators = testcase_dict.get("validate", [])
|
validators = testcase_dict.get("validate", [])
|
||||||
setup_actions = testcase_dict.get("setup", [])
|
setup_actions = testcase_dict.get("setup", [])
|
||||||
@@ -117,32 +111,31 @@ class Runner(object):
|
|||||||
for action in actions:
|
for action in actions:
|
||||||
self.context.exec_content_functions(action)
|
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(
|
resp = self.http_client_session.request(
|
||||||
method,
|
method,
|
||||||
url,
|
url,
|
||||||
name=group_name,
|
name=group_name,
|
||||||
**parsed_request
|
**parsed_request
|
||||||
)
|
)
|
||||||
resp_obj = response.ResponseObject(resp)
|
resp_obj = response.ResponseObject(resp)
|
||||||
|
|
||||||
extracted_variables_mapping = resp_obj.extract_response(extractors)
|
extracted_variables_mapping = resp_obj.extract_response(extractors)
|
||||||
self.context.bind_extracted_variables(extracted_variables_mapping)
|
self.context.bind_extracted_variables(extracted_variables_mapping)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
self.context.validate(validators, resp_obj)
|
self.context.validate(validators, resp_obj)
|
||||||
except (exception.ParamsError, exception.ResponseError, exception.ValidationError):
|
except (exception.ParamsError, exception.ResponseError, exception.ValidationError):
|
||||||
err_msg = u"Exception occured.\n"
|
err_msg = u"Exception occured.\n"
|
||||||
err_msg += u"HTTP request url: {}\n".format(url)
|
err_msg += u"HTTP request url: {}\n".format(url)
|
||||||
err_msg += u"HTTP request kwargs: {}\n".format(parsed_request)
|
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 status_code: {}\n".format(resp.status_code)
|
||||||
err_msg += u"HTTP response content: \n{}".format(resp.text)
|
err_msg += u"HTTP response content: \n{}".format(resp.text)
|
||||||
logging.error(err_msg)
|
logging.error(err_msg)
|
||||||
raise
|
raise
|
||||||
finally:
|
finally:
|
||||||
setup_teardown(teardown_actions)
|
setup_teardown(teardown_actions)
|
||||||
|
|
||||||
return True
|
return True
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -37,7 +37,7 @@ class ApiTestSuite(unittest.TestSuite):
|
|||||||
ApiTestCase.runTest.__func__.__doc__ = testcase_dict['name']
|
ApiTestCase.runTest.__func__.__doc__ = testcase_dict['name']
|
||||||
|
|
||||||
test = ApiTestCase(self.test_runner, testcase_dict)
|
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):
|
def print_output(self):
|
||||||
output_variables_list = self.config_dict.get("output", [])
|
output_variables_list = self.config_dict.get("output", [])
|
||||||
|
|||||||
@@ -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}
|
||||||
@@ -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)
|
||||||
Reference in New Issue
Block a user