将Citrus变量转换为Java变量

时间:2018-04-04 19:42:52

标签: java maven testng citrus-framework

我遇到了一个问题:我需要使用柑橘变量的值作为Java函数的参数。我试图用上下文和行为来做,但似乎没有任何效果。

import com.playtika.hof.mgs.config.Context;
import org.springframework.http.HttpStatus;
import com.consol.citrus.http.client.HttpClient;
import lombok.AllArgsConstructor;

@AllArgsConstructor
public class CreateSessionBehavior extends BaseBehavior {

private HttpClient httpClient;
private Long uid;
private String sidVar;
private Context appContext;

public void apply() {
    // Create Session ID
    http().client(httpClient).send()
            .post("/utils/hof/redis/sessions?uid=" + uid);

    http().client(httpClient).receive().response(HttpStatus.OK)
            .extractFromPayload("$.sid", sidVar).validationCallback((response, context) -> {
        appContext.addValue(sidVar, context.getVariable(sidVar));
    });

    echo("New session in variable " + sidVar + ": ${" + sidVar + "}");

    }
 }

这里我需要使用sidVar:

import com.playtika.hof.mgs.Kafkaproducer;
import com.playtika.hof.mgs.behavior.CreateSessionBehavior;
import com.playtika.hof.mgs.config.Context;
import org.testng.annotations.Test;
import com.consol.citrus.annotations.CitrusTest;
import com.playtika.hof.mgs.AbstractMGSTest;

@Test
public class TestPublishMessage extends AbstractMGSTest {

@CitrusTest(name = "Test Publish Message")

public void testPublishMessage() {

    description("Publish messages on Kafka");

    Context appContext = new Context();

    applyBehavior(new CreateSessionBehavior(testServer(), getValidUid(0),
            sessionName(0), appContext));

    String sessionId = appContext.getValue(sidVar);

  }
}

有没有办法返回sidVar变量,以便我可以在任何需要的地方使用它?

非常感谢。

1 个答案:

答案 0 :(得分:2)

Citrus将所有变量保存到对整个测试用例执行有效的公共测试上下文中。您可以将Citrus测试上下文作为测试方法参数注入您的实现:

public class TestContextInjectionIT extends JUnit4CitrusTestRunner {
    @Test
    @CitrusTest
    public void contextInjection(@CitrusResource TestContext context) {
        context.setVariable("message", "Hello, I am a variable!");

        echo("${message}");

        String message = context.getVariable("message");
        log.info(message);
    }
}

请注意我使用了测试运行器而不是测试设计器。这是因为跑步测试操作立即执行,因此测试上下文更改在操作执行后立即可见。

除此之外,所有测试操作都可以访问测试上下文。因此,您只需通过Java DSL添加自定义操作并访问测试上下文。

public class TestContextAccessIT extends JUnit4CitrusTestRunner {
    @Test
    @CitrusTest
    public void contextInjection() {
        variable("message", "Hello, I am a variable!");

        echo("${message}");

        run(new AbstractTestAction() {
            @Override
            public void doExecute(TestContext context) {
                String message = context.getVariable("message");
                log.info(message);
            }
        });      
    }
}