Automatización de HP Quality Center con Python o Java

Tenemos un proyecto que utiliza el Centro de calidad de HP y uno de los problemas habituales que enfrentamos es que las personas no actualizan los comentarios sobre el defecto.

Así que estaba pensando si podríamos crear un pequeño script o herramienta que pudiera usarse para lanzar periódicamente un recordatorio y forzar al usuario a actualizar los comentarios.

Me encontré con la API de Open Test Architecture y me preguntaba si hay algún buen ejemplo de Python o Java para el mismo que pude ver.

Gracias hari

No estoy seguro de que existan buenos ejemplos para Java, ya que Java no puede consumir OTA directamente, necesita un puente de Java a COM como JIntegra .

Acerca de Python, bueno, puedes usar Python COM api’s. Y entonces cualquier ejemplo de OTA servirá. Tienes un montón de documentación de control de calidad de OTA.

Pero creo que la verdadera pregunta aquí es, ¿por qué querrías hacerlo en Python o Java? ¿Por qué no escribir lo que necesita directamente en QC utilizando su función de flujo de trabajo? Lo que le permitirá escribir su lógica en VBScript y hacer que se invoque dentro de la interfaz de usuario de QC en las acciones del usuario. Por ejemplo, puede vincularse al evento Post de un Defecto / Error y verificar si hay un comentario y si no hay un mensaje para que el usuario se lo comunique directamente.

Ejemplo de uso de Python (win32com) para conectarse a HP Quality Center a través de OTA

HP Quality Center expone una API basada en com llamada OTA.

La documentación sobre esto se puede descargar desde un servidor de control de calidad (OTA_API_Reference.chm) (Extrañamente, es muy difícil encontrarlo en línea)

La documentación utiliza VBScript (el idioma interno oficialmente admitido para QC) y necesitarás traducirlo mentalmente a Python. Esto suele ser muy simple, pero existen un par de errores.

Necesitará instalar en su máquina el código local de Quality Center, que se encuentra en su PC con Windows si ha podido acceder a QC a través de la interfaz web.

También deberá conocer la URL del servidor, su nombre de usuario y contraseña y el dominio del proyecto de QC en el que está trabajando.

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 

Esta no es una mala base para seguir adelante, sin embargo, creo una clase ficticia para defectos y ejecuto algo como:

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

Entonces puedo poner el código del trabajador en la clase de defectos y mantener las cosas más ordenadas Una cosa que quieres hacer es mantener el acceso al error de control de calidad sin formato interno de la clase de envoltura de python.

Información para otros que pueden ver este hilo.

Para iniciar todo esto, necesitará instalar pywin32, como desde aquí http://sourceforge.net/projects/pywin32/files/pywin32/Build216/

En primer lugar tendrá que importar pywin32

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

Luego, como segunda operación, incluyo aquí la acción de inicio de sesión en el servidor

 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; 

El segundo de todos los métodos que incluirá el archivo dll OTAapi

 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; 

Entonces el método principal para conectarse a 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; 

Y al final, cómo ejecutar todos esos métodos en un solo lugar con un ejemplo de uso.

 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 

En caso de que haya más preguntas, envíe un correo electrónico a: contact@qcintegration.com o directamente al lado web: http://www.qcintegration.com

Hay una API REST para HPQC (ALM11 y más reciente) si desea acceder a ella desde Linux sin ejecutar un componente COM de Windows.

Aquí hay un ejemplo que extrae un registro de “requisito” (# 1202) después de la autenticación.

 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) 

El análisis de r.text desde XML se deja como un ejercicio.

Aunque ha solicitado una solución basada en Python o Java, compartiendo el siguiente código VBA puede usar el editor de secuencias de comandos de HPQC / ALM (secuencia de comandos del módulo de defectos) para lograr el objective.

 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 

Puede usar un nuevo tipo de prueba y selección (VPXP_API) que permita ejecutar el script. Lo bueno es que tendría la definición de la función lista para ser arrastrada desde QC en lugar de tener que depender en gran medida de doc. He realizado una implementación en Python ejecutando algunos scripts desde QC que aún usan su API pero a través de una prueba de QC que es útil para recuperar directamente el resultado (Output), etc. mediante un comando de shell que puede llamar a cualquier script en cualquier servidor etc …