Python导入Bug/Cases到Redmine

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


~ V;c/y#l5|0

前言

51Testing软件测试网 XB&e.AnH"t r

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

D(B(?)L+U-Mo I0

m0P5`'L~v;T @0缺陷管理记录了缺陷相关的资料,为缺陷分析提供了详细的信息,是缺陷分析的数据来源。下文将学习如何访问redmine获取数据。

5AvV3?W,gl~:k0

REST API

B%Q*EW-Z4f0Redmine的部分数据可以通过REST API访问。该API提供对资源(resources)访问和基础的增更删操作,且同时支持XML和JSON格式。

fGf9m3T0?s s0
#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软件测试网)CE.p"p/AwV9u

下面讲述一下常用方法。

Qg"Wmnn~1sA7HR0

Python-Redmine

/~` x'a/gl0REST API提供用于Python的语言的库,即Python-Redmine,提供简单有力的接口。51Testing软件测试网!f0nvsN#o4{r6w3]/f6A

环境搭建

$ pip install python-redmine

简单配置

  • Redmine类51Testing软件测试网;o B |*mO
    从redminelib库导入 Redmine类,用于下面流程中生成redmine对象。
fromredminelibimportRedmine
  • 访问地址
    &E^%I Bt0实例化Redmine对象时,需要赋值访问的地址参数,以F项目为例:
redmine=Redmine('http://10.20.11.218:8222/redmine')

X})}a AeF8c-e0
redmine = Redmine('http://10.20.11.218:8222/redmine', version='3.3.1')
  • #c7e$Ry-lx@0授权登录51Testing软件测试网 Q&MyN7`|C.L.g
    大多数情况,API都需要授权登录,常用有两种不同的登录方式:51Testing软件测试网*yI4w6?&D$gO~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软件测试网z ljR(elEQ

其中key可以从redmine个人账户页面获取.

\ D]2]S't4l0

基本概念介绍

1.资源

[:Z6^jw$N0||+O"W0在Redmine管理中,资源(Resource)在其中是个重要的概念,因为我们的Bug管理的记录都是靠这些资源作为一个个集合体依据一定的关系所构建出来,如同关系型数据库一般。 举个例子,当我们访问到某个Project的时候,我们能够获得这个Project的信息,包括名称、id、描述等,不仅如此,我们通过对象中的元素变量issues能够获得这个Project下面的所有bug issue。而反过来,我们知道一个bug issue后,也能通过其issue id来反搜出它所在的project id。
u f8Uqa\i{:R5}0而在Redmine中,已经存在了一些定义好的资源类型,方便我们直接使用,当然我们也可以自己根据需要去新建资源类型。
#H*[4Qtp%x'v!W6TZc0如下是我们常见并且需要掌握才能够熟悉Redmine的资源类型:
6~-]/J*sB3A(w{@.T0Issue, Project, User, Version, Issue Status

N1H%v5S&] K Y0

2. 资源管理器

51Testing软件测试网*S i?i~1H:oQ

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

n)j6p|IG;L\i0
>>> 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>

X?g }(k:|0以上几个是我们比较常见的资源管理器,通过资源管理器我们才能够进行下面的一些基本操作。51Testing软件测试网%h?^CT"[?i_P

t,H*L0y4|;o0这里需要注意的是,在官方的文档当中,推荐我们直接用管理器调用其基本操作的方法来获得我们的资源,而不是通过中间变量来获得资源管理器,原因应该是担心在使用过程中,有可能会有误操作将资源管理器的引用指向别的变量而导致管理器污染。51Testing软件测试网?7h-K[C:wm

//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..基本操作

/k:I8c~rI-Q0一般来讲,资源管理器会有CRUD 操作,也就是我们常说的“增删查改“。但并不是每个资源管理器都会有这样的操作,所以如果使用了不支持的方法,管理器也会报出相应的异常。

-}0o n"pH+Gp/o I051Testing软件测试网[[fA8g4|tu

以下给出简单的增删查改样例:
YE V.n8[ c0create():51Testing软件测试网7Jt:dM8xQ Z8tp4[

>>>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软件测试网2C?'i5d^%f%h:if.@

new():

'yd _ a.Au:ee0
>>>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软件测试网L3s DP~!l Gk1d$Z D]

get()51Testing软件测试网%Q#cE3C*n+|AQ

>>>project=redmine.project.get('vacation')>>>project<redminelib.resources.Project#123 "Vacation">
51Testing软件测试网(@kuiy y4?U&]-j

all():

3is|$] I,n0
>>>projects=redmine.project.all()>>>projects<redminelib.resultsets.ResourceSetobject withProjectresources>

G&|lI,f}Za0update():

4uR|G:Em jV0
>>>redmine.project.update(123,name='Work',description='Work tasks')True
51Testing软件测试网 ONTp5g;EZRd

delete():

n,@ yzTNZ0
>>> redmine.project.delete(1)True

A|J:WJ9M:R0除此之外,还有个比较重要的操作就是filter(),如果我们要用于后续的分析和统计,filter函数能够帮助我们筛选出符合我们需求的version或者issue来进行操作。

Y.xq%V/G@2q4?0
>>>issues=redmine.issue.filter(project_id='vacation')>>>issues<redminelib.resultsets.ResourceSetobject withIssueresources>

%bGWk"p;qm4}0如上面例子,我们能够通过project_id来筛选出全部是vacation的issue。51Testing软件测试网u;_4A$_vx8_

总结

51Testing软件测试网a mI P:S3uA3| z

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

X%KG;h7E.@Go0

G8BA'Wb1^0

实例:

#!/usr/bin/python
# -*- coding: UTF-8 -*-
51Testing软件测试网8{*H8l*cee
import xlwings as xw
from pathlib import Path
51Testing软件测试网O$d^7V"W
from redminelib import Redmine

lek6HM&B6~0
redmine = Redmine('http://IP/'username='XXX'password='XXX')
project = redmine.project.get('ProjectID')

-wvk9ajoRA-{@0
print('Project ID is:', project.id)
51Testing软件测试网3Ga0L,?d
print(project.identifier)
print(project.created_on)
print('project.description:', project.description)

$k;Ef6d\4v0
#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软件测试网 py kFV!L_Iq k
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)

"rf&y!X3w1R I0
rng=wb.sheets['00主UI'].range('A2:AD2')
#rng=sht.range('A1')
print('A2行:', rng)

Z+Vy*g``CMN2w'w g0
#a1v=sht.range('A2').value
a1v=rng.value
print('A2行的内容:', a1v)
for v in a1v:
    print(v)
51Testing软件测试网)uuu.e DgN)N
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}'}
    ]

2M.Gk(F(a]a0
    newcase.save()
    n=n+1

tmQ1lYy!X0
wb.close()
app.quit()

w3aV\~1]$I]0

TAG:

 

评分:0

我来说两句

Open Toolbar