Автоматизация HP Quality Center с помощью Python или Java - PullRequest
7 голосов
/ 13 апреля 2010

У нас есть проект, в котором используется HP Quality Center, и одна из постоянных проблем, с которыми мы сталкиваемся, это то, что люди не обновляют комментарии по дефекту.

Поэтому я подумал, что если бы мы могли придумать небольшой скрипт или инструмент, который можно было бы использовать для периодического создания напоминания и принуждения пользователя к обновлению комментариев.

Я наткнулся на API Open Test Architecture и подумал, есть ли какие-нибудь хорошие примеры Python или java для того же, что я мог видеть.

Спасибо Хари

Ответы [ 6 ]

13 голосов
/ 23 мая 2011

Пример использования Python (win32com) для подключения к HP Quality Center через OTA

HP Quality Center предоставляет API на основе com, называемый OTA.

Документацию по этому вопросу можно загрузить с сервера контроля качества. (OTA_API_Reference.chm) (странно, что очень трудно найти в Интернете)

В документации используется VBScript (официально поддерживаемый внутренний язык для контроля качества). и вам нужно будет мысленно перевести на Python. Это обычно очень просто, но существует несколько ошибок.

Вам потребуется установить на свой компьютер локальный код Центра качества, который находится на вашем компьютере с Windows. если вы смогли добраться до КК через веб-интерфейс.

Вам также необходимо знать 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]

Тогда я могу поместить рабочий код в класс дефектов и поддерживать порядок. Одна вещь, которую вы хотите сделать, это сохранить доступ к сырой ошибке qc внутри класса оболочки Python.

6 голосов
/ 13 апреля 2013

Информация для тех, кто может просматривать эту тему.

Для запуска всего этого вам потребуется установить 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

В случае возникновения дополнительных вопросов mailto: contact@qcintegration.com или непосредственно на веб-сторону: http://www.qcintegration.com

5 голосов
/ 18 апреля 2010

Я не уверен, что есть какие-либо хорошие примеры для Java, потому что OTA не может напрямую использоваться Java, ему нужен мост Java-COM, такой как JIntegra .

О Python, вы можете использовать Python COM API. И тогда подойдет любой пример ОТА. Вы получили много в документации по контролю качества OTA.

Но я думаю, что реальный вопрос здесь в том, зачем вам это делать на Python или Java. Почему бы не написать то, что вам нужно, прямо в QC, используя функцию Workflow. Что позволит вам написать свою логику в VBScript и вызывать ее в пользовательском интерфейсе QC при действиях пользователя. Например, вы можете привязать к событию Post дефекта / ошибки и проверить, есть ли комментарий и нет ли запроса пользователя напрямую с сообщением.

2 голосов
/ 08 июня 2016

Существует REST API для HPQC (ALM11 и новее), если вы хотите получить к нему доступ из Linux без запуска компонента Windows COM.

Вот пример, который извлекает запись «требования» (# 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)

Синтаксический анализ r.text из XML оставлен в качестве упражнения.

1 голос
/ 23 ноября 2016

Несмотря на то, что вы запросили решение на основе Python или Java, вы можете поделиться приведенным ниже кодом VBA, который можно использовать в редакторе сценариев insde HPQC / ALM (сценарий модуля Defects) для достижения этой цели.

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
0 голосов
/ 30 ноября 2010

Вы можете использовать новый тест и выбрать тип (VPXP_API), который позволяет запускать скрипт. Хорошо, что у вас есть определение функции, готовое для перетаскивания из QC, вместо того, чтобы сильно полагаться на doc. Я реализовал в Python реализацию некоторого скрипта из QC, все еще используя его API, но с помощью теста QC, который удобен для непосредственного получения результата (вывода) и т. Д., Проходя через некоторую команду оболочки, которая может затем вызвать любой скрипт на любом сервер и т.д ...

...