mirror of
https://github.com/httprunner/httprunner.git
synced 2026-06-11 10:49:43 +08:00
display exception stage when exception occured #367
This commit is contained in:
@@ -1,7 +1,7 @@
|
|||||||
__title__ = 'HttpRunner'
|
__title__ = 'HttpRunner'
|
||||||
__description__ = 'One-stop solution for HTTP(S) testing.'
|
__description__ = 'One-stop solution for HTTP(S) testing.'
|
||||||
__url__ = 'https://github.com/HttpRunner/HttpRunner'
|
__url__ = 'https://github.com/HttpRunner/HttpRunner'
|
||||||
__version__ = '1.5.12'
|
__version__ = '1.5.13'
|
||||||
__author__ = 'debugtalk'
|
__author__ = 'debugtalk'
|
||||||
__author_email__ = 'mail@debugtalk.com'
|
__author_email__ = 'mail@debugtalk.com'
|
||||||
__license__ = 'MIT'
|
__license__ = 'MIT'
|
||||||
|
|||||||
@@ -35,6 +35,7 @@ class HttpRunner(object):
|
|||||||
}
|
}
|
||||||
|
|
||||||
"""
|
"""
|
||||||
|
self.exception_stage = "initialize HttpRunner()"
|
||||||
loader.reset_loader()
|
loader.reset_loader()
|
||||||
loader.dot_env_path = kwargs.pop("dot_env_path", None)
|
loader.dot_env_path = kwargs.pop("dot_env_path", None)
|
||||||
self.http_client_session = kwargs.pop("http_client_session", None)
|
self.http_client_session = kwargs.pop("http_client_session", None)
|
||||||
@@ -77,6 +78,7 @@ class HttpRunner(object):
|
|||||||
]
|
]
|
||||||
|
|
||||||
"""
|
"""
|
||||||
|
self.exception_stage = "load tests"
|
||||||
if validator.is_testcases(path_or_testcases):
|
if validator.is_testcases(path_or_testcases):
|
||||||
# TODO: refactor
|
# TODO: refactor
|
||||||
if isinstance(path_or_testcases, list):
|
if isinstance(path_or_testcases, list):
|
||||||
@@ -118,6 +120,7 @@ class HttpRunner(object):
|
|||||||
list: parsed testcases list, with config variables/parameters/name/request parsed.
|
list: parsed testcases list, with config variables/parameters/name/request parsed.
|
||||||
|
|
||||||
"""
|
"""
|
||||||
|
self.exception_stage = "parse tests"
|
||||||
variables_mapping = variables_mapping or {}
|
variables_mapping = variables_mapping or {}
|
||||||
|
|
||||||
parsed_testcases_list = []
|
parsed_testcases_list = []
|
||||||
@@ -210,6 +213,7 @@ class HttpRunner(object):
|
|||||||
test.__doc__ = teststep_dict["name"]
|
test.__doc__ = teststep_dict["name"]
|
||||||
return test
|
return test
|
||||||
|
|
||||||
|
self.exception_stage = "initialize unittest Runner() and TestSuite()"
|
||||||
self.kwargs.setdefault("resultclass", report.HtmlTestResult)
|
self.kwargs.setdefault("resultclass", report.HtmlTestResult)
|
||||||
unittest_runner = unittest.TextTestRunner(**self.kwargs)
|
unittest_runner = unittest.TextTestRunner(**self.kwargs)
|
||||||
|
|
||||||
@@ -239,6 +243,62 @@ class HttpRunner(object):
|
|||||||
test_suite = unittest.TestSuite(loaded_testcases)
|
test_suite = unittest.TestSuite(loaded_testcases)
|
||||||
return (unittest_runner, test_suite)
|
return (unittest_runner, test_suite)
|
||||||
|
|
||||||
|
def run_tests(self, unittest_runner, test_suite):
|
||||||
|
""" run tests with unittest_runner and test_suite
|
||||||
|
|
||||||
|
Args:
|
||||||
|
unittest_runner: unittest.TextTestRunner()
|
||||||
|
test_suite: unittest.TestSuite()
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
list: tests_results
|
||||||
|
|
||||||
|
"""
|
||||||
|
self.exception_stage = "running tests"
|
||||||
|
tests_results = []
|
||||||
|
|
||||||
|
for testcase in test_suite:
|
||||||
|
testcase_name = testcase.config.get("name")
|
||||||
|
logger.log_info("Start to run testcase: {}".format(testcase_name))
|
||||||
|
|
||||||
|
result = unittest_runner.run(testcase)
|
||||||
|
tests_results.append((testcase, result))
|
||||||
|
|
||||||
|
return tests_results
|
||||||
|
|
||||||
|
def aggregate(self, tests_results):
|
||||||
|
""" aggregate results
|
||||||
|
|
||||||
|
Args:
|
||||||
|
tests_results (list): list of (testcase, result)
|
||||||
|
|
||||||
|
"""
|
||||||
|
self.exception_stage = "aggregate results"
|
||||||
|
self.summary = {
|
||||||
|
"success": True,
|
||||||
|
"stat": {},
|
||||||
|
"time": {},
|
||||||
|
"platform": report.get_platform(),
|
||||||
|
"details": []
|
||||||
|
}
|
||||||
|
|
||||||
|
for tests_result in tests_results:
|
||||||
|
testcase, result = tests_result
|
||||||
|
testcase_summary = report.get_summary(result)
|
||||||
|
|
||||||
|
self.summary["success"] &= testcase_summary["success"]
|
||||||
|
testcase_summary["name"] = testcase.config.get("name")
|
||||||
|
testcase_summary["base_url"] = testcase.config.get("request", {}).get("base_url", "")
|
||||||
|
|
||||||
|
in_out = utils.get_testcase_io(testcase)
|
||||||
|
utils.print_io(in_out)
|
||||||
|
testcase_summary["in_out"] = in_out
|
||||||
|
|
||||||
|
report.aggregate_stat(self.summary["stat"], testcase_summary["stat"])
|
||||||
|
report.aggregate_stat(self.summary["time"], testcase_summary["time"])
|
||||||
|
|
||||||
|
self.summary["details"].append(testcase_summary)
|
||||||
|
|
||||||
def run(self, path_or_testcases, mapping=None):
|
def run(self, path_or_testcases, mapping=None):
|
||||||
""" start to run test with variables mapping.
|
""" start to run test with variables mapping.
|
||||||
|
|
||||||
@@ -263,41 +323,18 @@ class HttpRunner(object):
|
|||||||
"""
|
"""
|
||||||
# loader
|
# loader
|
||||||
testcases_list = self.load_tests(path_or_testcases)
|
testcases_list = self.load_tests(path_or_testcases)
|
||||||
|
|
||||||
# parser
|
# parser
|
||||||
parsed_testcases_list = self.parse_tests(testcases_list)
|
parsed_testcases_list = self.parse_tests(testcases_list)
|
||||||
|
|
||||||
# initialize
|
# initialize
|
||||||
unittest_runner, test_suite = self.initialize(parsed_testcases_list)
|
unittest_runner, test_suite = self.initialize(parsed_testcases_list)
|
||||||
|
|
||||||
|
# running tests
|
||||||
|
results = self.run_tests(unittest_runner, test_suite)
|
||||||
|
|
||||||
# aggregate
|
# aggregate
|
||||||
self.summary = {
|
self.aggregate(results)
|
||||||
"success": True,
|
|
||||||
"stat": {},
|
|
||||||
"time": {},
|
|
||||||
"platform": report.get_platform(),
|
|
||||||
"details": []
|
|
||||||
}
|
|
||||||
|
|
||||||
# execution
|
|
||||||
for testcase in test_suite:
|
|
||||||
testcase_name = testcase.config.get("name")
|
|
||||||
logger.log_info("Start to run testcase: {}".format(testcase_name))
|
|
||||||
|
|
||||||
result = unittest_runner.run(testcase)
|
|
||||||
testcase_summary = report.get_summary(result)
|
|
||||||
|
|
||||||
self.summary["success"] &= testcase_summary["success"]
|
|
||||||
testcase_summary["name"] = testcase_name
|
|
||||||
testcase_summary["base_url"] = testcase.config.get("request", {}).get("base_url", "")
|
|
||||||
|
|
||||||
in_out = utils.get_testcase_io(testcase)
|
|
||||||
utils.print_io(in_out)
|
|
||||||
testcase_summary["in_out"] = in_out
|
|
||||||
|
|
||||||
report.aggregate_stat(self.summary["stat"], testcase_summary["stat"])
|
|
||||||
report.aggregate_stat(self.summary["time"], testcase_summary["time"])
|
|
||||||
|
|
||||||
self.summary["details"].append(testcase_summary)
|
|
||||||
|
|
||||||
return self
|
return self
|
||||||
|
|
||||||
@@ -312,6 +349,7 @@ class HttpRunner(object):
|
|||||||
str: generated html report path
|
str: generated html report path
|
||||||
|
|
||||||
"""
|
"""
|
||||||
|
self.exception_stage = "generate report"
|
||||||
return report.render_html_report(
|
return report.render_html_report(
|
||||||
self.summary,
|
self.summary,
|
||||||
html_report_name,
|
html_report_name,
|
||||||
|
|||||||
@@ -8,8 +8,8 @@ import unittest
|
|||||||
|
|
||||||
from httprunner import logger
|
from httprunner import logger
|
||||||
from httprunner.__about__ import __description__, __version__
|
from httprunner.__about__ import __description__, __version__
|
||||||
from httprunner.compat import is_py2
|
|
||||||
from httprunner.api import HttpRunner
|
from httprunner.api import HttpRunner
|
||||||
|
from httprunner.compat import is_py2
|
||||||
from httprunner.utils import (create_scaffold, get_python2_retire_msg,
|
from httprunner.utils import (create_scaffold, get_python2_retire_msg,
|
||||||
prettify_json_file, validate_json_file)
|
prettify_json_file, validate_json_file)
|
||||||
|
|
||||||
@@ -78,7 +78,15 @@ def main_hrun():
|
|||||||
create_scaffold(project_path)
|
create_scaffold(project_path)
|
||||||
exit(0)
|
exit(0)
|
||||||
|
|
||||||
runner = HttpRunner(failfast=args.failfast, dot_env_path=args.dot_env_path).run(args.testset_paths)
|
try:
|
||||||
|
runner = HttpRunner(
|
||||||
|
failfast=args.failfast,
|
||||||
|
dot_env_path=args.dot_env_path
|
||||||
|
)
|
||||||
|
runner.run(args.testset_paths)
|
||||||
|
except Exception:
|
||||||
|
logger.log_error("!!!!!!!!!! exception stage: {} !!!!!!!!!!".format(runner.exception_stage))
|
||||||
|
raise
|
||||||
|
|
||||||
if not args.no_html_report:
|
if not args.no_html_report:
|
||||||
runner.gen_html_report(
|
runner.gen_html_report(
|
||||||
|
|||||||
Reference in New Issue
Block a user