最近需要預言:是否可以通過jira API實現用例管理,對jira的應用、API、擴展等進行了一定的了解。
Jira介紹:
jira是目前比較流行的基於Java架構的管理系統(Atlassian公司支持),有開源代碼,方便做二次開發(可擴展性)。
Jira的主要功能:
- 問題追蹤和管理:用它管理項目,跟蹤任務、bug、需求,通過jira的郵件通知功能進行協作通知,在實際工作中使工作效率提高很多
- 問題跟進情況的分析報告:可以隨時了解問題和項目的進展情況
- 項目類別管理功能:可以將相關的項目分組管理:
- 任務分配功能:方便測試管理人員,實現平台上的任務分配,將任務分配給不同的負責人。
- 項目email地址功能:每個項目可以有不同的email(該項目的通知郵件從該地址發出)
- 無限制的工作流:可以創建多個工作流為不同的項目使用:
Jira 官方API文檔:
https://docs.atlassian.com/software/jira/docs/api/REST/7.6.1/#api/2
Jira簡單介紹參考鏈接:
https://baijiahao.baidu.com/s?id=1600789671759427109&wfr=spider&for=pc
https://blog.csdn.net/liumiaocn/article/details/81301550
Python 的jira庫 ?
python的庫中有專門針對jira的操作。官方文檔:https://jira.readthedocs.io/en/latest/api.html#jira
- 簡單增刪改查操作:
1 #!/usr/bin/env python 2 # encoding: utf-8 3 from jira import JIRA 4 import time 5 6 jac = JIRA('http://xxx.xxx.xx.xxx:8080', basic_auth=('xxx', 'xxxyyy')) 7 issue_list1 = [] 8 for i in range(1000, 2000): 9 issue_list1.append({ 10 'project': {'key': 'TE'}, 11 'summary': "[%s]summary bulk added by api" % i, 12 'description': '0', 13 'issuetype': {'id': 10007} 14 }) 15 16 def func_time(func): 17 def wrapper(*args, **kwargs): 18 start = time.time() 19 result = func(*args, **kwargs) 20 end = time.time() 21 print("call %s, time: %f" %(func.__name__, end - start)) 22 return result 23 return wrapper 24 25 @func_time 26 def create_issues(issue_list2): 27 # 批量創建 28 issues = jac.create_issues(field_list=issue_list1) 29 print(len(issue_list2)) 30 31 @func_time 32 def search_one_issue(): 33 # 搜索指定的一個issue 34 jra = jac.project('TE') 35 a=jac.search_issues('project=TE and key = TE-400') 36 37 @func_time 38 def search_issues(): 39 # 批量搜索 40 issues = jac.search_issues('project=TE', maxResults=600) 41 print(len(issues)) 42 43 @func_time 44 def update_one_issue(): 45 # 更新指定的一個issue 46 myissue = jac.issue('TE-400') 47 issueupdate = { 48 'summary': 'test1001', 49 'description': 'update_for_myisue' 50 } 51 myissue.update(issueupdate) 52 53 a = myissue.fields() 54 if a.summary == issueupdate.get('summary'): 55 print("true") 56 else: 57 raise RunnerError('error') 58 59 @func_time 60 def get_issue(): 61 # 獲取一個issue issueid or issuekey 62 myissue = jac.issue('12006') 63 64 @func_time 65 def delete_issues(): 66 # 批量刪除 67 issues = jac.search_issues('project = TE AND description ~ "0"') 68 for i in issues: 69 i.delete() 70 71 @func_time 72 def delete_one_issue(): 73 # 刪除一個指定的issue 74 myissue = jac.issue('TE-1') 75 myissue.delete() 76 77 78 create_issues(issue_list1) 79 search_one_issue() 80 search_issues() 81 update_one_issue() 82 get_issue() 83 delete_issues() 84 delete_one_issue()
插件Zephyr:
- 主要功能包括:
- 創建、查看、編輯、克隆和執行測試
- 鏈接到故事、任務、需求等。
- 計划測試執行周期
- 邏輯上用文件夾結構將測試周期中的測試用例分組
- 與測試板的新的敏捷集成
- 將文件夾和周期鏈接到sprint以增強可追溯性
- 鏈接的缺陷
- Project-centric導航
- 帶有基本/高級搜索和預定義/保存過濾器的執行導航器
- 雙向端到端跟蹤報告
- 配置,跟蹤質量指標共享儀表板
- 用於高級搜索的Zephyr查詢語言(ZQL)
- 將測試自動化和CI工具與ZAPI集成(單獨銷售)
- 支持德語、法語、西班牙語、俄語、韓語、日語、簡體中文和土耳其語
- jira的插件Zephyr可以實現測試用例管理—參考鏈接:
https://blog.csdn.net/qq_32532165/article/details/83105442
並發操作:
進程池—設定指定數量的進程,當有新的請求提交到pool中時,如果進程池還沒有滿,那么就會創建一個新的進程來執行該請求;如果進程池中的進程數已經達到最大值,那么該請求就會等待,直到進程池中有進程結束,才會創建新的進程進行相應的執行。
- 簡單代碼示例:
1 #coding:utf-8
2 from multiprocessing import Pool 3 import time 4 import gevent 5 from gevent import monkey 6 from jira import JIRA 7
9 jac = JIRA('http://200.200.84.135:8080', basic_auth=('zjx', 'jiaxin32213')) 10
13 def run(): 14 for i in range(0,10): 15 issue_value = { 16 'project': {'key': 'TE'}, 17 'summary': "[%s]summary bulk added by api" % i, 18 'description': '0', 19 'issuetype': {'id': 10007} 20 } 21 jac.create_issue(fields = issue_value) 22
24 def call_gevent(count): 25 """調用gevent 模擬高並發"""
26 begin_time = time.time() 27 run_gevent_list = [] 28 for i in range(count): 29 print('--------------%d--Test-------------' % i) 30 run_gevent_list.append(gevent.spawn(run())) 31 gevent.joinall(run_gevent_list) 32 end = time.time() 33 #print('單次測試時間(平均)s:', (end - begin_time) / count)
34 print('累計測試時間 s:', end - begin_time) 35
38 def main(): 39 begin_time = time.time() 40 pool = Pool(processes=4) 41 for x in range(3): 42 result = pool.apply_async(call_gevent,(10,)) 43 pool.close() 44 pool.join() 45 if result.successful(): 46 print 'successful'
47 end = time.time() 48 print('累計測試時間 s:', end - begin_time) 49
51 #main()
53 call_gevent(count=30)