Python导入Bug/Cases到Redmine

上一篇 / 下一篇  2021-10-09 11:47:10 / 个人分类:Python


]^8gR YSL1g0

前言

e|1M2b IT0作为一名测试人员,需要不断提升软件交付质量以及提升测试效率,其中一个有效的方法则是勤于软件缺陷分析。想要做好缺陷分析,最基础的环节是快速获取呈现数据。

*F[%Vw"q;Is0

~!EL8meOI C8yw0缺陷管理记录了缺陷相关的资料,为缺陷分析提供了详细的信息,是缺陷分析的数据来源。下文将学习如何访问redmine获取数据。51Testing软件测试网8Aun~;O

REST API

6d+M N _+F+[6^K|Vc0Redmine的部分数据可以通过REST API访问。该API提供对资源(resources)访问和基础的增更删操作,且同时支持XML和JSON格式。

gL1h q4m#y*\0
#To start making requests to Redmine you have to check the box Enable REST API in Administration -> 
# Settings -> Authentication and click the Save button.

m'pdl$O:j0下面讲述一下常用方法。

B @)g's klnz A!L;B0

Python-Redmine

eTV1L,UfY-b8q0REST API提供用于Python的语言的库,即Python-Redmine,提供简单有力的接口。51Testing软件测试网u8R NS9Pk

环境搭建

$ pip install python-redmine

简单配置

  • Redmine类
    5~&?t"sd~o3L6W NQ0从redminelib库导入 Redmine类,用于下面流程中生成redmine对象。
fromredminelibimportRedmine
  • 访问地址51Testing软件测试网!LVYeLO;O.v
    实例化Redmine对象时,需要赋值访问的地址参数,以F项目为例:
redmine=Redmine('http://10.20.11.218:8222/redmine')

Clff"Zz X%Y0
redmine = Redmine('http://10.20.11.218:8222/redmine', version='3.3.1')
  • 2U`[?Wr0授权登录
    |LK0v o$t O*x0大多数情况,API都需要授权登录,常用有两种不同的登录方式:51Testing软件测试网6oc r f1I/S,a

    1. 个人账户的用户名密码登陆
    2. 通过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')
51Testing软件测试网`#]v-M:g?;B

其中key可以从redmine个人账户页面获取.51Testing软件测试网c5SQQ#j*y

基本概念介绍

1.资源

51Testing软件测试网8C1wi6c5N/UZ

在Redmine管理中,资源(Resource)在其中是个重要的概念,因为我们的Bug管理的记录都是靠这些资源作为一个个集合体依据一定的关系所构建出来,如同关系型数据库一般。 举个例子,当我们访问到某个Project的时候,我们能够获得这个Project的信息,包括名称、id、描述等,不仅如此,我们通过对象中的元素变量issues能够获得这个Project下面的所有bug issue。而反过来,我们知道一个bug issue后,也能通过其issue id来反搜出它所在的project id。51Testing软件测试网"@*dY4I9q
而在Redmine中,已经存在了一些定义好的资源类型,方便我们直接使用,当然我们也可以自己根据需要去新建资源类型。
g:g7s3Q-T rg9t0如下是我们常见并且需要掌握才能够熟悉Redmine的资源类型:51Testing软件测试网x ilDS_Z[p8Q
Issue, Project, User, Version, Issue Status51Testing软件测试网hn sU-Ei L

2. 资源管理器

51Testing软件测试网0d;j@!\,e`j!g3C

如上所述,在Redmine当中,有着许许多多的资源,而在Python-redmine中,我们可以通过管理器(ResourceManager )的模式去访问我们的资源。那首先来看看什么是资源管理器:

wW x-MpN%sVt0
>>> 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>
51Testing软件测试网7S#iS q w!HCY

以上几个是我们比较常见的资源管理器,通过资源管理器我们才能够进行下面的一些基本操作。

)F!n*y9s-p&U$R3Wh/NQ051Testing软件测试网#iA$G(F @[ q)CP t2x

这里需要注意的是,在官方的文档当中,推荐我们直接用管理器调用其基本操作的方法来获得我们的资源,而不是通过中间变量来获得资源管理器,原因应该是担心在使用过程中,有可能会有误操作将资源管理器的引用指向别的变量而导致管理器污染。

&V9D8r)u:D)D0
//this is goodp1=redmine.project.get(1)p2=redmine.project.get(2)//this is not so goodproject=redmine.project
 p1=project.get(1)p2=project.get(2)

2..基本操作

W+cw ~1e~'hB0一般来讲,资源管理器会有CRUD 操作,也就是我们常说的“增删查改“。但并不是每个资源管理器都会有这样的操作,所以如果使用了不支持的方法,管理器也会报出相应的异常。51Testing软件测试网f:S%O7R$IAW5AR F

+k:Nh2DQkJ x0以下给出简单的增删查改样例:
~,} GU8Y0create():51Testing软件测试网*lm8wX/q u

>>>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">
51Testing软件测试网2tS0J.yP4ra Q4g

new():51Testing软件测试网x.QL0c Y,K^ ~M L

>>>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
51Testing软件测试网*d&hYf"p3sY

get()51Testing软件测试网8O.B8wO!sSaQ

>>>project=redmine.project.get('vacation')>>>project<redminelib.resources.Project#123 "Vacation">
51Testing软件测试网.m'P%i{[/r{N1{

all():

C@%t} f)}r@6a0
>>>projects=redmine.project.all()>>>projects<redminelib.resultsets.ResourceSetobject withProjectresources>
51Testing软件测试网+IL&{gg#g

update():

Bs#T"fZ1y@0
>>>redmine.project.update(123,name='Work',description='Work tasks')True
51Testing软件测试网8HF"]1QO)j9xjZ6M)M

delete():51Testing软件测试网{ e VA)ee(?$X9u h7p

>>> redmine.project.delete(1)True

\8B:|N&?"OM(v)r%u}0除此之外,还有个比较重要的操作就是filter(),如果我们要用于后续的分析和统计,filter函数能够帮助我们筛选出符合我们需求的version或者issue来进行操作。

a#TtF)?'xh"| S#h,~0
>>>issues=redmine.issue.filter(project_id='vacation')>>>issues<redminelib.resultsets.ResourceSetobject withIssueresources>
51Testing软件测试网&l2r7K1l \ZO

如上面例子,我们能够通过project_id来筛选出全部是vacation的issue。51Testing软件测试网'oXn2G(^C,cC

总结

51Testing软件测试网["@g1Ywq0Mv

综上所述,掌握以上内容,我们就基本能够使用Python-redmine,可以对已经搭建好的Redmine服务器进行访问和操作。除此之外,结合需求,我们能够通过Python的接口调用数据,再通过Python的第三方库,如Panda来展示数据,能够实现进一步的Bug分析以及后续的开发指导。51Testing软件测试网]$e^ R"k5a-LUQxE

51Testing软件测试网Pr1hI6D$dn

实例:

#!/usr/bin/python
# -*- coding: UTF-8 -*-

*J%z kIdw/a3S0
import xlwings as xw
from pathlib import Path

Dz.Tv.uXB0
from redminelib import Redmine

+|}+Z0mXg-F$k0
redmine = Redmine('http://IP/'username='XXX'password='XXX')
project = redmine.project.get('ProjectID')

&m#S_Ix5SG^WZ_0
print('Project ID is:', project.id)
51Testing软件测试网"e2_2ggQ7{u
print(project.identifier)
print(project.created_on)
print('project.description:', project.description)

fo5O0jx{8E/z+j$L-A0
#To start making requests to Redmine you have to check the box Enable REST API in Administration -> 
# Settings -> Authentication and click the Save button.
51Testing软件测试网n]r5X*H {a9R
app=xw.App(visible=True,add_book=False)
app.display_alerts=False
app.screen_updating=False
myexcel_casefile = Path(r'Your/case.xlsx')
wb=app.books.open(myexcel_casefile)
wb=xw.books.active
sht=wb.sheets['00主UI']
print('当前sheet是:', sht)

I'd'wz|mt0
rng=wb.sheets['00主UI'].range('A2:AD2')
#rng=sht.range('A1')
print('A2行:', rng)

&o7SJxdoI*r0
#a1v=sht.range('A2').value
a1v=rng.value
print('A2行的内容:', a1v)
for v in a1v:
    print(v)
51Testing软件测试网&V4@Srd c@ k\
last_row = sht.range(2,1).end('down').row
print('last_row is:', last_row)
print("The last row is {row}.".format(row=last_row))
= 3
while n <= last_row:
    if sht.range(n,7).value == None:
        break
    print('\nCase:', n-2)
    print('用例标题:', sht.range(n,7).value)
    print('用例步骤:\n', sht.range(n,13).value)
    newcase = redmine.issue.new()
    newcase.project_id = '1'
    newcase.tracker = "Bug"
    newcase.subject = sht.range(n,7).value
    newcase.status = "New"
    newcase.priority = "Normal"
    newcase.description = sht.range(n,13).value
#自定义字段:
    newcase.custom_fields = [
        {'id'1'value':f'这里是预期结果{n}'},
        {'id'2'value''Pass'},
        {'id'5'value'f'备注信息{n}'}
    ]
51Testing软件测试网%^3l3VAA"a3K*VU
    newcase.save()
    n=n+1

3z3Dq:Z/l.b0
wb.close()
app.quit()

`r^K8qF0

TAG:

 

评分:0

我来说两句

日历

« 2022-01-19  
      1
2345678
9101112131415
16171819202122
23242526272829
3031     

数据统计

  • 访问量: 186380
  • 日志数: 131
  • 图片数: 4
  • 文件数: 1
  • 书签数: 1
  • 建立时间: 2006-12-11
  • 更新时间: 2021-12-21

RSS订阅

Open Toolbar