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

我正在使用Citrus Framevork并有一些预测试步骤来获取auth-token,然后在整个测试计划中使用它。 并且在这种情况下不清楚地理解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中正常工作。 如何在nex测试步骤中传递/调用变量令牌GetClientIdIT.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}"); 

我必须问,你使用的是哪种版本的柑橘? 建议您使用TestNGCitrusTestRunner而不是TestNGCitrusTestDesigner ,因此使用TestRunnerBeforeSuiteSupport而不是TestDesignerBeforeSuiteSupport