nitkart
nitkart

Reputation: 147

Cannot create/update a Rally TestCaseResult with a reference to a specified TestSet

With Rally, I need to

Update a TestCaseResult with a new TestSet Ref.

OR

Create a new TestCaseResult by copying everything from a previous TestCaseResult and just changing the TestSet Ref.

I am trying to do the same through the Java REST toolkit from Rally. It uses the JSON REST API internally, it seems.

When I try to do this with CreateRequest or UpdateRequest, I get an error from the API "Could not set value for Test Set: null"

Is it not possible to update the TestSet of a TestCaseResult (whether existing or newly created)?

Here's some sample code I am using (showing create testcaseresult from existing by changing testset).

        //get testcaseresult object
        GetRequest tcrReq = new GetRequest("/testcaseresult/12345.js"); 
        tcrReq.setFetch(new Fetch("FormattedID", "Name"));
        GetResponse tcrResponse = restApi.get(tcrReq);

        //update testcaseresult object with new testset
        JsonObject tsRef = new JsonObject();
        tsRef.addProperty("_ref", "https://rally1.rallydev.com/slm/webservice/1.39/testset/1029348.js");
        tcrResponse.getObject().add("TestSet",tsRef);
        tcrResponse.getObject().remove("_ref");

        //Create API for new testcaseresult object
        CreateRequest createRequest = new CreateRequest("testcaseresult", tcrResponse.getObject());
        CreateResponse createResponse = restApi.create(createRequest);
        if(createResponse.wasSuccessful()){
            System.out.println(createResponse.getObject());
        }else{
            String[] ss = createResponse.getErrors();
            for(int i=0; i<ss.length; i++){
                System.out.println(ss[i]);
            }
        }

Can you please help to understand whether I am doing something wrong or is this a Rally limitation?

Upvotes: 3

Views: 1462

Answers (2)

user984832
user984832

Reputation:

I believe the reason that you are getting the "Could not set value for Test Set: null" error message is that there is an "invisible" constraint on TestCaseResults whereby the TestCase to which they are associated must be scheduled into the TestSet of interest, before the TestCaseResult can be assigned that TestSet as an attribute.

Unfortunately, there's no TestSet attribute on TestCases, so you have to query the TestCases collection off of the TestSet, and then loop through that collection to check and see if the parent TestCase is a member of that collection. Once verified that the TestCase is in that TestSet's collection of TestCases, then you can proceed to successfully update a member TestCaseResult with that TestSet attribute of interest. I tested the below and it works as expected.

Here's a code snippet illustrating how to accomplish this:

    // Create and configure a new instance of RallyRestApi
    // Connection parameters
    String rallyURL = "https://rally1.rallydev.com";
    String wsapiVersion = "1.38";
    String applicationName = "RestExample_UpdateTestSetOnTestCaseResult";

    // Credentials
    String userName = "[email protected]";
    String userPassword = "password";

    RallyRestApi restApi = new RallyRestApi(
            new URI(rallyURL),
            userName,
            userPassword);
    restApi.setWsapiVersion(wsapiVersion);
    restApi.setApplicationName(applicationName);

    // Ref to Test Case Result of Interest
    String testCaseResultRef = "/testcaseresult/1234567891.js";

    GetRequest testCaseResultRequest = new GetRequest(testCaseResultRef);
    GetResponse testCaseResultResponse = restApi.get(testCaseResultRequest);
    JsonObject testCaseResultObj = testCaseResultResponse.getObject();

    // Get the Test Case Result's Parent Test Case        
    JsonObject testCase = testCaseResultObj.get("TestCase").getAsJsonObject();

    String testCaseRef = testCase.get("_ref").getAsString();
    GetRequest testCaseRequest = new GetRequest(testCaseRef);
    GetResponse testCaseResponse = restApi.get(testCaseRequest);
    JsonObject testCaseObj = testCaseResponse.getObject();

    System.out.println(testCaseRef);

    // Ref to Test Set of Interest
    String testSetRef = "/TestSet/12345678910.js";

    // Get the Test Set of interest
    GetRequest testSetRequest = new GetRequest(testSetRef);
    GetResponse testSetResponse = restApi.get(testSetRequest);
    JsonObject testSetObject = testSetResponse.getObject();

    // Grab the Test Cases in this Test Set
    JsonArray testCasesInTestSet = testSetObject.get("TestCases").getAsJsonArray();

    // Loop through and see if our Test Case of interest is a member
    boolean testCaseIsInSet = false;
    for (int i=0; i<testCasesInTestSet.size(); i++) {
        JsonObject thisTestCase = testCasesInTestSet.get(i).getAsJsonObject();
        String thisTestCaseRef = thisTestCase.get("_ref").getAsString();

        if (thisTestCaseRef.equals(testCaseRef)) {
            testCaseIsInSet = true;
        }
    }

    if (testCaseIsInSet) {
        // Update Test Set on Existing Test Case Result
        try {            

            //Add Test Set
            System.out.println("\nUpdating Existing Test Case Result's Test Set attribute...");
            testCaseResultObj.addProperty("TestSet", testSetRef);

            UpdateRequest updateExistTestCaseResultRequest = new UpdateRequest(testCaseResultRef, testCaseResultObj);
            UpdateResponse updateExistTestCaseResultResponse = restApi.update(updateExistTestCaseResultRequest);

            if (updateExistTestCaseResultResponse.wasSuccessful()) {
                System.out.println("Updated Test Case Result with new Test Set");
                String[] updateExistTestCaseResultWarnings;

                updateExistTestCaseResultWarnings = updateExistTestCaseResultResponse.getWarnings();
                    System.out.println("Warning(s) occurred updating Test Case Result: ");
                for (int i=0; i<updateExistTestCaseResultWarnings.length;i++) {
                    System.out.println(updateExistTestCaseResultWarnings[i]);
                }

            } else {
                String[] updateExistTestCaseResultErrors;
                updateExistTestCaseResultErrors = updateExistTestCaseResultResponse.getErrors();
                    System.out.println("Error occurred updating Test Case Result: ");
                for (int i=0; i<updateExistTestCaseResultErrors.length;i++) {
                    System.out.println(updateExistTestCaseResultErrors[i]);
                }                   
            }
        } catch (Exception e) {
            System.out.println("Exception occurred while updating Tags on existing Test Case: ");
            e.printStackTrace();            
        }

        finally {
            //Release all resources
            restApi.close();
        }
    } else {
        System.out.println("Unable to Update Test Case Result with specified Test Set");
        System.out.println("Parent Test Case is not a member of this Test Set");
    }
}

Upvotes: 3

Kyle Morse
Kyle Morse

Reputation: 8410

When updating the TestSet you can just set the value as its ref- you don't need the wrapper object.

tcrResponse.getObject().add("TestSet", "/testset/1029348.js");

Upvotes: 0

Related Questions