httprunner2.x--HttpRunner断言:validate 总述
一个完整的测试用例中应该包括“预期结果”和“实际结果”字段,而二者内容是否一致,是判断测试用例是否执行通过的标准。在自动化测试中,这个判断过程是由“断言(Assert)”来实现的。HttpRunner 框架中提供了多种类型的断言以供使用。
在 HttpRuner 框架源码中主要有三个文件涉及断言相关内容:
httprunner-2.5.5\httprunner\validator.py
httprunner-2.5.5\httprunner\parser.py
httprunner-2.5.5\httprunner\builtin\comparators.py
首先阅读 validator.py 文件,一共有 5 种格式可以用于断言处理:
对变量内容进行断言
对引用的函数进行断言
对字典(dict)或列表(list)进行断言,而且可能包含了变量和函数
对由分隔符连接的字符串进行断言
对正则表达式进行断言
其中,如果被断言的对象如果是 dict 或者 list,则按 1-3 项方式处理,否则按 4、5 项方式处理。
validator.py 源码文件及分析如下图所示:
def __eval_validator_check(self, check_item): """ evaluate check item in validator. Args: check_item: check_item should only be the following 5 formats: 1, variable reference, e.g. $token #变量 2, function reference, e.g. ${is_status_code_200($status_code)} #函数 3, dict or list, maybe containing variable/function reference, e.g. {"var": "$abc"} #字典或列表中可能包含的函数 4, string joined by delimiter. e.g. "status_code", "headers.content-type"#字符串和带分隔符的字符串 5, regex string, e.g. "LB[\d]*(.*)RB[\d]*"#正则表达式 """ if isinstance(check_item, (dict, list)) \ or isinstance(check_item, parser.LazyString): # format 1/2/3 #针对字典和列表 check_value = self.session_context.eval_content(check_item) else: # format 4/5 #针对其他类型 check_value = self.resp_obj.extract_field(check_item) return check_value
HttpRunner 断言支持两种格式:
{"comparator_name": [check_item, expect_value]} {"check": check_item, "comparator": comparator_name, "expect": expect_value}
如:
name: 断言的2种写法 request: url: https://www.baidu.com/ method: GET headers: User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.82 Safari/537.36 validate: # 断言一 - eq: [status_code, 200] # 断言二 - check: status_code comparator: eq expect: 200
执行后查看报告,两个验证完全相同。