diff --git a/httprunner/__about__.py b/httprunner/__about__.py index 9fc5c801..0cde284c 100644 --- a/httprunner/__about__.py +++ b/httprunner/__about__.py @@ -1,7 +1,7 @@ __title__ = 'HttpRunner' __description__ = 'One-stop solution for HTTP(S) testing.' __url__ = 'https://github.com/HttpRunner/HttpRunner' -__version__ = '1.5.6' +__version__ = '1.5.7' __author__ = 'debugtalk' __author_email__ = 'mail@debugtalk.com' __license__ = 'MIT' diff --git a/httprunner/context.py b/httprunner/context.py index 9decb7ca..1739e741 100644 --- a/httprunner/context.py +++ b/httprunner/context.py @@ -5,7 +5,7 @@ import os import re import sys -from httprunner import exception, testcase, utils +from httprunner import exception, logger, testcase, utils from httprunner.compat import OrderedDict @@ -237,32 +237,50 @@ class Context(object): and comparator not in ["is", "eq", "equals", "=="]: raise exception.ParamsError("Null value can only be compared with comparator: eq/equals/==") - try: - validator_dict["check_result"] = "passed" - validate_func(validator_dict["check_value"], validator_dict["expect"]) - except (AssertionError, TypeError): - err_msg = "\n" + "\n".join([ - "\tcheck item name: %s;" % check_item, - "\tcheck item value: %s (%s);" % (check_value, type(check_value).__name__), - "\tcomparator: %s;" % comparator, - "\texpected value: %s (%s)." % (expect_value, type(expect_value).__name__) - ]) - validator_dict["check_result"] = "failed" - raise exception.ValidationError(err_msg) + validate_msg = "validate: {} {} {}({})".format( + check_item, + comparator, + expect_value, + type(expect_value).__name__ + ) - def eval_validators(self, validators, resp_obj): - """ evaluate validators with context variable mapping. + try: + validator_dict["check_result"] = "pass" + validate_func(check_value, expect_value) + validate_msg += "\t==> pass" + logger.log_debug(validate_msg) + except (AssertionError, TypeError): + validate_msg += "\t==> fail" + validate_msg += "\n{}({}) {} {}({})".format( + check_value, + type(check_value).__name__, + comparator, + expect_value, + type(expect_value).__name__ + ) + logger.log_error(validate_msg) + validator_dict["check_result"] = "fail" + raise exception.ValidationError(validate_msg) + + def validate(self, validators, resp_obj): + """ make validations """ - return [ - self.eval_check_item( + self.evaluated_validators = [] + validate_pass = True + + for validator in validators: + # evaluate validators with context variable mapping. + evaluated_validator = self.eval_check_item( testcase.parse_validator(validator), resp_obj ) - for validator in validators - ] - def validate(self, validators): - """ make validations - """ - for validator_dict in validators: - self.do_validation(validator_dict) + try: + self.do_validation(evaluated_validator) + except exception.ValidationError: + validate_pass = False + + self.evaluated_validators.append(evaluated_validator) + + if not validate_pass: + raise exception.ValidationError diff --git a/httprunner/runner.py b/httprunner/runner.py index fbf8031f..72dd7a4d 100644 --- a/httprunner/runner.py +++ b/httprunner/runner.py @@ -11,7 +11,6 @@ class Runner(object): def __init__(self, config_dict=None, http_client_session=None): self.http_client_session = http_client_session - self.evaluated_validators = [] self.context = Context() config_dict = config_dict or {} @@ -183,8 +182,7 @@ class Runner(object): # validate validators = testcase_dict.get("validate", []) or testcase_dict.get("validators", []) try: - self.evaluated_validators = self.context.eval_validators(validators, resp_obj) - self.context.validate(self.evaluated_validators) + self.context.validate(validators, resp_obj) except (exception.ParamsError, exception.ResponseError, \ exception.ValidationError, exception.ParseResponseError): # log request diff --git a/httprunner/task.py b/httprunner/task.py index c65a7809..ca03c406 100644 --- a/httprunner/task.py +++ b/httprunner/task.py @@ -28,7 +28,7 @@ class TestCase(unittest.TestCase): finally: if hasattr(self.test_runner.http_client_session, "meta_data"): self.meta_data = self.test_runner.http_client_session.meta_data - self.meta_data["validators"] = self.test_runner.evaluated_validators + self.meta_data["validators"] = self.test_runner.context.evaluated_validators self.test_runner.http_client_session.init_meta_data() diff --git a/httprunner/templates/default_report_template.html b/httprunner/templates/default_report_template.html index 4c7b4441..12cc8d94 100644 --- a/httprunner/templates/default_report_template.html +++ b/httprunner/templates/default_report_template.html @@ -307,9 +307,9 @@ {% for validator in record.meta_data.validators %}