Python导入Bug/Cases到Redmine

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

51Testing软件测试网2Tr6wo.E-c:Qt

前言

51Testing软件测试网 g+V"Hi1h9MF\K+ZX

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

-H5y;ox7_ b0

z THzw;j3p0缺陷管理记录了缺陷相关的资料,为缺陷分析提供了详细的信息,是缺陷分析的数据来源。下文将学习如何访问redmine获取数据。51Testing软件测试网}4^YT6`Q5[A

REST API

51Testing软件测试网M I+C-wsM#G

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

{F ~m;a:Uf0
#To start making requests to Redmine you have to check the box Enable REST API in Administration -> 
# Settings -> Authentication and click the Save button.

CK3W6YC&C0Yf1]Mv0下面讲述一下常用方法。

G%fqc)l_? ~0

Python-Redmine

51Testing软件测试网V o RR&[

REST API提供用于Python的语言的库,即Python-Redmine,提供简单有力的接口。

Q'Mh7bc.s b0

环境搭建

$ pip install python-redmine

简单配置

  • Redmine类51Testing软件测试网&Y@1n5@X-O
    从redminelib库导入 Redmine类,用于下面流程中生成redmine对象。
fromredminelibimportRedmine
  • 访问地址
    7~F lS7M'EE L$X"C0实例化Redmine对象时,需要赋值访问的地址参数,以F项目为例:
redmine=Redmine('http://10.20.11.218:8222/redmine')

lJ)@%suV1I0
redmine = Redmine('http://10.20.11.218:8222/redmine', version='3.3.1')
  • 4jZ)JPM$]Cs |)v0授权登录
    8tb r g ~:`$WY0大多数情况,API都需要授权登录,常用有两种不同的登录方式:

    ,_L%CK f`0
    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')

WCY/t3[p!G"g1^\0其中key可以从redmine个人账户页面获取.

7l4?B{{$v}0

基本概念介绍

1.资源

.sw&H#_ReS0在Redmine管理中,资源(Resource)在其中是个重要的概念,因为我们的Bug管理的记录都是靠这些资源作为一个个集合体依据一定的关系所构建出来,如同关系型数据库一般。 举个例子,当我们访问到某个Project的时候,我们能够获得这个Project的信息,包括名称、id、描述等,不仅如此,我们通过对象中的元素变量issues能够获得这个Project下面的所有bug issue。而反过来,我们知道一个bug issue后,也能通过其issue id来反搜出它所在的project id。51Testing软件测试网r/maP1Z
而在Redmine中,已经存在了一些定义好的资源类型,方便我们直接使用,当然我们也可以自己根据需要去新建资源类型。51Testing软件测试网G%[|Y M1LAz$CB0s
如下是我们常见并且需要掌握才能够熟悉Redmine的资源类型:
4U aZI'g2wO$k0Issue, Project, User, Version, Issue Status

u&F1Ioac0

2. 资源管理器

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

L5TS"U\?0
>>> 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软件测试网[,_vt[:\!M

以上几个是我们比较常见的资源管理器,通过资源管理器我们才能够进行下面的一些基本操作。51Testing软件测试网9^\'B5jS'm^

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

/[s`K^)O&[~-s 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..基本操作

51Testing软件测试网?U/S,g3["y/BXg'\

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

!_8s2L:A1c0

:aP C3a hz0以下给出简单的增删查改样例:51Testing软件测试网gS*^ _/Z1w:|D7uyw!v
create():51Testing软件测试网c)sx2v nw A

>>>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软件测试网6]Ab [7D[Ht

new():

3v/xPtJ\!Y0
>>>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

Cl]Z.M!kC-B0get()51Testing软件测试网^1pT!z1T)r,a

>>>project=redmine.project.get('vacation')>>>project<redminelib.resources.Project#123 "Vacation">

Y k$]4V1j,K~Q i2A/w0all():51Testing软件测试网V cfey!Z _2j

>>>projects=redmine.project.all()>>>projects<redminelib.resultsets.ResourceSetobject withProjectresources>
51Testing软件测试网(Nq\e3?d3D [

update():

"_e;z!U.k |1u!{#dv:D0
>>>redmine.project.update(123,name='Work',description='Work tasks')True

]2ZiZeUJ0delete():51Testing软件测试网D,\+rgl~)W5S

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

2sX C6eBu"J*Y:^A0除此之外,还有个比较重要的操作就是filter(),如果我们要用于后续的分析和统计,filter函数能够帮助我们筛选出符合我们需求的version或者issue来进行操作。51Testing软件测试网!V9WuIc

>>>issues=redmine.issue.filter(project_id='vacation')>>>issues<redminelib.resultsets.ResourceSetobject withIssueresources>

E/d-M?;` V~_0如上面例子,我们能够通过project_id来筛选出全部是vacation的issue。51Testing软件测试网.GT9hblE3B

总结

51Testing软件测试网q6Fu8_,l

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

51Testing软件测试网j q ^.i*_!J r

实例:

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

GC+Xb5y4`-t0
import xlwings as xw
from pathlib import Path
51Testing软件测试网T'slHvD;_
from redminelib import Redmine

?uu{4} P0
redmine = Redmine('http://IP/'username='XXX'password='XXX')
project = redmine.project.get('ProjectID')

J^ ~gc'T X9xDi0
print('Project ID is:', project.id)
51Testing软件测试网!rS6GF I m
print(project.identifier)
print(project.created_on)
print('project.description:', project.description)

n5],Nz| fkK6Qd0
#To start making requests to Redmine you have to check the box Enable REST API in Administration -> 
# Settings -> Authentication and click the Save button.

L ^4fj,@@6E0
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)
51Testing软件测试网 }0R%{rND'i?)E
rng=wb.sheets['00主UI'].range('A2:AD2')
#rng=sht.range('A1')
print('A2行:', rng)

@6xu1F4BV@N;R0
#a1v=sht.range('A2').value
a1v=rng.value
print('A2行的内容:', a1v)
for v in a1v:
    print(v)
51Testing软件测试网o(\(_ H Ru
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软件测试网1J+vg%B.og
    newcase.save()
    n=n+1

pN~J:hmF;rF0
wb.close()
app.quit()
51Testing软件测试网i8L O?A7nc.t

TAG:

 

评分:0

我来说两句

Open Toolbar