背景
为了有效统计接口的覆盖率,并为后续实现接口层级的精准测试奠定基础,我们需要将自动化发起的请求 URL 保存至数据库。然而,在对收集到的请求 URL 进行分析时,我们发现许多接口的 URL 是通过参数拼接的。例如,查询日志的接口通常会包含一个特定的日志 ID。如果不对这些参数进行处理,可能会导致数据库中存储大量重复的、相似的 URL,从而影响后续的数据分析和测试效率。
解决方案
函数的主要功能是将给定的 URL 中的特定参数替换为 {key} 格式,同时将 UUID 和数字替换为 {uuid} 和 {num}。这样可以方便地在 API 路径中使用占位符,并且去重。
# -*- coding: utf-8 -*-
# @Time : 2025/3/6 16:03
# @Author : X1A0RAN
# @Software: PyCharm
# @Desc :
import re
# 正则表达式匹配 UUID
uuid_pattern = r'([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}|[0-9a-fA-F]{32})'
def url_format(url, params={}):
uuid_pattern = r'([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}|[0-9a-fA-F]{32})'
api_urls = url.split('?')[0].split('/')
for k, v in params.items():
value = str(v)
if value in api_urls:
api_urls = ['{' + k + '}' if x == value else x for x in api_urls]
api_urls = ['{uuid}' if bool(re.search(uuid_pattern, x)) else x for x in api_urls]
api_urls = ['{num}' if x.isdigit() else x for x in api_urls]
return '/'.join(api_urls)
if __name__ == '__main__':
print(url_format('/avs/services/b63fa8b8-a794-421e-8b83-a23b9d1d19c2'))
# /avs/services/{uuid}
print(url_format('/openapi/iam/v1/users/97df52b3cdc34e0a8d99faa6dfb84eb1/association/prm/545912'))
# /openapi/iam/v1/users/{uuid}/association/prm/{num}
print(url_format(
'/tenant/ulogs/77b69ef6-0b7b-4702-9acf-f3a52f734ca9',
{'ulog_id': '77b69ef6-0b7b-4702-9acf-f3a52f734ca9'}
))
# /tenant/ulogs/{ulog_id}
print(url_format(
'/project/info/7cedf11ce31b64e2bbc547172562a3755',
{'project_id': '7cedf11ce31b64e2bbc547172562a3755'}
))
# /project/info/{project_id}