Как я должен передать переменную, извлеченную из полезной нагрузки через тестовые классы?
Я использую 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. Как передать / вызвать переменную token в тестовых шагах 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);
1 ответ
В 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 всегда будет выбирать их и выполнять до запуска любого теста. Вам нужно только настроить это как bean-компонент внутри вашего контекста Citrus.
Хитрость заключается в том, чтобы установить глобальную переменную со значением извлеченной переменной, как в примере выше. После этого вы можете использовать эту переменную внутри любого теста:
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
,