def _do_validation(self, validator_dict): """ validate with functions Args: validator_dict (dict): validator dict { "check": "status_code", "check_value": 200, "expect": 201, "comparator": "eq" } """ # TODO: move comparator uniform to init_test_suites comparator = utils.get_uniform_comparator(validator_dict["comparator"]) validate_func = parser.get_mapping_function(comparator, self.TESTCASE_SHARED_FUNCTIONS_MAPPING) check_item = validator_dict["check"] check_value = validator_dict["check_value"] expect_value = validator_dict["expect"] if (check_value is None or expect_value is None) \ and comparator not in ["is", "eq", "equals", "=="]: raise exceptions.ParamsError("Null value can only be compared with comparator: eq/equals/==") validate_msg = "validate: {} {} {}({})".format( check_item, comparator, expect_value, type(expect_value).__name__ ) 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 exceptions.ValidationFailure(validate_msg)
def _do_dbvalidation(self, dbvalidator): func = parser.get_mapping_function( "dbvalidate", self.TESTCASE_SHARED_FUNCTIONS_MAPPING) dbvalidate_msg = "dbvalidate: {}".format(dbvalidator) kwargs = dbvalidator try: func(**kwargs) dbvalidate_msg += "\t==> pass" logger.log_debug(dbvalidate_msg) except (AssertionError, TypeError, LookupError, Exception) as err: dbvalidate_msg += "\t==> fail" logger.log_error(dbvalidate_msg) logger.log_error(" ".join(err.args)) raise exceptions.DbValidationFailure(dbvalidate_msg)
def validate( self, validators: Validators, variables_mapping: VariablesMapping = None, functions_mapping: FunctionsMapping = None, ) -> NoReturn: self.validation_results = {} if not validators: return validate_pass = True failures = [] for v in validators: if "validate_extractor" not in self.validation_results: self.validation_results["validate_extractor"] = [] u_validator = uniform_validator(v) # check item check_item = u_validator["check"] if "$" in check_item: # check_item is variable or function check_value = parse_data( check_item, variables_mapping, functions_mapping ) else: check_value = jmespath.search(check_item, self.resp_obj_meta) check_value = parse_string_value(check_value) # comparator assert_method = u_validator["assert"] assert_func = get_mapping_function(assert_method, functions_mapping) # expect item expect_item = u_validator["expect"] # parse expected value with config/teststep/extracted variables expect_value = parse_data(expect_item, variables_mapping, functions_mapping) validate_msg = f"assert {check_item} {assert_method} {expect_value}({type(expect_value).__name__})" validator_dict = { "comparator": assert_method, "check": check_item, "check_value": check_value, "expect": expect_item, "expect_value": expect_value, } try: assert_func(check_value, expect_value) validate_msg += "\t==> pass" logger.info(validate_msg) validator_dict["check_result"] = "pass" except AssertionError: validate_pass = False validator_dict["check_result"] = "fail" validate_msg += "\t==> fail" validate_msg += ( f"\n" f"check_item: {check_item}\n" f"check_value: {check_value}({type(check_value).__name__})\n" f"assert_method: {assert_method}\n" f"expect_value: {expect_value}({type(expect_value).__name__})" ) logger.error(validate_msg) failures.append(validate_msg) self.validation_results["validate_extractor"].append(validator_dict) if not validate_pass: failures_string = "\n".join([failure for failure in failures]) raise ValidationFailure(failures_string)
def validate( self, validators: Validators, variables_mapping: VariablesMapping = None, functions_mapping: FunctionsMapping = None, ) -> NoReturn: variables_mapping = variables_mapping or {} functions_mapping = functions_mapping or {} self.validation_results = {} if not validators: return validate_pass = True failures = [] for v in validators: if "validate_extractor" not in self.validation_results: self.validation_results["validate_extractor"] = [] u_validator = uniform_validator(v) # check item check_item = u_validator["check"] if "$" in check_item: # check_item is variable or function check_item = parse_data( check_item, variables_mapping, functions_mapping ) check_item = parse_string_value(check_item) if check_item and isinstance(check_item, Text): try: check_value = self._search_jmespath(check_item) except JMESPathError: check_value = self._search_re(check_item) else: # variable or function evaluation result is "" or not text check_value = check_item # comparator assert_method = u_validator["assert"] assert_func = get_mapping_function(assert_method, functions_mapping) # expect item expect_item = u_validator["expect"] # parse expected value with config/teststep/extracted variables expect_value = parse_data(expect_item, variables_mapping, functions_mapping) # message message = u_validator["message"] # parse message with config/teststep/extracted variables message = parse_data(message, variables_mapping, functions_mapping) validate_msg = f"assert {check_item} {assert_method} {expect_value}({type(expect_value).__name__})" validator_dict = { "comparator": assert_method, "check": check_item, "check_value": check_value, "expect": expect_item, "expect_value": expect_value, "message": message, } try: assert_func(check_value, expect_value, message) validate_msg += "\t==> pass" logger.info(validate_msg) validator_dict["check_result"] = "pass" except AssertionError as ex: validate_pass = False validator_dict["check_result"] = "fail" validate_msg += "\t==> fail" validate_msg += ( f"\n" f"check_item: {check_item}\n" f"check_value: {check_value}({type(check_value).__name__})\n" f"assert_method: {assert_method}\n" f"expect_value: {expect_value}({type(expect_value).__name__})" ) message = str(ex) if message: validate_msg += f"\nmessage: {message}" logger.error(validate_msg) failures.append(validate_msg) self.validation_results["validate_extractor"].append(validator_dict) if not validate_pass: failures_string = "\n".join([failure for failure in failures]) raise ValidationFailure(failures_string)