2

Rally API の優れたオンライン ドキュメントのおかげで、テスト ステップの作成方法と欠陥/テスト ケースの更新方法を理解できました。

... での使用法に関して、同様の質問があり、回答されています。

しかし、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 行目でエラーが発生します。

それを機能させる方法は?

4

1 に答える 1

1

私が見つけた解決策は、別のアプローチを取り、ステップをループして、各ステップの oid を取得できるようにすることでした。

[2015 年 5 月 14 日更新] : より良いアプローチは、次の 3 つの手順を実行することです。

  1. 既存のテスト ステップの更新 (存在する場合)
  2. 新しいテスト ステップの作成 (必要な場合)
  3. 余分なテスト ステップの削除 (必要な場合)

プログラムは、最初に各操作のステップ数を識別します。


結果は次のようになります。

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())
于 2015-05-07T03:24:32.557 に答える