yaml数据驱动接口自动化测试框架开发1

B站影视 内地电影 2025-10-27 20:34 1

摘要:示例:对于字符串 "用户ID: ${user_id}, 用户名: ${username}",findalls会找到两个变量:user_id和username,然后从cache中取出对应的值,返回{“user_id”: cache[“user_id”], “us

本文内容主要是YAML数据驱动接口自动化测试框架开发

重点内容:yaml数据内容的参数化读取与替换

这个是yanl参数化与关联的核心技术!!!!!!!!!

findalls(string):

功能:从字符串中查找所有${variable}格式的变量,并返回一个字典,键为变量名,值为从全局cache中取出的对应值。

示例:对于字符串 "用户ID: ${user_id}, 用户名: ${username}",findalls会找到两个变量:user_id和username,然后从cache中取出对应的值,返回{“user_id”: cache[“user_id”], “username”: cache[“username”]}。

sub_var(keys, string):

功能:使用提供的字典keys来替换字符串中的变量。这里使用string.Template进行安全替换(safe_substitute),即如果某个变量在keys中不存在,则保留原变量字符串不变。

示例:对于字符串 "欢迎 ${user} 登录系统"和keys={“user”: “张三”},替换后得到"欢迎 张三 登录系统"。

get_var(key, raw_str):

功能:从raw_str中提取指定key的值。它首先尝试将raw_str解析为JSON,如果成功,则使用正则表达式匹配"key":"value"格式,返回value;如果解析失败,则使用正则表达式在raw_str中匹配key字符串后面对应的值(注意:在非JSON字符串中,它返回的是匹配到的key对应的值,而不是key本身)。

示例:对于JSON字符串'{"aa": 11, "bb": {"token": "3424324234233"}}'和key="token",它会返回"3424324234233"。对于非JSON字符串 "order_id:ORD789012,status:completed"它返回的是"ORD789012"。

在YAML测试数据中,我们为每个函数设计了多个测试用例。

对于findalls函数,我们测试了多种字符串,包括有多个变量、无变量、单个变量等,并打印出从cache中获取的变量值。

对于sub_var函数,我们测试了正常替换、空值替换、无替换等情况。

对于get_var函数,我们测试了从JSON字符串中提取值(包括嵌套JSON)和从非JSON字符串中提取数据。

1.findalls函数

cache = {}def findalls(string: t.Text) -> t.Dict[t.Text, t.Any]: """查找所有""" key = re.compile(r"\${(.*?)\}").findall(string) res = {k: cache.get(k) for k in key} print("需要替换的变量:{}".format(res)) return res

功能说明

findalls 函数用于从字符串中查找所有需要替换的变量占位符,并返回这些变量名及其在缓存中的当前值。

工作原理

使用正则表达式 \${(.*?)\} 匹配字符串中的所有 ${variable} 格式的占位符从全局缓存 cache 中查找这些变量名对应的值返回一个字典,包含变量名和对应的缓存值findalls_test: test_strings: - "用户ID: ${user_id}, 用户名: ${username}" - "订单号: ${order_id}, 金额: ${amount}" - "没有变量的字符串" - "只有${single_var}一个变量" - "嵌套${var1}和${var2}多个变量"

在接口测试中,findalls 函数常用于预处理请求参数:

cache = {}# 在发送请求前,检查请求参数中是否有需要替换的变量request_data = { "userId": "${user_id}", "token": "${auth_token}"}# 使用 findalls 检查需要哪些变量variables_needed = findalls(json.dumps(request_data))# 输出: 需要替换的变量:{'user_id': None, 'auth_token': None}# 这提示我们需要在缓存中设置这些变量

2.sub_var函数

def sub_var(keys: t.Dict, string: t.Text) -> t.Text: """替换变量""" s = Template(string) res = s.safe_substitute(keys) print("替换结果:{}".format(res)) return res

功能说明

sub_var 函数使用提供的变量字典实际替换字符串中的变量占位符

工作原理

使用 Python 的 string.Template 类进行变量替换使用 safe_substitute 方法,确保即使变量不存在也不会报错返回替换后的完整字符串sub_var_test: test_cases: - string: "欢迎 ${user} 登录系统" variables: {"user": "张三"} expected: "欢迎 张三 登录系统" - string: "订单 ${order_id} 金额为 ${amount} 元" variables: {"order_id": "ORD123456", "amount": "199.99"} expected: "订单 ORD123456 金额为 199.99 元"

在接口测试中,sub_var 函数用于动态构建请求数据:

# 从上一个接口响应中提取的数据已存入缓存cache.set("user_id", "1001")cache.set("auth_token", "abc123xyz")# 构建下一个请求的数据request_template = '{"userId": "${user_id}", "token": "${auth_token}"}'variables = findalls(request_template) # 找出需要替换的变量actual_request = sub_var(variables, request_template)# 输出: {"userId": "1001", "token": "abc123xyz"}

3.get_var函数

def get_var(key: str, raw_str: str) -> str: """ 改进的变量提取函数 Args: key: 要提取的键名,支持点号表示法(如 "user.token") raw_str: 原始字符串,可以是 JSON 或普通文本 Returns: 提取到的值,如果未找到返回 None """ # 尝试解析为 JSON try: data = json.loads(raw_str) # 支持嵌套键查找 keys = key.split('.') result = data for k in keys: if isinstance(result, dict) and k in result: result = result[k] else: return None return str(result) if result is not None else None except json.JSONDecodeError: # 对于非 JSON 字符串,尝试查找 key:value 或 key=value 模式 # 模式1: key:"value" 或 key:"value" pattern1 = r'["\']?%s["\']?\s*[:=]\s*["\']?([^,"\'\s]+)["\']?' % key match1 = re.search(pattern1, raw_str) if match1: return match1.group(1) # 模式2: 键值对用逗号或空格分隔 pattern2 = r'%s\s*[:=]\s*([^,\s]+)' % key match2 = re.search(pattern2, raw_str) if match2: return match2.group(1) return None

功能说明

get_var 函数从原始字符串中提取指定键对应的值,支持 JSON 格式和非 JSON 格式的字符串。

工作原理

首先尝试将字符串解析为 JSON如果成功:使用正则表达式 "key": "([^"]+)" 提取值如果失败:使用其他多种正则表达式 key 直接匹配对应的值,比如:支持多种键值对格式(key:value、key=value、"key":"value" 等)返回提取到的值get_var_test: test_cases: - key: "token" raw_str: '{"aa": 11, "bb": {"token": "3424324234233"}}' expected: "3424324234233" - key: "order_id" raw_str: "order_id:ORD789012,status:completed" expected: "order_id" # 注意:这里返回的是键名,不是值!

在接口测试中,get_var 函数用于从响应中提取数据:

# 从登录接口响应中提取 tokenlogin_response = '{"code": 200, "data": {"token": "abc123xyz", "user_id": "1001"}}'token = get_var("token", login_response)# 输出: abc123xyz# 将提取的 token 存入缓存,供后续请求使用cache.set("auth_token", token)

在完整的接口测试流程中,这三个函数通常按以下顺序协作:

# 1. 执行登录接口login_response = send_login_request# 响应: {"code": 200, "data": {"token": "abc123", "user_id": "1001"}}# 2. 使用 get_var 提取关键数据token = get_var("token", login_response)user_id = get_var("user_id", login_response)# 3. 将提取的数据存入缓存cache.set("auth_token", token)cache.set("user_id", user_id)# 4. 准备下一个请求(如查询用户信息)request_template = '{"userId": "${user_id}", "token": "${auth_token}"}'# 5. 使用 findalls 检查需要哪些变量needed_vars = findalls(request_template)# 输出: 需要替换的变量:{'user_id': '1001', 'auth_token': 'abc123'}# 6. 使用 sub_var 实际替换变量actual_request = sub_var(needed_vars, request_template)# 输出: {"userId": "1001", "token": "abc123"}# 7. 发送请求user_info_response = send_request(actual_request)

来源:小璇科技观

相关推荐