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

发布于 2021年08月18日

近期,我司引入了一款开源持续测试平台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 not 
EMPTY 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)
                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测试计划的工作就完成了。

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

在MeterSphere的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定时任务会发出脚本,关闭MeterSphere中对应的测试计划。

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

————————————————
版权声明:本文为博客园博主「奔跑中的wiggins」的原创文章。

原文链接:

https://www.cnblogs.com/wiggins/p/15078801.html

关于MeterSphere

MeterSphere是FIT2CLOUD飞致云旗下品牌。作为一款一站式的开源持续测试平台( github.com/metersphere ),MeterSphere涵盖测试跟踪、接口测试、性能测试、 团队协作等功能,全面兼容JMeter、Postman、Swagger等开源标准,有效助力开发和测试团队充分利用云的弹性进行高度可扩展的自动化测试,加速高质量的软件交付。

自2020年6月发布至今,MeterSphere开源项目得到了开源社区的广泛认可和积极反馈,并已经在众多企业内落地使用。截至2021年7月,MeterSphere项目在代码托管平台GitHub上获得了超过5,000个Star和50,000次以上的独立下载。