前言
作為一名測試人員,需要不斷提升軟件交付質(zhì)量以及提升測試效率,其中一個有效的方法則是勤于軟件缺陷分析。想要做好缺陷分析,最基礎(chǔ)的環(huán)節(jié)是快速獲取呈現(xiàn)數(shù)據(jù)。
缺陷管理庫記錄了缺陷相關(guān)的資料,為缺陷分析提供了詳細的信息,是缺陷分析的數(shù)據(jù)來源。下文將學(xué)習(xí)如何訪問redmine獲取數(shù)據(jù)。
REST API
Redmine的部分數(shù)據(jù)可以通過REST API訪問。該API提供對資源(resources)訪問和基礎(chǔ)的增更刪操作,且同時支持XML和JSON格式。下面講述一下常用方法。
Python-Redmine
REST API提供用于Python的語言的庫,即Python-Redmine,提供簡單有力的接口。
環(huán)境搭建
$ pip install python-redmine
簡單配置
- Redmine類
從redminelib庫導(dǎo)入 Redmine類,用于下面流程中生成redmine對象。
from redminelib import Redmine
- 訪問地址
實例化Redmine對象時,需要賦值訪問的地址參數(shù),以F項目為例:
redmine = Redmine('http://10.20.11.218:8222/redmine')
- 關(guān)于版本號
Redmine的API有很多版本,不同版本支持不同的資源和特征。為了保證不出問題,需要指明Redmine版本號。通過該訪問http://10.20.11.218:8222/redmine/admin/info可知版本號,見下:(需要管理員權(quán)限)

redmine = Redmine('http://10.20.11.218:8222/redmine', version='3.3.1')
-
授權(quán)登錄
大多數(shù)情況,API都需要授權(quán)登錄,常用有兩種不同的登錄方式:- 個人賬戶的用戶名密碼登陸
- 通過API key訪問,不需要將用戶名和密碼寫入腳本中
redmine = Redmine('http://10.20.11.218:8222/redmine', username='username', password='password')
or
redmine = Redmine('http://10.20.11.218:8222/redmine', key='key')
其中key可以從redmine個人賬戶頁面獲?。?/p>

基本概念介紹
1.資源
在Redmine管理中,資源(Resource)在其中是個重要的概念,因為我們的Bug管理的記錄都是靠這些資源作為一個個集合體依據(jù)一定的關(guān)系所構(gòu)建出來,如同關(guān)系型數(shù)據(jù)庫一般。 舉個例子,當我們訪問到某個Project的時候,我們能夠獲得這個Project的信息,包括名稱、id、描述等,不僅如此,我們通過對象中的元素變量issues能夠獲得這個Project下面的所有bug issue。而反過來,我們知道一個bug issue后,也能通過其issue id來反搜出它所在的project id。
而在Redmine中,已經(jīng)存在了一些定義好的資源類型,方便我們直接使用,當然我們也可以自己根據(jù)需要去新建資源類型。
如下是我們常見并且需要掌握才能夠熟悉Redmine的資源類型:
Issue, Project, User, Version, Issue Status
2. 資源管理器
如上所述,在Redmine當中,有著許許多多的資源,而在Python-redmine中,我們可以通過管理器(ResourceManager )的模式去訪問我們的資源。那首先來看看什么是資源管理器:
>>> redmine.project
<redminelib.managers.ResourceManager object for Project resource>
>>> redmine.issue
<redminelib.managers.ResourceManager object for Issue resource>
>>> redmine.user
<redminelib.managers.ResourceManager object for User resource>
以上幾個是我們比較常見的資源管理器,通過資源管理器我們才能夠進行下面的一些基本操作。
這里需要注意的是,在官方的文檔當中,推薦我們直接用管理器調(diào)用其基本操作的方法來獲得我們的資源,而不是通過中間變量來獲得資源管理器,原因應(yīng)該是擔心在使用過程中,有可能會有誤操作將資源管理器的引用指向別的變量而導(dǎo)致管理器污染。
//this is good
p1 = redmine.project.get(1)
p2 = redmine.project.get(2)
//this is not so good
project = redmine.project
p1 = project.get(1)
p2 = project.get(2)
2..基本操作
一般來講,資源管理器會有CRUD 操作,也就是我們常說的“增刪查改“。但并不是每個資源管理器都會有這樣的操作,所以如果使用了不支持的方法,管理器也會報出相應(yīng)的異常。
以下給出簡單的增刪查改樣例:
create():
>>> project = redmine.project.create(
... name='Vacation',
... identifier='vacation',
... description='foo',
... homepage='http://foo.bar',
... is_public=True,
... parent_id=345,
... inherit_members=True,
... custom_fields=[{'id': 1, 'value': 'foo'}, {'id': 2, 'value': 'bar'}]
... )
>>> project
<redminelib.resources.Project #123 "Vacation">
new():
>>> project = redmine.project.new()
>>> project.name = 'Vacation'
>>> project.identifier = 'vacation'
>>> project.description = 'foo'
>>> project.homepage = 'http://foo.bar'
>>> project.is_public = True
>>> project.parent_id = 345
>>> project.inherit_members = True
>>> project.custom_fields = [{'id': 1, 'value': 'foo'}, {'id': 2, 'value': 'bar'}]
>>> project.save()
True
get()
>>> project = redmine.project.get('vacation')
>>> project
<redminelib.resources.Project #123 "Vacation">
all():
>>> projects = redmine.project.all()
>>> projects
<redminelib.resultsets.ResourceSet object with Project resources>
update():
>>> redmine.project.update(123, name='Work', description='Work tasks')
True
delete():
>>> redmine.project.delete(1)
True
除此之外,還有個比較重要的操作就是filter(),如果我們要用于后續(xù)的分析和統(tǒng)計,filter函數(shù)能夠幫助我們篩選出符合我們需求的version或者issue來進行操作。
>>> issues = redmine.issue.filter(project_id='vacation')
>>> issues
<redminelib.resultsets.ResourceSet object with Issue resources>
如上面例子,我們能夠通過project_id來篩選出全部是vacation的issue。
總結(jié)
綜上所述,掌握以上內(nèi)容,我們就基本能夠使用Python-redmine,可以對已經(jīng)搭建好的Redmine服務(wù)器進行訪問和操作。除此之外,結(jié)合需求,我們能夠通過Python的接口調(diào)用數(shù)據(jù),再通過Python的第三方庫,如Panda來展示數(shù)據(jù),能夠?qū)崿F(xiàn)進一步的Bug分析以及后續(xù)的開發(fā)指導(dǎo)。