You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何借助Cucumber、TestNG及Rest Assured自动更新Rally测试用例结果?

Absolutely! You can absolutely automate updating Rally test case results after running your Cucumber scripts with TestNG and Rest Assured. Here's a practical, step-by-step approach tailored to your tech stack:

Core Approach

The key idea is to leverage Cucumber's hooks (or TestNG listeners) to capture test pass/fail status after each scenario runs, then use Rest Assured to send requests to Rally's REST API to update the corresponding test case result. Rally's API lets you create TestResult objects linked directly to existing test cases, which updates their status in Rally.

Step 1: Gather Rally API Credentials & Test Case Details

First, collect the info you'll need to interact with Rally's API:

  • Rally API Key: Generate this from your Rally account settings (under "API Keys").
  • Workspace/Project OIDs: These are numeric IDs for your Rally workspace and project. You can find them in the URL when navigating to your project (e.g., https://rally1.rallydev.com/slm/.../project/123456 where 123456 is the project OID).
  • Rally Test Case IDs: For each Cucumber scenario, note the corresponding Rally test case ID (you'll map scenarios to these IDs via tags or a config file).

Step 2: Capture Cucumber Test Results with Hooks

Use Cucumber's @After hook to run code immediately after each scenario finishes. This hook can:

  1. Extract the linked Rally test case ID from scenario tags (e.g., @RallyTestCaseID=12345).
  2. Check if the scenario passed or failed.

Here's how to implement the hook:

import io.cucumber.java.After;
import io.cucumber.java.Scenario;
import io.restassured.RestAssured;
import static io.restassured.RestAssured.given;

public class RallyResultUpdateHooks {

    // Load these from a config file (e.g., properties) instead of hardcoding!
    private static final String RALLY_API_BASE = "https://rally1.rallydev.com/slm/webservice/v2.0";
    private static final String RALLY_API_KEY = "your-api-key-here";
    private static final String WORKSPACE_OID = "your-workspace-oid";
    private static final String PROJECT_OID = "your-project-oid";

    @After
    public void updateRallyTestResult(Scenario scenario) {
        // Extract Rally test case ID from scenario tags
        String rallyTestCaseId = scenario.getSourceTagNames().stream()
                .filter(tag -> tag.startsWith("@RallyTestCaseID="))
                .map(tag -> tag.split("=")[1])
                .findFirst()
                .orElse(null);

        if (rallyTestCaseId == null) {
            System.out.println("No Rally test case ID found for scenario: " + scenario.getName());
            return;
        }

        // Determine test verdict
        String verdict = scenario.isFailed() ? "Fail" : "Pass";

        // Send update request to Rally API (see Step 3 for details)
        sendRallyResultUpdate(rallyTestCaseId, verdict);
    }

    private void sendRallyResultUpdate(String testCaseId, String verdict) {
        // Step 3 logic goes here
    }
}

Step 3: Use Rest Assured to Call Rally API

Rally's API requires creating a TestResult object linked to your test case. Use Rest Assured to send a POST request with the necessary payload:

Add this implementation to the sendRallyResultUpdate method:

private void sendRallyResultUpdate(String testCaseId, String verdict) {
    String payload = String.format("""
            {
                "TestResult": {
                    "Verdict": "%s",
                    "TestCase": "/testcase/%s",
                    "Workspace": "/workspace/%s",
                    "Project": "/project/%s",
                    "Notes": "Automated test run via Cucumber + TestNG"
                }
            }""", verdict, testCaseId, WORKSPACE_OID, PROJECT_OID);

    RestAssured.baseURI = RALLY_API_BASE;
    given()
            .header("ZSESSIONID", RALLY_API_KEY)
            .header("Content-Type", "application/json")
            .body(payload)
            .when()
            .post("/testresult/create")
            .then()
            .statusCode(201); // 201 = Success (TestResult created)

    System.out.println("Updated Rally test case " + testCaseId + " with verdict: " + verdict);
}

Example Feature File with Tags

Map your Cucumber scenarios to Rally test cases using tags:

Feature: User Authentication Flow
  Scenario: Successful login with valid credentials
    @RallyTestCaseID=12345
    Given the user is on the login page
    When they enter valid username and password
    Then they are redirected to the dashboard

  Scenario: Login fails with invalid password
    @RallyTestCaseID=12346
    Given the user is on the login page
    When they enter valid username and invalid password
    Then an error message is displayed

Optional: Integrate with TestNG Listeners

If you're running Cucumber tests via TestNG, you can use TestNG's ITestListener instead (or alongside) Cucumber hooks. This is useful if you want to tie results to TestNG test methods instead of Cucumber scenarios:

import org.testng.ITestListener;
import org.testng.ITestResult;

public class RallyTestNGListener implements ITestListener {

    @Override
    public void onTestSuccess(ITestResult result) {
        updateRallyTestResult(result.getMethod().getMethodName(), "Pass");
    }

    @Override
    public void onTestFailure(ITestResult result) {
        updateRallyTestResult(result.getMethod().getMethodName(), "Fail");
    }

    private void updateRallyTestResult(String testMethodName, String verdict) {
        // Map test method name to Rally test case ID (e.g., via a properties file)
        String rallyTestCaseId = getRallyIdForTestMethod(testMethodName);
        // Reuse the same sendRallyResultUpdate method from Step 3
    }

    private String getRallyIdForTestMethod(String methodName) {
        // Implement mapping logic (e.g., load from application.properties)
        return "12345";
    }
}

Key Considerations

  • Security: Never hardcode API keys or credentials. Use environment variables or a config file (like application.properties) to store sensitive data.
  • Permissions: Ensure your Rally user has permission to create TestResult objects in the target project.
  • Rate Limiting: Rally enforces API rate limits. If you have many tests, add delays or batch requests if needed.
  • Error Handling: Add try/catch blocks around the API call to log failures (use a logging framework like SLF4J instead of System.out for production code).
  • Validation: Verify that the API request succeeds (check the status code and response body) before proceeding.

内容的提问来源于stack exchange,提问作者faisalr89

火山引擎 最新活动