前言
作为一名测试人员,需要不断提升软件交付质量以及提升测试效率,其中一个有效的方法则是勤于软件缺陷分析。想要做好缺陷分析,最基础的环节是快速获取呈现数据。
缺陷管理库记录了缺陷相关的资料,为缺陷分析提供了详细的信息,是缺陷分析的数据来源。下文将学习如何访问redmine获取数据。
REST API
Redmine的部分数据可以通过REST API访问。该API提供对资源(resources)访问和基础的增更删操作,且同时支持XML和JSON格式。下面讲述一下常用方法。
Python-Redmine
REST API提供用于Python的语言的库,即Python-Redmine,提供简单有力的接口。
环境搭建
$ pip install python-redmine
简单配置
- Redmine类
从redminelib库导入 Redmine类,用于下面流程中生成redmine对象。
from redminelib import Redmine
- 访问地址
实例化Redmine对象时,需要赋值访问的地址参数,以F项目为例:
redmine = Redmine('http://10.20.11.218:8222/redmine')
- 关于版本号
Redmine的API有很多版本,不同版本支持不同的资源和特征。为了保证不出问题,需要指明Redmine版本号。通过该访问http://10.20.11.218:8222/redmine/admin/info可知版本号,见下:(需要管理员权限)
redmine = Redmine('http://10.20.11.218:8222/redmine', version='3.3.1')
-
授权登录
大多数情况,API都需要授权登录,常用有两种不同的登录方式:- 个人账户的用户名密码登陆
- 通过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个人账户页面获取:
基本概念介绍
1.资源
在Redmine管理中,资源(Resource)在其中是个重要的概念,因为我们的Bug管理的记录都是靠这些资源作为一个个集合体依据一定的关系所构建出来,如同关系型数据库一般。 举个例子,当我们访问到某个Project的时候,我们能够获得这个Project的信息,包括名称、id、描述等,不仅如此,我们通过对象中的元素变量issues能够获得这个Project下面的所有bug issue。而反过来,我们知道一个bug issue后,也能通过其issue id来反搜出它所在的project id。
而在Redmine中,已经存在了一些定义好的资源类型,方便我们直接使用,当然我们也可以自己根据需要去新建资源类型。
如下是我们常见并且需要掌握才能够熟悉Redmine的资源类型:
Issue, Project, User, Version, Issue Status
2. 资源管理器
如上所述,在Redmine当中,有着许许多多的资源,而在Python-redmine中,我们可以通过管理器(ResourceManager )的模式去访问我们的资源。那首先来看看什么是资源管理器:
>>> redmine.project
>>> redmine.issue
>>> redmine.user
以上几个是我们比较常见的资源管理器,通过资源管理器我们才能够进行下面的一些基本操作。
这里需要注意的是,在官方的文档当中,推荐我们直接用管理器调用其基本操作的方法来获得我们的资源,而不是通过中间变量来获得资源管理器,原因应该是担心在使用过程中,有可能会有误操作将资源管理器的引用指向别的变量而导致管理器污染。
//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 操作,也就是我们常说的“增删查改“。但并不是每个资源管理器都会有这样的操作,所以如果使用了不支持的方法,管理器也会报出相应的异常。
以下给出简单的增删查改样例:
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
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
all():
>>> projects = redmine.project.all()
>>> projects
update():
>>> redmine.project.update(123, name='Work', description='Work tasks')
True
delete():
>>> redmine.project.delete(1)
True
除此之外,还有个比较重要的操作就是filter(),如果我们要用于后续的分析和统计,filter函数能够帮助我们筛选出符合我们需求的version或者issue来进行操作。
>>> issues = redmine.issue.filter(project_id='vacation')
>>> issues
如上面例子,我们能够通过project_id来筛选出全部是vacation的issue。
总结
综上所述,掌握以上内容,我们就基本能够使用Python-redmine,可以对已经搭建好的Redmine服务器进行访问和操作。除此之外,结合需求,我们能够通过Python的接口调用数据,再通过Python的第三方库,如Panda来展示数据,能够实现进一步的Bug分析以及后续的开发指导。