使用脚本同步MeterSphere开源持续测试平台与Jira的工单状态

近期 , 我司引入了一款开源持续测试平台MeterSphere 。基于该持续测试平台中的测试计划和测试用例模块 , 测试团队初步建立起相关概念 , 并通过两个方面提高了我司整体的测试水平 。首先 , 团队的测试用例管理模式由线下转移到线上 , 大大提高了测试用例的复用程度 。同时 , 基于MeterSphere平台管理测试计划也成为测试人员的基本任务之一 , 通过关联测试用例覆盖测试需求 。
由于公司的工单管理系统使用的是Jira , 通过Jira工单流转来管理测试人员的工作排期和分发以及上线 。所以测试人员需要维护MeterSphere和Jira两个平台的工单状态 , 且需要手动创建MeterSphere的测试计划 。基于节省人力的考虑 , 针对建立MeterSphere测试计划和测试计划状态维护 , 我司做了两个脚本用来同步MeterSphere和Jira工单的状态 。, 现分享给大家 。
方案
Step 1:将Jira中状态为“进行中”的工单导入到MeterSphere 。实现的方案是向MeterSphere数据库test_plan表中直接插入数据;
Step 2:轮询查询MeterSphere中状态为“未进行”和“进行中”的测试计划 。如果发现Jira工单已经关闭 , 就直接将MeterSphere的测试计划关闭 。
开发工具
脚本语言:Python
集成工具:Jenkins
开发过程
Step 1:将Jira中状态为“进行中”的工单同步到MeterSphere测试计划中 。
首先 , 在Jira中查询状态为“进行中”的工单 。jira_option = {'server': 'https://jira.xx.com/','verify': False}jiraClinet = JIRA(options=jira_option, basic_auth=('xxxxxx', 'xxxxx')) # 用户名和密码projects = jiraClinet.projects()dashboards = jiraClinet.dashboards()issue_list = jiraClinet.search_issues("project in (LKXD, CSXT, ZQQS, ZLZC) AND issuetype in (线上BUG, 技术优化,需求, 子任务, 任务) AND status in (待审核, 待测试, 待上线, 测试中, 'In Progress', 开发中, 排期中, 暂停) AND 测试人员 is notEMPTY AND 测试开始时间 is not EMPTY AND 上线时间 is not EMPTY",0,1000)
查询完成后 , 插入到MeterSpher中的test_plan数据库 。db = pymysql.connect(host="192.168.15.111",port=3307,user="root",passwd="Password123@mysql", charset='utf8',database="metersphere")cursor = db.cursor(pymysql.cursors.DictCursor)try:selectResultList = cursor.fetchall()for i in range(len(selectResultList)):for issue in issue_list:if issue.key in selectResultList[i]['name']:issue_list.remove(issue)continuefor insert_issue in issue_list:p = Pinyin()creator=p.get_pinyin(u"%s"%(insert_issue.fields.customfield_10203), '')if 'CSXT' in insert_issue.key:projectId='61f3ed61-a5bf-49c4-b1ab-080a1e6f9068'else:projectId='a21fc914-6832-4465-8375-8afd329a964b'myName=str(insert_issue.key)+str(insert_issue.fields.summary)timeArray = time.strptime(insert_issue.fields.customfield_10301, "%Y-%m-%d")timeStamp = int(time.mktime(timeArray))*1000timeArray1 = time.strptime(insert_issue.fields.customfield_10304, "%Y-%m-%d")timeStamp1 = int(time.mktime(timeArray1))*1000sql = """INSERT INTO test_plan (id,workspace_id,report_id,NAME,description,STATUS,stage,principal,test_case_match_rule,executor_match_rule,tags,create_time,update_time,planned_start_time,planned_end_time,actual_start_time,actual_end_time,creator,project_id,execution_times)VALUE('%s','0b0700e9-7c18-11eb-a6a1-0242ac120003','','%s','','Prepare','smoke','%s','','','["%s"]','%s','%s','%s','%s','%s','%s','%s','%s',0)"""% (random.randint(10001, 9999999),myName,creator,insert_issue.fields.customfield_10201,int(round(time.time() * 1000)),int(round(time.time() * 1000)),timeStamp,timeStamp1,timeStamp,timeStamp1,creator,projectId)print(sql)cursor.execute(sql)db.commit()except Exception as err:print("error >>> " , err )db.rollback()db.close()
至此 , 将Jira中状态为“进行中”的工单同步到Metersphere测试计划的工作就完成了 。
Step 2:将Jira中已关闭的工单同步到MeterSphere测试计划中 。
查询过去24小时内状态标记为“已完成”的jira工单 。def jirainfo():a = datetime.datetime.now()time = a + datetime.timedelta(days = -1)time = time.strftime("%Y-%m-%d")jira_option = {'server': 'https://jira.zz.com/','verify': False}jiraClinet = JIRA(options=jira_option, basic_auth=('zhaochuanhui', '1qaz!QAZ'))re=("project in (LKXD, CSXT, ZQQS, ZLZC) AND issuetype in (线上BUG, 技术优化, 需求, 子任务, 任务) AND status in (完成) AND 测试人员 is not EMPTY AND 测试开始时间 is not EMPTY AND 上线时间 is not EMPTY AND updated >= %s")%(time)issue_list = jiraClinet.search_issues(re, 1, 1000)return issue_list