Python导入Bug/Cases到Redmine

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

51Testing软件测试网fi~2]aRs"y

前言

51Testing软件测试网\;}6P\6C+hB"r$F

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

51Testing软件测试网4B!KC1Ye;m7N$Y7H f

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

REST API

51Testing软件测试网-q O.ewd

Redmine的部分数据可以通过REST API访问。该API提供对资源(resources)访问和基础的增更删操作,且同时支持XML和JSON格式。51Testing软件测试网 yW:dM:s

#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软件测试网U2S V:b&M

下面讲述一下常用方法。51Testing软件测试网"T6pK$o5W

Python-Redmine

8s(p8K~]/c5CO15364374REST API提供用于Python的语言的库,即Python-Redmine,提供简单有力的接口。

q{ l7hRZ15364374

环境搭建

$ pip install python-redmine

简单配置

  • Redmine类
    `0TN)@_hqw8S15364374从redminelib库导入 Redmine类,用于下面流程中生成redmine对象。
fromredminelibimportRedmine
  • 访问地址
    g(J$II&^1A&p15364374实例化Redmine对象时,需要赋值访问的地址参数,以F项目为例:
redmine=Redmine('http://10.20.11.218:8222/redmine')
51Testing软件测试网\mP[_)~f'^'^
redmine = Redmine('http://10.20.11.218:8222/redmine', version='3.3.1')
  • 51Testing软件测试网9h,O"q!q%yMC

    授权登录51Testing软件测试网Ok#D` [.~#A$vd#k
    大多数情况,API都需要授权登录,常用有两种不同的登录方式:51Testing软件测试网'F J#ac D,m&z

    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软件测试网3q!~1i$h*qud7\0I$A|

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

QD2i#?Uz2[15364374

基本概念介绍

1.资源

51Testing软件测试网7^#c6_b5H

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

6e&]!T P aw15364374

2. 资源管理器

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

v9}_7|sBg\15364374
>>> 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软件测试网 ~ ]([r Su

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

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

4_ f3o(kbvr15364374
//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软件测试网#}m&G~0y:b

一般来讲,资源管理器会有CRUD 操作,也就是我们常说的“增删查改“。但并不是每个资源管理器都会有这样的操作,所以如果使用了不支持的方法,管理器也会报出相应的异常。51Testing软件测试网:b*Nv i]_9I S g)J

51Testing软件测试网\;GrB S

以下给出简单的增删查改样例:
7r/|Q/eAiG15364374create():

|!jl7b*pk15364374
>>>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软件测试网b6o8k SeW,@7X

new():

.I Tb/\Oc15364374
>>>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软件测试网z"@k#G(F`&Bk3B@V

get()51Testing软件测试网$F,?s8V:s5Th:Yc~

>>>project=redmine.project.get('vacation')>>>project<redminelib.resources.Project#123 "Vacation">
51Testing软件测试网{/e%nY,YG

all():51Testing软件测试网6z B B A2V _*u

>>>projects=redmine.project.all()>>>projects<redminelib.resultsets.ResourceSetobject withProjectresources>
51Testing软件测试网 m3R? H N1nC

update():

$J+p L'b9C6J4GL15364374
>>>redmine.project.update(123,name='Work',description='Work tasks')True

N#S$O Jhh&I15364374delete():

y,PN[_15364374
>>> redmine.project.delete(1)True

(\,CX:U2e$j O-Vc UE15364374除此之外,还有个比较重要的操作就是filter(),如果我们要用于后续的分析和统计,filter函数能够帮助我们筛选出符合我们需求的version或者issue来进行操作。51Testing软件测试网_|,V9?'k6~JFD6u q

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

w;c?9@7R G1N)C15364374如上面例子,我们能够通过project_id来筛选出全部是vacation的issue。51Testing软件测试网.[mWeC0O Z p$`a

总结

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

-A{/{Hn6j15364374
51Testing软件测试网G)biVB#C

实例:

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

j*`M#?/~g15364374
import xlwings as xw
from pathlib import Path
51Testing软件测试网J u@+A}4XS g
from redminelib import Redmine
51Testing软件测试网"wL?3F6RX]n
redmine = Redmine('http://IP/'username='XXX'password='XXX')
project = redmine.project.get('ProjectID')

Vm-ay%eX.k*e{15364374
print('Project ID is:', project.id)

yp#JS f8^ iW15364374
print(project.identifier)
print(project.created_on)
print('project.description:', project.description)
51Testing软件测试网;x1Ap$Ak+Am
#To start making requests to Redmine you have to check the box Enable REST API in Administration -> 
# Settings -> Authentication and click the Save button.

q K6[![Y2a(FO15364374
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)

NB%lzm*U0QS15364374
rng=wb.sheets['00主UI'].range('A2:AD2')
#rng=sht.range('A1')
print('A2行:', rng)
51Testing软件测试网5F2g6El-f ?c#{ n }
#a1v=sht.range('A2').value
a1v=rng.value
print('A2行的内容:', a1v)
for v in a1v:
    print(v)

4R;~5[,Td1H gx15364374
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软件测试网VS$Z'X'|0^w
    newcase.save()
    n=n+1
51Testing软件测试网 GiC Cy
wb.close()
app.quit()

@9@v%k%E X15364374

TAG:

 

评分:0

我来说两句

Open Toolbar