mirror of
https://github.com/httprunner/httprunner.git
synced 2026-05-12 10:39:40 +08:00
Merge pull request #371 from HttpRunner/feature
display exception stage when exception occured #367
This commit is contained in:
@@ -1,7 +1,7 @@
|
||||
__title__ = 'HttpRunner'
|
||||
__description__ = 'One-stop solution for HTTP(S) testing.'
|
||||
__url__ = 'https://github.com/HttpRunner/HttpRunner'
|
||||
__version__ = '1.5.12'
|
||||
__version__ = '1.5.13'
|
||||
__author__ = 'debugtalk'
|
||||
__author_email__ = 'mail@debugtalk.com'
|
||||
__license__ = 'MIT'
|
||||
|
||||
@@ -35,6 +35,7 @@ class HttpRunner(object):
|
||||
}
|
||||
|
||||
"""
|
||||
self.exception_stage = "initialize HttpRunner()"
|
||||
loader.reset_loader()
|
||||
loader.dot_env_path = kwargs.pop("dot_env_path", 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):
|
||||
# TODO: refactor
|
||||
if isinstance(path_or_testcases, list):
|
||||
@@ -118,6 +120,7 @@ class HttpRunner(object):
|
||||
list: parsed testcases list, with config variables/parameters/name/request parsed.
|
||||
|
||||
"""
|
||||
self.exception_stage = "parse tests"
|
||||
variables_mapping = variables_mapping or {}
|
||||
|
||||
parsed_testcases_list = []
|
||||
@@ -210,6 +213,7 @@ class HttpRunner(object):
|
||||
test.__doc__ = teststep_dict["name"]
|
||||
return test
|
||||
|
||||
self.exception_stage = "initialize unittest Runner() and TestSuite()"
|
||||
self.kwargs.setdefault("resultclass", report.HtmlTestResult)
|
||||
unittest_runner = unittest.TextTestRunner(**self.kwargs)
|
||||
|
||||
@@ -239,6 +243,62 @@ class HttpRunner(object):
|
||||
test_suite = unittest.TestSuite(loaded_testcases)
|
||||
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):
|
||||
""" start to run test with variables mapping.
|
||||
|
||||
@@ -263,41 +323,18 @@ class HttpRunner(object):
|
||||
"""
|
||||
# loader
|
||||
testcases_list = self.load_tests(path_or_testcases)
|
||||
|
||||
# parser
|
||||
parsed_testcases_list = self.parse_tests(testcases_list)
|
||||
|
||||
# initialize
|
||||
unittest_runner, test_suite = self.initialize(parsed_testcases_list)
|
||||
|
||||
# running tests
|
||||
results = self.run_tests(unittest_runner, test_suite)
|
||||
|
||||
# aggregate
|
||||
self.summary = {
|
||||
"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)
|
||||
self.aggregate(results)
|
||||
|
||||
return self
|
||||
|
||||
@@ -312,6 +349,7 @@ class HttpRunner(object):
|
||||
str: generated html report path
|
||||
|
||||
"""
|
||||
self.exception_stage = "generate report"
|
||||
return report.render_html_report(
|
||||
self.summary,
|
||||
html_report_name,
|
||||
|
||||
@@ -8,8 +8,8 @@ import unittest
|
||||
|
||||
from httprunner import logger
|
||||
from httprunner.__about__ import __description__, __version__
|
||||
from httprunner.compat import is_py2
|
||||
from httprunner.api import HttpRunner
|
||||
from httprunner.compat import is_py2
|
||||
from httprunner.utils import (create_scaffold, get_python2_retire_msg,
|
||||
prettify_json_file, validate_json_file)
|
||||
|
||||
@@ -78,7 +78,15 @@ def main_hrun():
|
||||
create_scaffold(project_path)
|
||||
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:
|
||||
runner.gen_html_report(
|
||||
|
||||
Reference in New Issue
Block a user