我应该如何通过测试 类 传递从有效负载中提取的变量?

How should i pass variable extracted From Payload thru test classes?

我正在使用 Citrus Framevork 并且有一些预测试步骤来获取授权令牌,然后在整个测试计划中使用它。并且不清楚在这种情况下 TestContext 的用法以及如何访问 var。通过几个 testIT 类:

GetTokenIT.java:

        http()
                .client(HttpTqaClient)
                .receive()
                .response(HttpStatus.OK)
                .messageType(MessageType.JSON)
                .extractFromHeader("Authorization", "header_token")
                .extractFromPayload("$.id_token", "payload_token");

        action(new AbstractTestAction() {
                   @Override
                   public void doExecute(TestContext context) {
                       String token = context.getVariable("payload_token");
                       System.out.println("where is my token?" +token);

//Result: DEBUG port.LoggingReporter|where is my token?eyJhbGciOiJIUzUxMiJ9.

该部分仅在 GetTokenIT.class 中运行良好。 如何在接下来的测试步骤中 pass/call 变量 tokenGetClientIdIT.java:

     public class GetClientIdIT extends TestNGCitrusTestDesigner {
            @Autowired
            private HttpClient HttpTqaClient;
            @Test
            @Parameters("context")
            @CitrusTest(name = "GetClientId")
            public void testGet(@Optional @CitrusResource TestContext context)

//HOW TO CALL VARIABLE "TOKEN" HERE?

            System.out.println("where is my token?" +token);
     http()
                            .client(HttpTqaClient)
                            .send()
                            .get("/account/api/lk/lk-client/current")
                            .accept("application/json")
                            .contentType("application/json")
                            .header("Authorization", "${token}");
                    http()
                            .client(HttpTqaClient)
                            .receive()
                            .response(HttpStatus.OK)
                            .messageType(MessageType.JSON);

在 Citrus 中,您可以使用 TestDesignerBeforeSuiteSupport 在整个测试套件之前执行操作。像这样:

public class SetupAuthTokenBeforeSuite extends TestDesignerBeforeSuiteSupport {

    @Override
    public void beforeSuite(TestDesigner designer) {
        designer.echo("Setting up authentication token");

        designer.http()
                .client(HttpTqaClient)
                .send()
                ...

        designer.http()
                .client(HttpTqaClient)
                .receive()
                .response(HttpStatus.OK)
                .messageType(MessageType.JSON)
                .extractFromHeader("Authorization", "header_token")
                .extractFromPayload("$.id_token", "payload_token");

        designer.action(new AbstractTestAction() {
            @Override public void doExecute(TestContext testContext) {
                testContext.getGlobalVariables().put("global_auth_token", "${payload_token}");
            }
        });
    }
}

无论您 运行 测试套件中有多少测试或测试套件中有多少测试,Citrus 始终会选择并在任何测试 运行 之前执行。您只需要将其配置为 Citrus 上下文中的 bean。

诀窍是用提取变量的值设置一个全局变量,如上例所示。之后你可以像这样在任何测试中使用这个变量:

http()
     .client(HttpTqaClient)
     .send()
     .get("/account/api/lk/lk-client/current")
     .accept("application/json")
     .contentType("application/json")
     .header("Authorization", "${global_auth_token}");

不过我必须问一下,您使用的是哪个版本的 Citrus?建议您使用 TestNGCitrusTestRunner 而不是 TestNGCitrusTestDesigner,因此 TestRunnerBeforeSuiteSupport 而不是 TestDesignerBeforeSuiteSupport