HttpRunner3的$符号是如何解析的
本书作者:测试开发刚哥,文章版权归个人所有,未经授权请勿转载。 变量解析 $符号在很多测试框架中都会拿来用做变量解析,大名鼎鼎的JMeter就有这个用法。HttpRunner3也支持$符号,比如: Step( RunRequest("登录") .post("/login") .with_headers(**{"Content-Type": "application/json"}) .with_json({"username": "dongfanger", "password": "123456"}) .extract() .with_jmespath("body.token", "token") .validate() .assert_equal("status_code", 200) ), Step( RunRequest("搜索商品") .get("searchSku?skuName=电子书") .with_headers(**{"token": "$token"}) .extract() .with_jmespath("body.skuId", "skuId") .with_jmespath("body.price", "skuPrice") .validate() .assert_equal("status_code", 200) ), 从登录提取的变量token,在搜索商品中使用$token来引用。 parser.py HttpRunner对$符号的解析是在parser.py文件中实现的: 这些方法可以分为四类: url build_url() 变量 extract_variables() get_mapping_variable() parse_variables_mapping() regex_findall_variables() parse_data() parse_string() 函数 get_mapping_function() parse_function_params() regex_findall_functions() parse_string_value() parse_data() parse_string() 参数化("${parameterize(account.csv)}") parse_parameters() 本文专门针对变量这一块源码来进行剖析。 全局变量池 HttpRunner3在运行时的所有变量都是存储在__session_variables这个字典中的: 在脚本开始时会把config的预设变量加载进来,然后会在执行Step测试步骤时,把各个步骤的变量也放到全局变量池里面。 解析过程 在runner.py的第350行代码能看到解析变量的调用: 然后parse_variables_mapping()函数需要仔细看: def parse_variables_mapping( variables_mapping: VariablesMapping, functions_mapping: FunctionsMapping = None ) -> VariablesMapping: parsed_variables: VariablesMapping = {} while len(parsed_variables) != len(variables_mapping): for var_name in variables_mapping: if var_name in parsed_variables: continue var_value = variables_mapping[var_name] variables = extract_variables(var_value) # check if reference variable itself if var_name in variables: # e.g. # variables_mapping = {"token": "abc$token"} # variables_mapping = {"key": ["$key", 2]} raise exceptions.VariableNotFound(var_name) # check if reference variable not in variables_mapping not_defined_variables = [ v_name for v_name in variables if v_name not in variables_mapping ] if not_defined_variables: # e.g. {"varA": "123$varB", "varB": "456$varC"} # e.g. {"varC": "${sum_two($a, $b)}"} raise exceptions.VariableNotFound(not_defined_variables) try: parsed_value = parse_data( var_value, parsed_variables, functions_mapping ) except exceptions.VariableNotFound: continue parsed_variables[var_name] = parsed_value return parsed_variables tests/parser_test.py有一段测试代码: ...