如何使用Python API(pyral)更新Rally中的测试用例步骤

时间:2015-05-07 03:24:33

标签: python rally pyral

感谢Rally API在线提供优质文档,我知道如何create test stepsupdate a defect/test case

关于使用......的问题,已经提出并回答了类似的问题。

但是,我没有使用python API(pyral)更新测试步骤。

我尝试过以下代码:

TCid = "TC1392"
testcase=rally.get('TestCase', query='FormattedID = %s' % TCid, instance=True)
print "Updating steps for Test Case %s" % testcase.FormattedID
#Test Steps
try:
    for i in range(3):
        input="Step Input for Step: "+str(i)
        expected_result="Expected Result for Step: "+str(i)

        testcasestep_fields = {
            "TestCase"          : testcase.ref,
            "StepIndex"         : i,
            "Input"             : input,
            "ExpectedResult"    : expected_result
        }

        testcasestep = rally.update('TestCaseStep', testcasestep_fields)
    print "Steps of TestCase %s updated\n" % testcase.FormattedID
except RallyRESTAPIError, details:
    sys.stderr.write('ERROR: %s \n\n' % details)

但是这会返回以下错误:An identifying field (Object or FormattedID) must be specified。 pyral / restapi.py的第991行引发了错误。

如何让它发挥作用?

1 个答案:

答案 0 :(得分:1)

我找到的解决方案是采用另一种方法并循环执行这些步骤,因此能够检索每一步的oid。

[2015年5月14日更新] :更好的方法是执行3个步骤:

  1. 更新现有测试步骤(如果有)
  2. 创建新的测试步骤(如果需要)
  3. 删除额外的测试步骤(如果需要)
  4. 程序应首先确定每个操作的步骤数。

    结果如下:

    TCid = "TC1394"
    #Generate random number of steps
    def generate_Steps():
        list_Steps=[]
        import random
        n_steps=random.randrange(1,15)
        for i in range(n_steps):
            Step={'StepIndex':i+1}
            Step['Input']="Step Input for step %d" % (i+1)
            Step['ExpectedResult']="Expected Result for step %d" % (i+1)
            list_Steps.append(Step)
        print "Using random list of %d Test Steps" % (n_steps)
        return list_Steps
    
    #Update steps
    def update_TestSteps(TCid, Steps):
        try:
            #Get number of existing steps
            testcase=rally.get('TestCase', query='FormattedID = %s' % TCid, instance=True)
            print "Updating steps for Test Case %s" % testcase.FormattedID
            list_steps=sorted(testcase.Steps, key=lambda step: step.StepIndex)
            #Calculate what to do on the steps (how many to update, create, or delete)
            nb_steps = { 'Rally':len(testcase.Steps), 'HTML':len(Steps) } 
            nb_steps['toUpdate'] = min(nb_steps['Rally'], nb_steps['HTML'])
            nb_steps['toCreate'] = nb_steps['HTML'] - nb_steps['toUpdate']
            nb_steps['toDelete'] = nb_steps['Rally'] - nb_steps['toUpdate']
    
            #Update content of existing steps with steps from test case
            for StepIndex in range(nb_steps['toUpdate']):
                step=list_steps[StepIndex]
                teststep_fields = Steps[StepIndex]
                (teststep_fields['TestCase'], teststep_fields['ObjectID']) = (testcase.ref, step.oid)
                teststep = rally.update('TestCaseStep', teststep_fields)
            #Create new test steps when required
            for StepIndex in range(nb_steps['toCreate']):
                teststep_fields = Steps[StepIndex+nb_steps['toUpdate']]
                teststep_fields['TestCase'] = testcase.ref
                teststep = rally.put('TestCaseStep', teststep_fields)
            #Delete extra test steps
            for StepIndex in range(nb_steps['toDelete']):
                step=list_steps[StepIndex+nb_steps['toUpdate']]
                rally.delete('TestCaseStep', step.oid)
    
            #Print message for end of test step update
            message="Updated test steps for TestCase %s" % testcase.FormattedID
            message+=" (steps created: {toCreate}, updated: {toUpdate}, deleted: {toDelete})".format(**nb_steps)
            print message
    
        except RallyRESTAPIError, details:
            sys.stderr.write('Rally Error during update of Test Step:  %s \n\n' % details)
    
    #Update random list of Steps
    update_TestSteps(TCid, generate_Steps())