7

我们有一个使用 HP Quality Center 的项目,我们面临的一个常见问题是人们没有更新对缺陷的评论。

所以我在想我们是否可以想出一个小脚本或工具,用于定期发出提醒并强制用户更新评论。

我遇到了 Open Test Architecture API,想知道是否有任何我能看到的好的 Python 或 java 示例。

谢谢哈里

4

6 回答 6

13

使用 Python (win32com) 通过 OTA 连接到 HP Quality Center 的示例

HP Quality Center 公开了一个名为 OTA 的基于 com 的 API。

这方面的文档可从 QC 服务器 (OTA_API_Reference.chm) 下载(奇怪的是很难在网上找到)

该文档使用 VBScript(官方支持的 QC 内部语言),您需要在心理上翻译成 Python。这通常非常简单,但存在一些问题。

您将需要在您的计算机上安装 Quality Center 本地代码,如果您能够通过 Web 界面访问 QC,则此代码位于您的 Windows PC 上。

您还需要知道服务器的 URL、用户名和密码以及您正在处理的 QC 项目的域。

from win32com.client import Dispatch

conn = get_QCConnection()

for bug in get_bugs(qcConn):
    print bug.Title

put_QCConnection(conn)

#below code needs to be in seperate module or at least above the fold but here 
# for clarity

def get_QCConnection():
    '''Get the hardcoded connection to the server and domain.
    Can be made a "real" engine if you try hard.
    Use makepy utility to determine if the version number has changed (TDApiOle80)
    but this works to current version'''

    QCConnection = Dispatch("TDApiOle80.TDConnection")
    url = "http://qc.example.com/qcbin"
    QCConnection.InitConnectionEx(url)
    QCConnection.login("USER", "PASS")
    QCConnection.Connect("google_projects", "Google_Chrome")    
    return QCConnection

def put_QCConnection(qcConn):
    #If one person logged in to QC changes *anything* on a bug,
    # they hold a global lock on writing to that bug till 
    # thier session times out, so really really remember to logout
    # its painful to wait for your own session to time out

    qcConn.Logout()

def get_bugs(qcConn):
    '''just following boiler plate from vbscript
    PS the SetFilter is not in QTA API, it uses Filter.  
    But due to the workarounds in 
    the very brilliant pythoncom code it supplies a virtual wrapper class
    called SetFilter - this is one of those gotchas '''

    BugFactory = qcConn.BugFactory
    BugFilter = BugFactory.Filter

    BugFilter.SetFilter(u"Status", "New") 
    #NB - a lot of fields in QC are malleable - and vary from site to site. 
    #COntact your admins for a real list of fields you can adjust
    buglist = BugFilter.NewList()
    return buglist       

这不是一个糟糕的前进基础,但是我为缺陷创建了一个虚拟类并运行如下内容:

dfcts = [defect(b) for b in buglist]

然后我可以将工作代码放入缺陷类并保持整洁。您想要做的一件事是保持对 python 包装类内部的原始 qc 错误的访问。

于 2011-05-23T14:57:18.803 回答
6

其他可能查看此线程的信息。

要开始这一切你需要安装 pywin32,就像从这里http://sourceforge.net/projects/pywin32/files/pywin32/Build216/

首先你需要导入 pywin32

'''@author: www.qcintegration.com  @mailto:contact@qcintegration.com'''
import pywintypes
import win32com.client as w32c
from win32com.client import gencache, DispatchWithEvents, constants

然后作为第二个操作,我在这里包括登录到服务器的操作

def connect_server(qc, server):
        '''Connect to QC server
        input = str(http adress)
        output = bool(connected) TRUE/FALSE  '''
        try:
            qc.InitConnectionEx(server); 
        except:
            text = "Unable connect to Quality Center database: '%s'"%(server); 
        return qc.Connected;

def connect_login(qc, username, password):
    '''Login to QC server
    input = str(UserName), str(Password)
    output = bool(Logged) TRUE/FALSE  '''
    try:
        qc.Login(username, password);
    except pywintypes.com_error, err:
        text = unicode(err[2][2]);
    return qc.LoggedIn;

def connect_project(qc, domainname, projectname):
    '''Connect to Project in QC server
    input = str(DomainName), str(ProjectName)
    output = bool(ProjectConnected) TRUE/FALSE  '''

    try:
        qc.Connect(domainname, projectname)
    except pywintypes.com_error, err:
        text = "Repository of project '%s' in domain '%s' doesn't exist or is not accessible. Please contact your Site Administrator"%(projectname, domainname); 
    return qc.ProjectConnected;

第二个方法将包括 OTAapi dll 文件

def qc_instance():
        '''Create QualityServer instance under variable qc
        input = None
        output = bool(True/False)'''
        qc= None;
        try:
            qc = w32c.Dispatch("TDApiole80.TDConnection");
            text = "DLL QualityCenter file correctly Dispatched"
            return True, qc;
        except:
            return False, qc;

然后是连接QCserver的主要方法

def qcConnect(server, username, password, domainname, projectname):
    print("Getting QC running files");

    status, qc = qc_instance();
    if status:
        print("Connecting to QC server");
        if connect_server(qc, server):
            ##connected to server
            print("Checking username and password");
            if connect_login(qc, username, password):
                print("Connecting to QC domain and project");
                if connect_project(qc, domainname, projectname):
                    text = "Connected"
                    connected = True;
                    return connected, text;
                else:
                    text = "Not connected to Project in QC server.\nPlease, correct DomainName and/or ProjectName";
                    connected = False;
                    return connected, text;
            else:
                text = "Not logged to QC server.\nPlease, correct UserName and/or Password";
                connected = False;
                return connected, text;
        else:
            text = "Not connected to QC server.\nPlease, correct server http address"; 
            connected = False;
            return connected, text;
    else:
        connected = False;
        text = "Unable to find QualityCenter installation files.\nPlease connect first to QualityCenter by web page to install needed files" 
        return connected, text;

最后如何通过使用示例在一个地方执行所有这些方法

if __name__ == "__main__":
    server= r"http://qualitycenterServer:8080/qcbin"
    username= "alex_qc"
    password= ""
    domainname= "DEFAULT"
    projectname= "QualityCenter_Demo" 

    connection_status, text  = qcConnect(server, username, password, domainname, projectname);
    print "connection_status:", connection_status

如有更多问题请发邮件至:contact@qcintegration.com 或直接发送至网页:http ://www.qcintegration.com

于 2013-04-13T15:26:53.457 回答
5

我不确定 Java 有什么好的示例,因为 Java 不能直接使用 OTA,它需要一个 Java 到 COM 桥接,如JIntegra

关于 Python,你可以使用Python COM api。然后任何 OTA 示例都可以。您在 OTA 的 QC 文档中获得了很多信息。

但我认为这里真正的问题是,你为什么要用 Python 或 Java 来做。为什么不使用它的工作流功能直接在 QC 中编写您需要的内容。这将允许您在 VBScript 中编写逻辑,并在用户操作的 QC UI 中调用它。例如,您可以绑定到缺陷/错误的 Post 事件,并检查是否有评论以及是否没有直接向用户提示消息。

于 2010-04-18T10:27:50.930 回答
2

如果您想在不运行 Windows COM 组件的情况下从 Linux 访问 HPQC(ALM11 和更新版本),则有一个REST API 。

这是一个在身份验证后拉入“需求”记录(# 1202)的示例。

import requests
session = requests.session()
user='hpqc'
password='xxxxx'
r = session.get("http://hpqc-server:8080/qcbin/authentication-point/authenticate",auth=(user,password))

r = session.get("http://hpqc-server:8080/qcbin/rest/domains/Foo/projects/Bar/requirements/1202")
print(r.text)

从 XML的解析留作r.text练习。

于 2016-06-07T21:45:48.583 回答
1

尽管您已经要求提供基于 Python 或 Java 的解决方案,但您可以共享以下 VBA 代码,您可以使用 insde HPQC/ALM 的脚本编辑器(缺陷模块脚本)来实现目标。

Function Bug_FieldCanChange(FieldName, NewValue)

 On Error Resume Next

 if not changed then
 strCommentBeforeUpdate = Bug_Fields("BG_DEV_COMMENTS").Value
 end if

 If FieldName = "BG_DEV_COMMENTS" and blnAddCommentClicked = False Then
    Msgbox "Cannot update the comments." & Chr(13)& "Changes made will not be saved."&Chr(13)& "Please use 'Add comment' button to insert new comment." &Chr(13)& " Or click Cancel without saving."
    blnUpdateCommentError = true
    blnAddCommentClicked = False
    changed = true
  End If
Bug_FieldCanChange = DefaultRes 

End Function
于 2016-11-23T15:44:39.313 回答
0

您可以使用允许脚本运行的新测试和选择类型 (VPXP_API)。好消息是您已经准备好从 QC 中拖动函数定义,而不必严重依赖 doc。我已经在 Python 中完成了一个实现,在 QC 中运行一些脚本,仍然使用它的 API,但是通过 QC 测试可以方便地直接检索结果(输出)等。通过一些 shell 命令,然后可以调用任何脚本服务器等...

于 2010-11-29T23:45:07.993 回答