背景是这样的:

这个组的测试人员每跑一个case都要上传测试结果附件到QC。每个待测功能模块可能包含几十上百的case。于是手工上传测试结果变成了繁重的体力劳动。令人惊讶的是我们的工具开发组竟然说做不了QC的测试结果附件上传。更让我惊讶的是,测试人员竟然真的手工上传结果上传了大半年了。

以下我写了个小工具解决这个问题:

思路很简单,调用hp提供的ALM Rest api接口。把一个个用户操作转化成http请求。然后按照接口要求,把附件一个一个上传到指定的QC test instance上。

主要用的库是:
requests:负责发送http请求
BeautifulSoup4:负责解析QC服务器返回的响应。
整个工具非常简单。

具体步骤如下:
先让用户登录进QC

[2017-05-17 13:57:25,023] Starting new HTTP connection (1): XXXXX.com
[2017-05-17 13:57:25,430] post http://XXXXX.com:80/qcbin/authentication-point/authenticate
[2017-05-17 13:57:25,430] headers = {'Authorization': 'Basic XXXXXXX'}
[2017-05-17 13:57:25,430] 200 OK
[2017-05-17 13:57:25,430] --------------------

(上面这个带了时间戳的东西是我的log。每个请求都会自己记下来发了些啥。)

然后按照用户给定的的test_set_id去QC里搜索一下这个test set下的test instance有哪些。

[2017-05-17 13:57:25,430] --------------------
[2017-05-17 13:57:26,303] get http://XXXXX.com:80/qcbin/rest/domains/{Domain name}/projects/{Project name}/test-instances?query={contains-test-set.id[XXXXXX]}&fields=id,test-id&page-size=2000
[2017-05-17 13:57:26,303] 200 OK
[2017-05-17 13:57:26,303] --------------------

然后每个test instance id去查一下qc里对应的test id,也就是测试用例的id,再根据这个id,从qc里查出测试用例的名字。
搜索的时候,这样指定返回值的字段名,以下是搜索某个test set id下的test-instance,并且要求返回值只包含test instance id和 test id
test-instances?query={contains-test-set.id[XXX]}&fields=id,test-id&page-size=2000

[2017-05-17 13:57:26,303] --------------------
[2017-05-17 13:57:26,516] get http://XXXXX.com:80/qcbin/rest/domains/XXX/projects/XXX/tests?query={id[XXXXXX]}&fields=name&page-size=2000
[2017-05-17 13:57:26,516] 200 OK
[2017-05-17 13:57:26,516] --------------------

根据上面查出来的test-id再次查询,得到这个test的name字段值

查出了测试用例的名字是用来和我要上传的附件做匹配的,这两个名字对上了,就会把某个附件传到这个用例对应的test-instance上。

上传文件部分调用的是这样的一个requests请求:

data = {
'filename': ("", attachment_name),
'override-existing-attachment':("","y")
} file = {
'file': open(attachmentpath+attachment_name, 'rb')
}
response = self.session.post(url, files=file,data=data)

最后附上一些代码,供参考:

这个类是用来做get请求和post请求的。auto_log装饰器会把发了什么请求打成log。
不像某些QC操作的库里一样满屏的打log

import logging as log
import requests class RestClient:
def __init__(self):
self.headers={}
self.session = requests.Session()
log.basicConfig(level=log.INFO, format='[%(asctime)s] %(message)s') def auto_log(func):
def wrapper(*args, **kw):
r = func(*args, **kw)
log.info("%s %s", func.func_name, args[1])
for key in kw:
log.info("%s = %s",key, kw[key])
log.info("%s %s",r.status_code,r.reason)
log.info("--------------------")
return r
return wrapper @auto_log
def get(self, url):
return self.session.get(url) @auto_log
def post(self, url, files=None, data=None,headers=None):
if headers is None:
headers = self.headers
return self.session.post(url, headers=headers,files=files,data=data)

第二个类是用来操作QC的,现在我做了用户登录、搜索entity、添加附件三个功能。后续还会加上更新entity和创建entity等,把参考文档里的common tasks全都实现在这个类里。

class QCSession:
def __init__(self, username, password, qc_url):
self.api_client=RestClient()
auth = base64.b64encode("{}:{}".format(username, password))
self.api_client.session.headers['Authorization'] = "Basic {}".format(auth)
self.qc_url = qc_url
self.login() def login(self):
r = self.api_client.post(self.qc_url.auth, headers=self.api_client.session.headers)
assert(r.status_code is 200) def get(self, *args):
r = self.api_client.get(self.qc_url.path(*args))
assert (r.status_code is 200 or r.status_code is 201)
return r def add_attachment(self, filename, over_ride,*args):
data = {
'filename': ("", filename),
'override-existing-attachment': ("", over_ride)
}
files = {
'file': open(filename, 'rb')
}
r = self.api_client.post(self.qc_url.path(*args),data=data,files=files)
assert (r.status_code is 200 or r.status_code is 201)
return r def query_entitys(self, entity_name, query_expression, fields=None, page_size=""):
"""
:param entity_name: the entity to query
:param query_expression: the query expression
:param fields: the files to return in results
:param page_size: the result page size, by default is 2000 which is the max value
:return: resturn the BeautifulSoup parsed result
"""
query_url=u"%s?query={%s}&fields=%s&page-size=%s" %(entity_name,query_expression,fields,page_size)
r = self.get(query_url)
res = BeautifulSoup(r.content, "lxml")
return res

还有一个保存和生成QC的各种url地址的类:

class QCURL:
def __init__(self, hostname, domain, project, port=''):
self.__base = u'http://{}:{}/qcbin/'.format(hostname,port)
self.__work = self.__base + u'rest/domains/{}/projects/{}/'.format(domain,project)
self.auth = self.__base + u'authentication-point/authenticate'
self.logout = self.__base + u'authentication-point/logout/' def path(self, *args):
return self.__work + '/'.join([str(arg) for arg in args])

还有第四个类就是用QC Session类来实现我要的业务功能了。具体代码就不贴了,里面没什么可以让别人重用的东西。

拿上面三个类就可以用了。
给个例子:
登录QC,并查询指定的testset_id下所有的test-instances,并返回其id和test-id
下面所有没赋值的变量都换成自己环境的真实值的字符串就行了。

qc_url = QCURL(hostname, domain, project, port)
qc_session = QCSession(username, password, qc_url)
qc_session.query_entitys('test-instances', 'contains-test-set.id[%s]' % testset_id, "id,test-id")

希望这篇文章可以帮到一些有同样问题的人。以上代码在HP ALM 11.52上测试通过。

参考文档:http://alm-help.saas.hpe.com/en/12.53/api_refs/REST_TECH_PREVIEW/ALM_REST_API_TP.html

python小工具:用python操作HP的Quality Center的更多相关文章

  1. python小工具:用python操作HP的Quality Center (二)----- 用异步方式提高速度

    上接第一篇 http://www.cnblogs.com/sdet/p/6874631.html 在python中,很简单地能把http请求通过异步的方式发送,以下代码在python 3.6.0上运行 ...

  2. Python小工具--删除svn文件

    有的时候我们需要删除项目下的svn相关文件,但是SVN会在所有的目录下都创建隐藏文件.svn,手工一个个目录查找然后删除显然比较麻烦.所以这里提供了一个Python小工具用于批量删除svn的相关文件: ...

  3. python小工具myqr生成动态二维码

    python小工具myqr生成动态二维码 (一)安装 (二)使用 (一)安装 命令: pip install myqr 安装完成后,就可以在命令行中输入 myqr 查看下使用帮助: myqr --he ...

  4. 有哪些你不知道的python小工具

    python作为越来越流行的一种编程语言,不仅仅是因为它语言简单,有许多现成的包可以直接调用. python中还有大量的小工具,让你的python工作更有效率. 1.- 快速共享 - HTTP服务器 ...

  5. 分享一个 Linux 环境下,强力的Python 小工具

    场景 Linux 用户,经常需要在终端查看一些数据,从文件里看 或者网络协议获取数据并查看. 比如,查看文件里的json数据:比如,查看etcd里存下的数据. 如果直接看cat 或者 curl 得到的 ...

  6. 一个Json结构对比的Python小工具兼谈编程求解问题

    先上代码. jsondiff.py #!/usr/bin/python #_*_encoding:utf-8_*_ import argparse import json import sys rel ...

  7. 自制 Python小工具 将markdown文件转换成Html文件

    今天看到了一个Python库,名为markdown.瞬间就给了我一个灵感,那就是制作一个将markdown文件转换成html文件的小工具. 我的实验环境 操作系统: Windows 7 64位 旗舰版 ...

  8. Python小工具:利用ffmpy3库3秒钟将视频转换为音频

    作者 | pk 哥 来源公众号 | Python知识圈(ID:PythonCircle) 最近,有读者微信上私聊我,想让我写一篇视频批量转换成音频的文章,我答应了,周末宅家里把这个小工具做出来了. 这 ...

  9. 周报?谁还写周报啊?不都用Python小工具: 发个周报邮件给老板就行还写周报啊?不都用Python小工具: 发个周报邮件给老板就行

    缘起: 新跳槽到一家公司, 没想到第一个挑战居然是每周都要发周报. 告诉老板这周都干了些什么和下周准备干什么. 我记性不好, 常常忘事儿.所以很多时候周报都会忘记发送. 于是, 就决定写一个小工具好了 ...

随机推荐

  1. 【canvas系列】canvas实现"雷达扫描"效果

    今天来讲解"雷达扫描"效果demo,来源于QQ群里边有群友说想要个雷达效果,就尝试写了一下. 效果图: demo链接: https://win7killer.github.io/c ...

  2. scss语法介绍

    这里既然是对语法的介绍,那么至于如何安装和编译scss我就不多少了,主要是因为本人在群里认识的小伙伴有的不会用scss,所以就借着放假的机会来对scss语法做个总结,博主在开发过程中用scss蛮多,所 ...

  3. Tcl与Design Compiler (十)——其他的时序约束选项(一)

    本文属于原创手打(有参考文献),如果有错,欢迎留言更正:此外,转载请标明出处 http://www.cnblogs.com/IClearner/  ,作者:IC_learner 之前讲了基本的时序路径 ...

  4. Weblogic虚拟目录

    p.MsoNormal,li.MsoNormal,div.MsoNormal { margin: 0cm; margin-bottom: .0001pt; text-align: justify; f ...

  5. 我是如何处理大并发量订单处理的 KafKa部署总结

    今天要介绍的是消息中间件KafKa,应该说是一个很牛的中间件吧,背靠Apache 与很多有名的中间件搭配起来用效果更好哦 ,为什么不用RabbitMQ,因为公司需要它. 网上已经有很多怎么用和用到哪的 ...

  6. 关于WAMPserver配置httpd.conf无法修改根目录解决方法

    最近在学习php开发, 在慕课网上先听了安装配置WAMP server的课,可是第二步配置网站根目录的地方就出错了,按照网课上讲的将httpd.conf文件中的 [Document] 和[Direct ...

  7. js对象个人理解及记录

    什么是对象 对象的定义是:无序属性的集合,其属性可以包括基本值.对象或函数. var car = {};   //比如我们拿一块铁造了一辆车,这的名字叫car /建一个空对象 car.length = ...

  8. 关于C++ 循环

    有的时分,可能需求屡次履行同一块代码.通常情况下,句子是顺序履行的:函数中的第一个句子先履行,接着是第二个句子,依此类推. 编程言语供给了答应更为杂乱的履行途径的多种操控结构. 循环句子答应咱们屡次履 ...

  9. Ubuntu12.04嵌入式交叉编译环境arm-linu-gcc搭建过程,图解

    转载:王文松的博客Ubuntu12.04嵌入式交叉编译环境arm-linu-gcc搭建过程,图解 安装环境       Linux版本:Ubuntu 12.04    内核版本:Linux 3.5.0 ...

  10. ef code first

    , 网上有很多的ef  code first 的使用的方式,很乱,下面是我自己整理出来的,有什么不正确的地方还请指正,本人菜鸟一枚! 1.新建一个类库 =>引用 右击 管理NuGet程序包 添加 ...