我应该如何通过测试 类 传递从有效负载中提取的变量?
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 变量 token?
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}");
不过我必须问一下,您使用的是哪个版本的 Citrus?建议您使用 TestNGCitrusTestRunner
而不是 TestNGCitrusTestDesigner
,因此 TestRunnerBeforeSuiteSupport
而不是 TestDesignerBeforeSuiteSupport
。
我正在使用 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 变量 token? 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}");
不过我必须问一下,您使用的是哪个版本的 Citrus?建议您使用 TestNGCitrusTestRunner
而不是 TestNGCitrusTestDesigner
,因此 TestRunnerBeforeSuiteSupport
而不是 TestDesignerBeforeSuiteSupport
。