Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Automating HP Quality Center with Python or Java

We have a project that uses HP Quality Center and one of the regular issues we face is people not updating comments on the defect.

So I was thinkingif we could come up with a small script or tool that could be used to periodically throw up a reminder and force the user to update the comments.

I came across the Open Test Architecture API and was wondering if there are any good Python or java examples for the same that I could see.

Thanks Hari

like image 549
Hari Avatar asked Apr 13 '10 06:04

Hari


People also ask

How do you automate on HP QC?

Login to QC/ALM and find the help library. There you should be able to see the Site Administration API guide that contains function references and samples for automating the common admin tasks. The API is packaged as a COM library, so you have a wide choice of languages that you can use to access it.

Can we automate HP ALM?

ALM supports maintenance and execution of manual, automation and performance tests as ALM is seamlessly integrated with all HP products such as HP UFT and HP Load Runner.

What is the difference between HP ALM and Quality Center?

HP ALM software is designed to manage the various phases of the Software Development Life Cycle (SDLC) right from requirements gathering to testing. Earlier, it was known as HP Quality Center (QC). HP QC acts as a Test Management tool while HP ALM acts as a Project Management Tool.

What HP testing tools does quality Centre integrate with?

9) What HP testing tools does quality center integrate with? Quality Center integrates with Winrunner, QTP, LoadRunner and Visual API-XP.


5 Answers

Example of using Python (win32com) to connect to HP Quality Center via OTA

HP Quality Center exposes a com based API called OTA.

Documentation on this is downloadable from an QC server (OTA_API_Reference.chm) (Weirdly it is very hard to find online)

The documentation uses VBScript (The officially supported internal language for QC) and you will need to mentally translate to Python. THis is usually very simple, but a couple of gotchas exist.

You will need to install on your machine the Quality Center local code, this is on your windows PC if you have been able to get to QC through the web interface.

You will also need to know the URL of the server and you username and password and the domain of the QC project you are working on.

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       

This is not a bad basis for going forward, however I create a dummy class for defects and run something like:

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

Then I can put worker code into defect class and keep things neater. One thing you want to do is keep access to the raw qc bug internal to the python wrapper class.

like image 187
lifeisstillgood Avatar answered Oct 01 '22 14:10

lifeisstillgood


Information for others who may view this thread.

To start all this You will need install pywin32, like from here http://sourceforge.net/projects/pywin32/files/pywin32/Build216/

First of all You will need to import pywin32

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

Then as second operation I include here action on login to server

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;

Second of all method which will include OTAapi dll file

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;

Then main method to connect to 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;

And at the end how to execute all of those methods in one place with example of use

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

In case of any more question mailto: [email protected] or directly to web side: http://www.qcintegration.com

like image 33
user2277544 Avatar answered Oct 01 '22 14:10

user2277544


I'm not sure there are any good samples for Java, because OTA can't be consumed by Java directly, it needs a Java to COM bridnge like JIntegra.

About Python, well you can use Python COM api's. And then any OTA example will do. You got plenty in QC documentation of OTA.

But I think the real question here is, why would you want to do it in Python or Java. Why not write what you need directly in QC using it's Workflow feature. Which will allow you to write your logic in VBScript, and have it invoked inside QC UI on user actions. For instance you can bind to the Post event of a Defect / Bug and check if there is a comment and if there is not prompt the user directly with a message.

like image 25
Alex Shnayder Avatar answered Oct 01 '22 15:10

Alex Shnayder


There is a REST API to HPQC (ALM11 and newer) if you want to access it from Linux without running a Windows COM component.

Here is an example that pulls in a "requirement" record (# 1202) after authenticating.

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)

The parsing of r.text from XML is left as an exercise.

like image 33
Mark Lakata Avatar answered Oct 01 '22 13:10

Mark Lakata


Though you have asked for a Python or Java based solution, sharing the following VBA code that you can use insde HPQC/ALM's script editor (Defects module script) to accomplish the goal.

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
like image 40
Sohel Avatar answered Oct 01 '22 14:10

Sohel