测试跟踪实践:Metersphere与Jira工单状态同步

背景

公司最近引入metersphere测试平台,主要使用使用其测试跟踪中测试计划和测试用例模块。测试团队的测试用例管理模式由线下转移到线上管理,大大提高了测试用例的复用性。测试计划作为测试人员的基本任务来运作,通过关联测试用例覆盖测试需求。公司工单管理系统使用的是Jira。通过jira工单的流转来排期、分配开发测试人员以及上线。所以测试人员需要维护Metersphere和Jira两种工单状态,且需要手动创建Metersphere的测试计划。基于节省人力的考虑,针对建立Metersphere测试计划和测试计划状态维护,做了两个脚本用来同步Metersphere和Jira工单的状态。

实现方案

  1. 将Jira中进行中的工单导入到Metersphere中。实现方案是向Metersphere数据库test_plan表中直接插入数据。
  2. 轮询查询Metersphere中未进行和进行中的测试计划,如果发现Jira工单已经关闭,就直接将Metersphere的测试计划关闭。

开发工具

  • 脚本语言:python
  • 集成工具:jenkins

开发过程

 1、查询进行中的jira工单

python提供了规范的操作jira的API,感兴趣的同学可以学习一下。

官方文档:https://jira.readthedocs.io/en/latest/

查询进行中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 not 
EMPTY AND 测试开始时间 is not EMPTY AND 上线时间 is not EMPTY",0,1000)

 

插入到Meterspher中的test_plan数据库,关于表结构可以去查看一下DDL,这里不做解释。

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)
                continue
    for 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))*1000
        timeArray1 = time.strptime(insert_issue.fields.customfield_10304, "%Y-%m-%d")
        timeStamp1 = int(time.mktime(timeArray1))*1000
        sql = """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测试计划工作就完成了。

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

 

Metesphere的test_plan中查询未进行或者进行中的测试计划,并将其中在jira中已经完成的状态改为已完成。

try:
    for issue in jirainfo():
        sql = "SELECT * FROM test_plan WHERE name like '%" + issue.key + "%'"
        selectResultList = sqlInfo(1, sql)
        if selectResultList > 0:
            sql = ("UPDATE test_plan SET status = 'Completed' WHERE name like '%"+issue.key+"%'")
            print(sql)
            result = sqlInfo(2, sql)
            continue
except Exception as err:
    print("error >>> ", err)

 

集成Jenkins

1、拉代码

 

 

2、配置定时任务Build Triggers,每天晚上12点执行。

 

 3、执行脚本

 

效果

日常研发排期中进行中的jira工单 

 

同步后的metersphere中的测试计划,以下测试计划都是通过脚本自动创建的。

如果jira工单关闭,那么jenkins定时任务出发脚本,关闭meterspher中对应的测试计划。

 

到这里,Jenkins定时任务创建完毕,小功告成。

 

 

 

posted @ 2021-07-30 11:25  奔跑中的wiggins  阅读(1284)  评论(0编辑  收藏  举报