title: Jira用例自动去除summary重复用例
tags:
- jira
- python
categories:
- python
在使用 Jira 进行项目管理时,测试用例的维护至关重要。随着项目推进,用例数量增多,可能会出现 summary 重复的情况,手动排查费时费力,因此实现自动去除重复用例功能意义重大。
一、背景与需求
项目团队在 Jira 中积累了大量测试用例,由于多人协作、版本迭代等因素,一些用例的 summary 表述相近甚至完全相同,这不仅造成视觉混乱,还可能导致测试覆盖不精准、资源浪费。我们迫切需要一个自动化机制,能够快速识别并清理这些重复项,确保用例库的简洁与高效。
二、解决方案思路
-
数据获取:利用 Jira API 连接到项目实例,获取所有测试用例的详细信息,重点提取 summary 字段及对应的用例 ID 等关键数据,以便后续比对操作。
-
重复判断算法:采用文本相似度算法,当两个用例 summary 的相似度高于阈值时,标记为潜在重复项。考虑到部分特殊字符、空格差异不影响语义实质,在比对前可进行规范化预处理,如统一转小写、去除多余空格等。
-
自动处理流程:对于标记的重复用例,根据预先设定规则,如保留创建时间最早或最后更新的用例,通过 API 发起删除操作,将其他重复版本从 Jira 中移除。
三、实施步骤
- 开发环境搭建:选择合适编程语言(如 Python),安装 Jira API 相关库,配置好连接 Jira 服务器所需认证信息,确保能顺利访问数据。
“`python
def login():
# Jira服务器地址,用户名和密码
jira_server = 'https://jira.xxx.com'
jira_user = 'xxx'
jira_password = 'xxx'
# 创建Jira实例并登录
try:
jira_instance = JIRA(server=jira_server, basic_auth=(jira_user, jira_password))
print("Logged in successfully.")
except JIRAError as e:
print(f"Failed to log in to Jira: {e}")
return jira_instance
“`
-
代码编写与调试:按照数据获取、相似度计算、重复处理逻辑逐步编写代码,在测试环境中使用部分样本用例数据进行调试,不断优化算法阈值,确保准确识别重复且无误删风险。
“`python
def search(jira_instance,jql_query,i): try: issues = jira_instance.search_issues(jql_query,maxResults=None) flag = 1 counterDict = {} for issue in range(0,len(issues)): if i.strip() ==issues[issue].fields.summary.strip(): counterDict[issues[issue].key]=issues[issue].fields.status.name else: print(f"{i}!= {issues[issue].fields.summary},跳过废弃操作") failSummaryList.append(issues[issue].fields.summary) for item ,status in counterDict.items(): if status=='UI自动化' or status=='接口自动化': flag = 0 print("重复已自动化的用例:"+item) continue else: if flag == 1: #print(i.strip()+"=="+issues[issue].fields.summary,flag) flag = 0 continue else: jira_instance.transition_issue(issues[issue].key, 'xxx') #改变用例的状态,需要先找到目标状态的transition ID print(f"Issue Key: {issues[issue].key}, Summary: {issues[issue].fields.summary},PASS") print("====================") except JIRAError as e: print(f"Error searching issues: {e}")
def getSummary(jira_instance,jql_query):
summaryList=[]
try:
issues1 = jira_instance.search_issues(jql_query,maxResults=None)
#issues1 = jira_instance.search_issues(jql_query)
for issue in issues1:summaryList.append(issue.fields.summary) except JIRAError as e: print(f"获取summary失败: {e}") counter=keep_duplicates(summaryList) print(counter) summaryList=list(set(counter)) return summaryList
def keep_duplicates(lst):
counter = Counter(lst)
return [item for item in lst if counter[item] > 1 ]“`
-
部署与监控:将代码部署到jenkins,设置定时任务定期运行去重程序
jira_instance=login()
#获取第一个参数
first_argument = sys.argv[1]
client = sys.argv[2]
falg = sys.argv[3]
query = first_argument + client
print("查询条件是:"+query)
file_infos = getSummary(jira_instance,query)
if falg =='1':
print("重复的用例是:", file_infos)
for i in file_infos:
file_info= re.sub(r'[\x00-\xff]', '', i)
jql_query = first_argument+client+" AND summary ~{0}".format(file_info)
# print(jql_query)
search(jira_instance,jql_query,i)
else:
print("已查出重复的用例是:", file_infos)
“`python
#改变用例的状态,需要先找到目标状态的transition ID
# transitions = jira_instance.transitions(bug_id)
# print(transitions)
# for transition in transitions:
# print(f”ID: {transition[‘id’]}, Name: {transition[‘name’]}”)
“`
评论前必须登录!
注册