測試跟蹤實踐: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定時任務創建完畢,小功告成。

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM