通过ALM OTA API获取test case的信息,并上传测试结果到test set中
ALM提供了OTA接口,可以用来获取和上传测试数据到ALM。比如获取Test case的step信息。上传测试结果到test instance。
在ALM的Help中可以下载相关文档,这里以ALM11为例。可以下载alm_project_db.chm和OTA_API_Reference.chm。一个是数据库字段的介绍,一个是OTA API的介绍。通过参照这两个帮助文档就可以开发与ALM交互的脚本了。
一. 首先是怎么查看文档:
打开alm_project_db.chm,展开Project Data Tables,可以找到所有数据库字段的介绍。
打开OTA_API_Reference.chm,展开Objects,可以看到所有可以调用的Object
ALM15的OTA API说明文档:
https://admhelp.microfocus.com/alm/api_refs/ota/Default.htm
二. 配置准备环境
要通过OTA接口与ALM交互,就需要安装TDConnect.exe,这个可以从ALM的Help -> ALM Tools页面下载ALM Connectivity安装文件TDConnect.exe,并安装。
其次不同的脚本语言还需要对应的方法库来与OTA接口交互,例如python需要安装pywin32的库。这个需要x86的python版本以及x86的pywin32版本。
三. 建立与ALM的连接
import win32com.client url="http://alm.com/qcbin" username="xxx.xxx" password="Pass123word" domain="DemoDomain" project="DemoProject" testData={} # Store the data td = win32com.client.Dispatch("TDApiOle80.TDConnection") td.InitConnection(url) td.Login(username, password) td.Connect(domain, project) # td.ConnectProjectEx(usrname, password, domain, project) # same results with td.Login + td.Connect
通过pywin32的方法win32com.client.Dispatch建立与OTA通信的通道。初始化与服务器的连接,用有效的认证登录Project。
这里对于各个方法或属性的使用,可以参照OTA API文档中对TDConnection Object的介绍。
四. 从Test Plan中的test case中读取每个步骤的信息
要先找到case所在路径,获取实例,再找到test的实例,再得到step的实例,再得到具体的step数据信息。
# 首先需要与ALM建立连接,代码见上 pathToTestcase = "Subject\\path\\to\\test\\case" # The path to test case in Test Plan mg=td.TreeManager # The Test subject tree manager npath=pathToTestcase print npath tsFolder = mg.NodeByPath(npath) # Gets the node at the specified tree path. testFactory = tsFolder.TestFactory # Get a TestFactory object testFilter = testFactory.Filter # The TDFilter object for the factory testFilter["TS_NAME"] = TestCaseName # Get a test by name in a folder testList = testFactory.NewList(testFilter.Text) # Creates a list of objects according to the specified filter. test = testList.Item(1) # There should be only 1 item, The list index is 1-based. print test.Name # The test name stepFactory = test.DesignStepFactory # The design steps factory for the current test. stepList = stepFactory.NewList("") # Creates a list of objects according to the specified filter, an empty string is passed, the returned list contains all the child items of the current factory object. print("Total Steps : "+str(len(stepList))) # Get the count of the test steps. print stepList.Item(1).Field("DS_USER_02") # Get the custom filed value of step 1, DS_USER_02 is data filed in ALM database. print stepList.Item(1).Field("DS_USER_03") print stepList.Item(1).Field("DS_USER_04") print stepList.Item(1).Field("DS_USER_01") for step in stepList: stepN = step.StepName.strip() # Get the step name testDatas= step.Field("DS_USER_03").split(",") if(len(testDatas)>1): for data in testDatas: d=data.split(":") if(len(d)>1): testData.setdefault(stepN,{})[d[0]]=d[1] elif(len(testDatas)==1): d1=testDatas[0].split(":") if(len(d1)>1): testData.setdefault(stepN,{})[d1[0]]=d1[1] else: testData[stepN]=testDatas[0] print testData s=td.logout # Terminates the user's session on this TDConnection print(str(s))
五. 上传测试结果到Test Lab中
将测试结果上传到test lab,修改每一步的实际值,状态和上传附件。
# 首先需要与ALM建立连接,代码见上 nodePath="Root\PI_Rampup" # The path to test set in Test Lab testSetName="sprint1" # Test Set Name TestCaseNameInTestLab='TestCaseName' # Test case (Test instance) name in Test Set ResultSet={1: u'Attached to Application||Passed', 2: u'The items in home page should have same font, contents, location, size and colors||Passed||C:\\Home.png', 3: u'The dropdown message should show at same location with same font, contents, size and color||Passed', 4: u'The dropdown message should show at same location with same font, contents, size and color||Passed', 5: u'The dropdown message should show at same location with same font, contents, size and color||Passed'} # Test results for each step finalTestCaseStatus='' tsFolder = td.TestSetTreeManager.NodeByPath(nodePath) # Manages the test set tree and its related test set folders, Gets the test set tree node from the specified tree path. tsList = tsFolder.FindTestSets(testSetName) # Gets the list of test sets contained in the folder that match the specified pattern ts_object = tsList.Item(1) # There should be only one item, The list index is 1-based. print "Path: "+nodePath print ts_object.Name TSTestFact = ts_object.TSTestFactory # Manages test instances (TSTest objects) in a test set TestSetTestsList = TSTestFact.NewList("") # Creates a list of objects according to the specified filter. an empty string is passed, the returned list contains all the child items of the current factory object print len(TestSetTestsList) # The count of test instances in test set counter=0 for testSet in TestSetTestsList: # Go through each test instances counter=counter+1 if(testSet.Name == "[1]"+TestCaseNameInTestLab): # Find the expected test instance ts_instance = testSet newItem = ts_instance.LastRun # The Run object of the last run. #print("LastRun Name: "+newItem.Name) try: newItem.Name # The run name. time=datetime.datetime.now().strftime("%B %d, %Y") newItem.Name = TestCaseName+' '+time # Define new name of last run newItem.Post() except: newItem = ts_instance.RunFactory.AddItem(None) # The Run Factory for this test instance. Creates a new item object. Creating a virtual Run object with Null ensures that you cannot then Post until the run name and all other required fields are initialized time=datetime.datetime.now().strftime("%B %d, %Y") newItem.Name = TestCaseNameInTestLab+' '+time # Define the run name print(newItem.Name) newItem.Post() # Posts all changed values into database. newItem.CopyDesignSteps() # Copies design steps into the test run of an executed test newItem.Post() # Posts all changed values into database. steps = newItem.StepFactory.NewList("") # Services for managing test steps for a Run object. Creates a list of objects according to the specified filter. stepCount = len(steps) # The count of steps. KeyCounter=0 FailCounter=0 keys=ResultSet.keys() for key in keys: KeyCounter=KeyCounter+1 print "Step Name:"+steps[key-1].Name res=ResultSet[key].split('||') print "Statement: "+res[0] print "Status: "+res[1] if(len(res)==3): # if there is attachment need to be uploaded. the len would be 3. # tsFolder for test set folder attachment, ts_object for test set attachment, ts_instance for test instanse attachment. # steps[key-1] for test step attachment attachmentFactory = steps[key-1].Attachments # the list of step object is 0-based. attachment=attachmentFactory.AddItem(None) # Passing NULL as the ItemData argument creates a virtual object, one that does not appear in the project database. After creating the item, use the relevant object properties to fill the object, then use the Post method to save the object in the database steps[key-1].Status=res[1] # The run step status. Passed or Failed steps[key-1].SetField("ST_ACTUAL", res[0]) # Update the value of Actual attachment.Filename = res[2] # If a file, the file location. If a virtual file, the location for the attachment before it is uploaded to the server. If a URL, the link address. attachment.Description = "" # The attachment description attachment.Type=1 # The attachment type. Either File or URL. 1 is for File, 2 is for URL. attachment.Post() steps[key-1].post() elif(len(res)==2): steps[key-1].Status=res[1] steps[key-1].SetField("ST_ACTUAL", res[0]) steps[key-1].post() if(res[1]=='Failed'): FailCounter=FailCounter+1 print("For Step"+steps[key-1].Name+" Test Step Status is: "+res[1]) finalTestCaseStatus=res[1] elif(len(steps)==KeyCounter and FailCounter==0 ): finalTestCaseStatus="Passed" newItem.Status = finalTestCaseStatus # The run status newItem.Post() print("ALM Update for Test Case: "+TestCaseNameInTestLab+" has been successfully updated in TestSet "+testSetName) break elif(len(TestSetTestsList)==counter): print("Test Case: "+TestCaseNameInTestLab+" Not Found in Test Set "+testSetName) e=sys.exc_info() s=td.logout print(str(s))