我正在使用Citrus Framework创建IT测试。我有两次调用服务器,一次用于创建用户,另一次用于对该用户执行某些操作。
问题:我需要创建用户请求中不是String的值,将其放入第二次调用的请求中。提取值:
new SoapActionBuilder()
.client(webServiceClient)
.receive()
.namespace("ns", MY_NAMESPACE)
.extractFromPayload("//ns:someId", "someId")
然后必须使用此 someId 来构建下一个请求。如果它是一个字符串,它将是:
request.setSomeId("${someId}");
但它很长,所以进行投射不起作用(Citrus稍后会解析该值,而Long#valueOf会在那一刻执行):
request.setSomeId(Long.valueOf("${someId}"));
有没有办法轻松转换该变量(可能在提取时)?
我设法用JavaAction来做,但是经常使用它是非常奇怪的(需要3行和一个新方法)。它类似于:
public void test() {
...
action(new JavaActionBuilder(new JavaAction().setInstance(this))
.method("setSomeId")
.methodArgs(request, "${someId}"));
...
}
public void setSomeId(Request request, String someId) {
request.setSomeId(Long.valueOf(someId));
}
答案 0 :(得分:0)
在TestDesigner中访问测试变量对象的最佳方法是在测试操作中执行此操作。 Citrus测试设计师有一个设计时间,可以构建完整的测试用例。稍后在运行时执行测试,并将XPath表达式计算为测试变量。所以你可以添加一个像这样的新测试动作:
action(new AbstractTestAction() {
@Override
public void doExecute(TestContext context) {
Long someId = Long.valueOf(context.getVariable("someId"));
// do something with someId
}
}
与此相反,您可以使用没有单独设计时间的Citrus TestRunner。但是,您必须访问Citrus TestContext才能将变量读取为long值。